scalaのプログラムをCircleCiを使ってs3にアップロードして、dockerで起動させる
scalaのプログラムをdockerで動かすために sbt-dockerとかありますが、今回はそれは使いません。
起動までの流れ
- CircleCi のテスト完了後に、ファイルをS3にアップロードする
- dockerはファイルにアップロードされたファイルを解凍して、起動する
単純に、CIでテストを回した後S3にjarをアップロードして dockerはアップロードされたjarを起動することにしてます。
CircleCi
AWS_ACCESS_KEY_ID
と AWS_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.env
に AWS_ACCESS_KEY_ID
と AWS_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を起動できるようにする