AWS CodeBuildのビルド環境であれこれする


最近質の下がってきた記事に一役買うために、クソ記事を投稿。
CodeBuildの中でJSTを扱おうとして困ったので、いろいろ調べているうちにいろいろカスタマイズできることがわかったので備忘録。

CodeBuild

AWS CodeBuildはフルマネージドなビルドサービスで、ビルドサーバーのプロビジョニング、管理、スケーリングが不要。ある程度構築された(dockerなど)ビルド用のイメージを使用して、その中にソースコードをチェックアウトして、すぐにビルド環境を作ることができる。基本的に buildspec.yml (ファイル名は指定可能)で、ビルド用イメージのカスタマイズなどが行える。
CircleCIの circle.yml と同じようにLinux上でのコマンドでできることは大体できる。(baseのイメージがubuntuなので)CircleCIほどUIなどは高機能ではないが、簡単なことなら楽に実現できる。

カスタマイズする

まず、ビルドで利用するDockerイメージを選択する。デフォルトで選択できる、それぞれのDockerイメージのDockerfileは、こちらで公開されている(このDockerイメージもCodeBuildでビルドされるようだ)。これらのイメージはdocker hubにも公開されているため、手軽に同じ環境を使用できる。また、他の場所からイメージをPullしてきて使うこともできる。
イメージのカスタマイズはbuildspecについてのリファレンスを見るとわかるが、ビルドは各段階に分かれている、それぞれの段階で、Linuxのコマンドや、aws cliのコマンドを実行することができるので、buildspeckにコマンドを記載するだけで、様々なカスタマイズが行える。

今回の例では、Githubからソースコードをチェックアウトして、 docker build を行い、ECRにイメージをPushする。buildしたイメージにJSTの日時でタグを打つのだが、ビルド環境ではUTCなため、JSTの環境にしてからタグを付けるようにした。

buildspeck.yml
version: 0.2

phases:
  pre_build:
    commands:
      - echo Logging in to Amazon ECR...
      - $(aws ecr get-login --no-include-email --region $AWS_DEFAULT_REGION)
      - echo Prepare JST locale
      - apt-get install -y tzdata
      - ln -sf /usr/share/zoneinfo/Asia/Tokyo /etc/localtime
      - export TAG=`date "+%Y%m%d-%H%M"`
      - echo Prepare tag $TAG
  build:
    commands:
      - echo Build started on `date`
      - echo Building the Docker image...
      - docker build -t $IMAGE_REPO_NAME:$TAG .
      - docker tag $IMAGE_REPO_NAME:$TAG $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG
  post_build:
    commands:
      - echo Build completed on `date`
      - echo Pushing the Docker image...
      - docker push $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG
      - echo Writing image definitions file...
      - printf '[{"name":"marquee","imageUri":"%s"}]' $AWS_ACCOUNT_ID.dkr.ecr.$AWS_DEFAULT_REGION.amazonaws.com/$IMAGE_REPO_NAME:$TAG > imagedefinitions.json
artifacts:
    files: imagedefinitions.json

Source buildspec.yml

その他のカスタマイズ

以下のGithub検索で、いろいろ見つかるかもしれない
https://github.com/search?q=filename%3A%7Bbuildspec.yml%7D&type=Code