CodeBuildの標準イメージで、docker-composeが使えるようになっていました。
- Ubuntu : aws/codebuild/standard/2.0
- Amazon Linux 2 : aws/codebuild/standard/amazonlinux2-x86_64-standard:1.0
でそれぞれ使えそうです(リンク先はGitHub上のDockerfile)。
これまでは、MySQLやRedisなどが絡んだテストを実行したい場合、ビルドのフェーズ内でパッケージをインストールする or 独自のイメージを用意する等の対応が必要でした(よね?)。
今では、日常的な開発環境構築に利用する docker-compose.yml
をそのまま使って docker-compose up -d
するだけで、使い捨てのビルド環境が構築できるということですね。
試してみて気づいた細かい注意点などをメモしておきます。
UbuntuとAmazon 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
を指定する必要があります。
未指定の場合、以下のようなエラーが発生します。
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回目以降のビルドがさらに短縮できることが期待できます。
JavaでGradleを使っている場合は、
cache: paths: - '/root/.gradle/**/*'
と指定しておけばOKだと思います。
ちなみに、ローカルキャッシュに関するサイズの上限や有効期間については、AWSドキュメント上では言及がありません。キャッシュがあってもなくても、ビルドが安定するような作りにしておくことが大切ですね。
あとは、Docker18.09.0からサポートされたBuildKitなどを有効化してみるのも効果があると思います。