CodeBuildでdocker-composeを立ててpytestを実施する
ユニットテストは書いているけど CI で回せていなかったので、ビルド時にユニットテストを実行する設定しました。
環境¶
- ビルドは Chalice を使って書いたコード
- パッケージ管理は pipenv
- Lambda のランタイムは Python3.9
- pytest でテスト
- データベースとの接続部分は docker でテスト用の DB サーバを立てている
ディレクトリ構造¶
.
├── Pipfile
├── Pipfile.lock
├── app.py
├── buildspec.yaml
├── chalicelib
├── docker-compose.yml
├── pytest.ini
└── tests
buildspec.yaml¶
version: 0.2
phases:
install:
runtime-versions:
python: 3.9
commands:
- export LANG=ja_JP.utf8 # warning が出てたので設定したけどなくてもよい
- pipenv sync --dev
pre_build:
commands:
- export VENV_HOME_DIR=$(pipenv --venv)
- . $VENV_HOME_DIR/bin/activate
- docker-compose up -d
build:
commands:
- python3 -m pytest tests
on-failure: ABORT
artifacts:
files:
- "**/*"
つまずいた点¶
docker-compose up -d
でエラーになる¶
原因¶
コマンド実行権限がないため。CodeBuild の作成時の設定ミスです。
解決策¶
CodeBuild 設定の環境
で特権付与
にチェックします。
docker-compose 時に too many requests
が発生した¶
原因¶
Docker Hub の制限のため。
Step 1/2 : FROM postgres:13.3 toomanyrequests: You have reached your pull rate limit. You may increase the limit by authenticating and upgrading: https://www.docker.com/increase-rate-limit Service 'postgresql' failed to build : Build failed
classmethod さんの記事“Too Many Requests.” でビルドが失敗する…。AWS CodeBuild で IP ガチャを回避するために Docker Hub ログインしよう!という話が参考になります。
解決策¶
Amazon ECR Public Galleryからイメージを pull するように変更します。
ただし、以下の制限があるようです。あまり気になりませんが、注意しておきましょう。 https://aws.amazon.com/jp/blogs/news/docker-official-images-now-available-on-amazon-elastic-container-registry-public/
Amazon ECR Public から任意の AWS リージョンにイメージをプルするお客様は、事実上無制限にダウンロードできます。AWS 外で動作するワークロードについて、AWS 上で認証されていないユーザーは毎月 500 GB のデータダウンロードが可能です。さらにデータをダウンロードしたい場合は、AWS アカウントにサインアップまたはサインインすることで、毎月 5 TB までのデータをダウンロードすることができ、その後は 1 GB あたり 0.09 ドルの料金が掛かります。