コンテンツにスキップ

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 ドルの料金が掛かります。