scalaのプログラムをCircleCiを使ってs3にアップロードして、dockerで起動させる

scalaのプログラムをdockerで動かすために sbt-dockerとかありますが、今回はそれは使いません。

起動までの流れ

  • CircleCi のテスト完了後に、ファイルをS3にアップロードする
  • dockerはファイルにアップロードされたファイルを解凍して、起動する

単純に、CIでテストを回した後S3にjarをアップロードして dockerはアップロードされたjarを起動することにしてます。

CircleCi

AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEYはCircleCi側でポチポチっと設定しました。
circle.ymlの内容は、以下の通りです。

machine:
  timezone:
    Asia/Tokyo
  java:
    version: oraclejdk8
dependencies:
  # project/build.propertiesを見てくれる
  #pre:
  #  - wget -q https://dl.bintray.com/sbt/debian/sbt-0.13.8.deb
  #  - sudo dpkg -i sbt-0.13.8.deb
  cache_directories:
    # デフォルトでキャッシュされる
    # - "~/.ivy2"
    # bootにインストールされたパッケージが入る
    - "~/.sbt/boot"
  override:
   # aws cliをinstall
    - sudo pip install awscli
    - sbt update
  post:
    # aws cliの設定 
    - aws configure set region ap-northeast-1
test:
  override:
    # カバレッジを出力
    - sbt clean coverage test coverageReport coverageAggregate
  post:
    # カバレッジのレポートをCircleCiで見れるようにする
    - cp -R ~/play-deploy/target/scala-2.10/scoverage-report/ $CIRCLE_ARTIFACTS
deployment:
  production:
    branch: master
    commands:
      # zipにまとめる
      - sbt universal:packageBin
      # s3へ
      - aws s3 cp ~/play-deploy/target/universal/dilaton-web-0.0.1.zip s3://play-deploy/play-deploy-0.0.1.zip

Dockerfile

TimeZoneを設定したり、aws-cliをインストールしたりしてます。
build時には、s3からjarのzipをダウンロードはしてません。

FROM centos:centos6
MAINTAINER oomatomo ooma0301@gmail.com

RUN rpm -Uhv http://dl.fedoraproject.org/pub/epel/6/x86_64/epel-release-6-8.noarch.rpm
RUN yum update -y
# timezone
ENV TZ JST-9

# java
RUN yum install -y wget tar java-1.8.0-openjdk java-1.8.0-openjdk-devel

# aws cli
RUN yum install -y python-pip
RUN pip install awscli
ENV AWS_DEFAULT_REGION ap-northeast-1
ENV AWS_DEFAULT_OUTPUT json

# deploy
RUN yum install -y unzip
COPY deploy.sh ~/

EXPOSE 9000
CMD ["~/deploy.sh"]

deploy.sh

デプロイ用のスクリプトです。 ここで、s3からjarのzipダウンロードしてます。

#! /bin/bash
env
aws s3 cp s3://play-deploy/play-deploy-0.0.1.zip ~/play-deploy-0.0.1.zip
unzip -o ~/play-deploy-0.0.1.zip -d /usr/local/bin/
/usr/local/bin/play-deploy-0.0.1/bin/play -Dfile.encoding=UTF-8

docker-compose.yml

.play.envAWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY を設定しています。
build時に環境変数を渡したかったのですが、できなかったのでrunの時にenv_fileを使ってawsのアクセスキーを渡してます。
docker-composeがversion2になってargsが対応されてましたが、env_fileみたいに使えません。
そのため、直接 docker-compose.yml に書かなければいけないので諦めました。

https://docs.docker.com/compose/compose-file/#args

play:
  build: ./play
  env_file: ~/.play.env
  ports:
    - "9000:9000"

まとめ

とりあえず、動いた。。 でも、仕事では使えないな〜〜。

TODO

gitのtagベースでjarファイルやdockerを起動できるようにする