こんにちは、東京オフィスで働くエンジニアの @hanhan1978 です。
早速ですが、CircleCIのバージョン1.0が 2018年8月31日で終了することはご存知でしょうか?
CircleCI 1.0 End of Life on August 31, 2018
1.0と2.0では根本的に仕組みが異なるため、両方を同時にメンテナンスしていくのは難しいようですね。 弊社においても、バージョン1.0を利用しているアプリケーションが多数存在するため、2.0化を推し進めている最中です。
CircleCI2.0の簡単なおさらい
CircleCI2.0にはworkflow
という概念があり、workflow
の各job
においてビルドやデプロイを行います。
出典 : Introducing Workflows on CircleCI 2.0 - CircleCI
図における一つ一つのjob
では、Dockerコンテナをビルド用の環境として利用することが出来ます。
仕組みとしては単純でかつ設定ファイルも書きやすいため、既存の circle.yml
を.circleci/config.yml
に書き換えていけば良いのですが、S3経由のCodeDeployを利用している場合、少し困ることがあります。
CircleCI2.0にはCodeDeploy専用の仕組みは用意されていない
CIrcleCI1.0にはcodedeploy
という便利なタスクブロックがあり、circle.yml
に設定を記述するだけで簡単にS3&CodeDeployを使ったリリースが行えます。
しかし、CircleCI2.0にはCodeDeploy専用の仕組みは用意されていないため、awscli
が利用できるコンテナを使って以下の3つの処理をデプロイ時に行う必要があります。
aws deploy push
ビルドしたイメージ(zip等)をS3にpushしてeTagを取得aws deploy create-deployment
CodeDeployへのデプロイの指示aws deploy wait
デプロイが正常に完了するまで待機
この3つの処理は、コマンド実行後の戻り値などを利用する都合上 .circleci/config.yml
で表現するのは難しいです。
そのため、処理をまとめたシェルスクリプトを作って実行するのですが、各プロジェクトでオレオレスクリプトが作られてしまうと管理が大変ですし、不具合の温床になってしまいます。
なるべくインターフェースも簡素にして統一したいということで、S3経由のCodeDeploy専用のコンテナを作ってみました。
CircleCI2.0でS3経由のCodeDeployを行うコンテナの使い方
CircleCI2.0の設定ファイル config.yml
に下記のようにdeploy
のJobを定義して下さい。
jobs: deploy: working_directory: ~/repo environment: - AWS_DEFAULT_REGION: ap-northeast-1 - CODE_DEPLOY_S3_BUCKET_NAME: xxxx-deploy - CODE_DEPLOY_APPLICATION_NAME: xxxxxxx - CODE_DEPLOY_GROUP_NAME: xxxxxx - APP_DIR: . docker: - image: innovatorjapan/awscli:latest steps: - attach_workspace: at: . - run: sh /bin/aws-s3-deploy
定義する必要のある環境変数は5つです。
-
AWS_DEFAULT_REGION
デプロイを行うAWSのリージョン -
CODE_DEPLOY_S3_BUCKET_NAME
CodeDeployに設定済みのS3のbucket名 -
CODE_DEPLOY_APPLICATION_NAME
CodeDeployのApplication名 -
CODE_DEPLOY_GROUP_NAME
CodeDeployのDeploy Group名 -
APP_DIR
リリース対象のディレクトリ(appspec.yml
が入っているディレクトリ)
CircleCI1.0の時のcodedeploy
ブロックと設定項目はほぼ同じです。
リリースに使用するイメージは innovatorjapan/awscli
、弊社管理のコンテナです。
最後に /bin/aws-s3-deploy
を実行して下さい。上で説明した3つの処理を順次実行してデプロイしてくれます。
ソースコードは下記のリポジトリに全て入っておりますので、是非中身を確認した上で、安心してお使い頂ければと思います。
- Dockerfile、及びソースコード GitHub - innovator-japan/awscli: awscli container for CircleCI 2.0
- DockerHub innovatorjapn/awscli - DockerHub
作成した経緯
CircleCI2.0で利用できる awscli
のコンテナは多数存在するのですが、Dockerfile
が公開されていなかったり、S3のCodeDeploy専用に作られた物が見つからなかったりしたので、それじゃ作るかということで作成しました。
自分自身、Dockerfileが公開されていないコンテナイメージを利用するのが嫌なので、DockerHubでリポジトリをリンクして確認できるようにしてあります。
そもそも、CodeDeployを利用すること自体が、CircleCI2.0の利用シーンとはちょっと異なるかなという気はありますが、まだしばらくはコンテナ化されてないアプリケーションの運用・保守は発生するので、CircleCI1.0 -> 2.0化をスムーズに実施できたらなと思っています。
弊社において今後、利用&メンテナンスしていきますので、同じようにCircleCI2.0化で困っている方は、是非お試しください。