CodeBuildの標準イメージ(マネージド)上でdocker-composeを使ってRDBやRedisを利用する

CodeBuildの標準イメージで、docker-composeが使えるようになっていました。

docs.aws.amazon.com

でそれぞれ使えそうです(リンク先はGitHub上のDockerfile)。

これまでは、MySQLやRedisなどが絡んだテストを実行したい場合、ビルドのフェーズ内でパッケージをインストールする or 独自のイメージを用意する等の対応が必要でした(よね?)。
今では、日常的な開発環境構築に利用する docker-compose.yml をそのまま使って docker-compose up -d するだけで、使い捨てのビルド環境が構築できるということですね。

試してみて気づいた細かい注意点などをメモしておきます。

UbuntuAmazon Linuxの違い

次に挙げるように、パッケージマネージャやJavaのランタイムの指定の違いがあり、共通の buildspec.yml でどちらのOSにも対応するのはちょっと難しいかもしれません。
もっとも、どちらかのOSに対応していればほとんどのケースでは十分だと思いますが…。

パッケージインストール用のコマンド

CodeBuildの buildspec.yml を書く上では、パッケージマネージャが異なることは気をつける必要があります。

Ubuntu の場合は apt / apt-get, Amazon Linux の場合は yum を利用します。

runtime-versions で指定できるjavaの種類

aws/codebuild/standard:2.0 を使っている場合、 buildspec.yml 中で runtime-versions を指定する必要があります。

docs.aws.amazon.com

未指定の場合、以下のようなエラーが発生します。

YAML_FILE_ERROR Message: This build image requires selecting at least one runtime version.

例えば、ランタイムにJavaを使いたい場合は、以下のように指定します。

phases:
  install:
    runtime-versions:
      docker: 18
      java: openjdk8

ここで指定できるJavaの値ですが、OSによって次のような違いがあるみたいです(correttoはAWSの OpenJDKディストリビューションですね)

OS 指定可能な値
Ubuntu openjdk8, openjdk11
Amazon Linux corretto8, corretto11

coretto の指定について、(この記事を書いている時点で)日本語のドキュメントには書かれていませんが、英語のドキュメントには書かれています。

Runtime Versions in Buildspec File Sample for CodeBuild - AWS CodeBuild

高速化のためのローカルキャッシュの利用

ビルド時間の短縮は常に重要な関心事です。素直に作ったビルドジョブにおいては、ビルドの時間を大きく占めるのが、Docker イメージや依存関係のあるライブラリのダウンロードでしょう。
2017年の末頃からS3上へのキャッシュはサポートされていましたが、今ではローカルキャッシュも利用できます。ネットワーク越しでないため、2回目以降のビルドがさらに短縮できることが期待できます。

docs.aws.amazon.com

JavaでGradleを使っている場合は、

cache:
  paths:
    - '/root/.gradle/**/*'

と指定しておけばOKだと思います。
ちなみに、ローカルキャッシュに関するサイズの上限や有効期間については、AWSドキュメント上では言及がありません。キャッシュがあってもなくても、ビルドが安定するような作りにしておくことが大切ですね。

あとは、Docker18.09.0からサポートされたBuildKitなどを有効化してみるのも効果があると思います。