日々是クラウド

AWSで色々やってみるブログ

CodePipelineとPytestで自動テスト

別にPythonじゃなくてCでもC++でもいいんだけど、機械学習屋さんとしてはPythonに慣れ親しんでいるので、その例でトライ。 HelloWorldで書いても良かったけど、せっかくなのでgit pushすると、自動でPytestが動くようなもの。

CodeCommitとPytestとbuildファイルの準備

手元のgit環境の準備

CodeCommitにリポジトリを作成して、自在にgit clone, git pushできる環境を作っておく。 EC2にIAMロールを設定してやるのが一番シンプル。

適切なPythonコードの準備

ディレクトリ構成はこんな感じ。今回はtest_1.pyじゃなくて、test_str.pyという名前にする。
f:id:yohei_ok:20210219130901p:plain

test_str.pyは、すごく簡単なテストを置く。

def test_str():
    assert 'a' == 'a'
    assert 'b' == 'b'

buildspec.yamlファイルの準備

こんなファイルを準備。

version: 0.2
 
phases:
  install:
    runtime-versions:
      python: 3.8
    commands:
      - pip3 install pytest
  build:
    commands:
      - echo test
      - pytest --junit-xml=reports/unittest_results.xml

reports:
  pytest_reports:
    files:
      - unittest_results.xml
    base-directory: reports
    file-format: JUNITXML
  • python3.8を使いますという宣言
  • テストをしたいのでpytestをインストール
  • pytestコマンドの実行 オプションとして、レポートファイルを出力

ちなみにpytestはフォーマットに従っていれば、ディレクトリなどを指定しなくても自動でテストファイルを探してテストしてくれる。 buildspec.yamlは下記のようなディレクトリ構成位置に置く。
f:id:yohei_ok:20210219130728p:plain

CodeBuildの準備

ビルドプロジェクトの作成

マネジメントコンソールから、下記の設定で作っていく。

  • プロジェクト名:任意
  • ソース:CodeCommit
  • リポジトリ:既に作ってあるリポジトリ
  • ビルド対象のブランチ:今回はmaster

f:id:yohei_ok:20210219114526p:plain

環境についてはpython機械学習ならUbuntuを選んでおくと良い気がする。確信はない。
(本来は環境がちゃんと用意されたDockerイメージを用意したほうが良いと思う。それは今度勉強する予定。)
ランタイムはStandardでとりあえず動く。 f:id:yohei_ok:20210219114941p:plain

Buildspecは前項で作ったファイルを使うので、buildspecファイルを使用する。を選択。 これでビルドプロジェクトを作成。

CodePipelineの準備

プロジェクト名を任意で付与して作る。

ソースステージ

ビルドステージ

  • プロバイダー:AWS CodeBuild
  • リージョン:アジア・パシフィック(東京)
  • プロジェクト名:CodeBuildの準備で作成したプロジェクト名 残りはデフォルト。 f:id:yohei_ok:20210219125530p:plain

デプロイステージ

今回は自動テストまでをスコープとするので、導入段階をスキップをクリック。 以上でパイプラインを作成できる。

自動テスト

恐らくパイプラインを作っただけで、1回目のパイプラインが流れる、と思う。 テストはエラーが起きないようなテストなので、成功するはず。

以降、コードをPUSHするたびに自動的にパイプラインが流れ、自動テストが実行される。 実行結果はCodeBuildのビルド履歴やレポート履歴で見ることが可能。