CodeBuild & ECSで、ヘルスチェックでGitのコミットハッシュを返すように環境変数を渡す

これを見て以来、実際やりたいと思っていたがやるチャンスがあったのでやってみた。

特に開発環境だと、複数のブランチが同じ場所にデプロイされることがあったり、デプロイ中で、いつ切り替わったのか知るために、いまGitHub上でいうどのリビジョンが実環境に上がっているかを端的に知りたいときがある。

今回やったのは、AWSのCodeBuildで、ECSにデプロイするウェブアプリケーション

アプリのほうは、ヘルスチェックのパスに対してアクセスすると、GIT_COMMIT_HASHみたいな環境変数が定義されていたらそれを文字列で返すように実装する。 こちらは特に難しい部分がないので説明は割愛。

CodeBuild側の設定で妙にハマってしまったのでメモを残しておく。

dev.classmethod.jp

最初、上記の記事を見つけたので楽勝じゃんと思って設定してみたがうまくいかなかった。記事中の例はどこからソースコードをフェッチしてきているか言及がないが、GitHubの場合は取得したソースには.gitは無いため、gitコマンドは使えないといってエラーになる。

そこでAWSのドキュメントを改めて見てみた。

docs.aws.amazon.com

CodeBuildでGitHubからウェブフックしてきたとき、GitのコミットIDが入っている環境変数がある。 CODEBUILD_RESOLVED_SOURCE_VERSIONがそれにあたる。 似たような名前のものとして CODEBUILD_SOURCE_VERSIONもあるが実際にログに出してみたところ、こちらはアーティファクトのARNの値が入っていた。

CODEBUILD_RESOLVED_SOURCE_VERSIONの変数をDockerfile内で直接参照できるかと思ったら、それはできなかった。

そこでこの変数をbuildspec.ymlでdocker build時に--build-argの引数として渡す。

build:
    commands:
    - docker build --build-arg CODEBUILD_COMMIT_HASH=$CODEBUILD_RESOLVED_SOURCE_VERSION -t $IMAGE .

それをDockerfile内でARGで一旦受けて、ENVに格納する。これでコンテナイメージの中に $GIT_COMMIT_HASH 環境変数が格納された。

ARG CODEBUILD_COMMIT_HASH
ENV GIT_COMMIT_HASH $CODEBUILD_COMMIT_HASH