CircleCI2.0でS3経由のCodeDeployを行うためのコンテナを作りました

こんにちは、東京オフィスで働くエンジニアの @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においてビルドやデプロイを行います。

f:id:hanhan1978:20180413132024p:plain 出典 : 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つの処理をデプロイ時に行う必要があります。

  1. aws deploy push ビルドしたイメージ(zip等)をS3にpushしてeTagを取得
  2. aws deploy create-deployment CodeDeployへのデプロイの指示
  3. aws deploy wait デプロイが正常に完了するまで待機

f:id:hanhan1978:20180413154458j:plain

この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つの処理を順次実行してデプロイしてくれます。

ソースコードは下記のリポジトリに全て入っておりますので、是非中身を確認した上で、安心してお使い頂ければと思います。

作成した経緯

CircleCI2.0で利用できる awscliのコンテナは多数存在するのですが、Dockerfileが公開されていなかったり、S3のCodeDeploy専用に作られた物が見つからなかったりしたので、それじゃ作るかということで作成しました。

自分自身、Dockerfileが公開されていないコンテナイメージを利用するのが嫌なので、DockerHubでリポジトリをリンクして確認できるようにしてあります。

そもそも、CodeDeployを利用すること自体が、CircleCI2.0の利用シーンとはちょっと異なるかなという気はありますが、まだしばらくはコンテナ化されてないアプリケーションの運用・保守は発生するので、CircleCI1.0 -> 2.0化をスムーズに実施できたらなと思っています。

弊社において今後、利用&メンテナンスしていきますので、同じようにCircleCI2.0化で困っている方は、是非お試しください。