0
0

AWS CodeBuild でローカルビルドを通すようにした

Last updated at Posted at 2024-04-30

TL;DR

ひとまずこれで疎通できるようなイメージを作り、ビルダーイメージを差し替えてビルドする。
根本解決はAmazon様のcodebuild/local-buildsのイメージ更新待ち。

Dockerfile
FROM public.ecr.aws/codebuild/local-builds:latest

RUN <<EOT
  for file in '/LocalBuild/agent-resources/docker-compose.yml' '/LocalBuild/agent-resources/docker-compose-mount-src-dir.yml'
  do
    sed -i -e "s/^version: '2'/version: '3'/" ${file}
    sed -i -e "s/BMR:3000/agent:3000/g" ${file}
    sed -i -e "/links:/d" ${file}
    sed -i -e "/agent:BMR/d" ${file}
  done
EOT

実行コマンドはこの通り

# Dockerfile があるディレクトリで実行する
docker build -t local-builds-v3:latest .
# buildspec.yml があるディレクトリで実行する
./codebuild_build.sh -i public.ecr.aws/codebuild/amazonlinux2-x86_64-standard:5.0 -a artifact -l local-builds-v3:latest

参考URL: CodeBuildのローカルビルド実行時の「ERROR: client version 1.22 is too old.… 」への対処方法

問題

CodeBuildのAWSドキュメントに例示されたコマンドとスクリプトが正常に動作しない。
以下のようなエラーが出力されて実行できない。

ERROR: client version 1.22 is too old. Minimum supported API version is 1.24, please upgrade your client to a newer version

環境

OS: Arch Linux
Client:
 Version:           26.1.0
 API version:       1.44 (downgraded from 1.45)
 Go version:        go1.22.2
 Git commit:        9714adc6c7
 Built:             Tue Apr 23 07:59:02 2024
 OS/Arch:           linux/amd64
 Context:           desktop-linux

Server: Docker Desktop 4.28.0 (139021)
 Engine:
  Version:          25.0.3
  API version:      1.44 (minimum version 1.24)
  Go version:       go1.21.6
  Git commit:       f417435
  Built:            Tue Feb  6 21:14:25 2024
  OS/Arch:          linux/amd64
  Experimental:     false
 containerd:
  Version:          1.6.28
  GitCommit:        ae07eda36dd25f8a1b98dfbf587313b99c0190bb
 runc:
  Version:          1.1.12
  GitCommit:        v1.1.12-0-g51d5e94
 docker-init:
  Version:          0.19.0
  GitCommit:        de40ad0

Docker Compose version 2.27.0

Client APIバージョンは1.44なので、ローカルのDockerを利用してローカルのdocker-compose.ymlを処理する分には正常に動く。

原因

./codebuild_build.shがDocker in Docker環境を作成して、ホストのDocker Engineを使って、古いdocker-compose.ymlを実行しているため。
old_build_image.png

こんな感じで中身を見て docker-compose.yml の定義が古いことを確認。

docker run --entrypoint /bin/bash -it --rm public.ecr.aws/codebuild/local-builds

よく使われるこれだと entrypoint が書き変わらずうまくシェルを呼び出せなかった。(

docker run -it --rm public.ecr.aws/codebuild/local-builds /bin/bash

大きな原因としてはversionが古いことと、services.hoge.linksが正常に動作せず名前解決ができていないことだったため、その部分を修正したブログ記事を参考に修正した。

new_build_image.png

成果物

FROM public.ecr.aws/codebuild/local-builds:latest

RUN <<EOT
  for file in '/LocalBuild/agent-resources/docker-compose.yml' '/LocalBuild/agent-resources/docker-compose-mount-src-dir.yml'
  do
    sed -i -e "s/^version: '2'/version: '3'/" ${file}
    sed -i -e "s/BMR:3000/agent:3000/g" ${file}
    sed -i -e "/links:/d" ${file}
    sed -i -e "/agent:BMR/d" ${file}
  done
EOT
  • version: '2'version: '3'に(最近はversion指定いらなくなったらしいね?)
  • links: "agent:BMR"としてエイリアスを張っていた部分を削除、サービスのホスト名で通信するように修正
# Dockerfile があるディレクトリで実行する
docker build -t local-builds-v3:latest .
# buildspec.yml があるディレクトリで実行する
./codebuild_build.sh -i public.ecr.aws/codebuild/amazonlinux2-x86_64-standard:5.0 -a artifact -l local-builds-v3:latest

./codebuild_build.sh の解説

  • -i: ビルド環境のイメージ。CodeBuildのイメージと同じものを指定する
  • -a: 出力ディレクトリ。ビルド結果がzipアーカイブとなって出力される
  • -l: docker-composeなどを環境によって変化させるコマンド用のイメージ。何も指定されないとpublic.ecr.aws/codebuild/local-buildsが指定される

感想

ローカルで動作しなくなるイメージをツールチェインに入れるのは怖いなというおはなし。
ちゃんとメンテしよう。

参考URL

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0