こんにちは、東京オフィスで働くエンジニアの @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-deploymentCodeDeployへのデプロイの指示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_NAMECodeDeployに設定済みのS3のbucket名 -
CODE_DEPLOY_APPLICATION_NAMECodeDeployのApplication名 -
CODE_DEPLOY_GROUP_NAMECodeDeployの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化で困っている方は、是非お試しください。