S3 をプロバイダーにした CI で Django のユニットテストを実行してみたのでメモ

以前の記事で backlog に push したのをトリガーにソースコードを S3 に配置するところまでやってみたのでその続きとして CI を設定した時のメモです。

前提

  • ソースコードを管理する S3 バケットが作成されている事。

処理の流れ

  1. S3 にコードが配置される。
  2. コードパイプラインが実行される。
  3. コードパイプラインのステージ「コードビルド」が実行される。
  4. コードビルドで buildspec.yml が実行される。
  5. buildspec.yml でコンテナが作成され django の unit テストを実行される。

ビルドプロジェクトを作成する

  1. ビルドプロジェクトのページを開き「プロジェクトの作成」をクリックする。
  2. 下記の通り設定する。

 S3 バケット hogehoge-bucket の直下にソースコードの圧縮ファイル hoge.zip が配置される想定。

イメージは最新のを選択しています。すでにロールを作成している場合は既存のサービスロールを選択する。

  1. 「ビルドプロジェクトを作成する」をクリックする。

パイプラインを作成する

  1. パイプラインのページを開き「パイプラインを作成する」をクリックする。
  2. 下記の通り設定する。 すでにロールを作成している場合は既存のサービスロールを選択する。

コードビルドで設定したバケット名と S3 オブジェクトキー名入力する。

プロジェクト名は、先ほど作成したコードビルドを入力する。

今回は、デプロイしないので「導入段階をスキップ」をクリックする。 (後からでも追加可能です。) 

  1. 「パイプラインを作成する」をクリックする。

buildspec.yml を作成する

下記のような buildspec.yml をソースコードのリポジトリのルートに配置します。
環境は docker-compose.ci.yml というファイルを使っておこなっている例です。

version: 0.2

phases:
  pre_build:
    commands:
      - echo Grant Privilages To MySql User
      - docker-compose -f docker-compose.ci.yml up -d
      - docker ps
      - docker exec -t db_ci_container mysql -uroot -proot_password -e"GRANT ALL PRIVILEGES ON test_database.*to 'user_name';"
  build:
    commands:
      - echo Execute Tests
      - docker exec web_ci_container python3.8 /project/backend/manage.py test
  post_build:
    commands:
      - docker-compose logs
      - echo Done

実行する

clone してきたソースコードのリポジトリに buildspec.yml を加えたら、リポジトリに入って ZIP します。

zip -r test.zip ./*

対象の s3 に ZIP したコードを入れたら無事テストが実行されました。