tl;dr

引続き, shUnit2 x moto[server] のコラボ作品です.

tl;dr shUnit2 shUnit2 とは shUnit2 で Hello World shUnit2 諸々 詳細については... Assert assertEquals assertNotEquals Setup/Teardown oneTimeSetup oneTimeTearDown ちなみに, setUp と tearDown awscli を使ったシェルスクリプトでテストする さて, 今回 サ...

inokara.hateblo.jp

前回は, shUnit2 と moto[server] を使って, awscli を使ったシェルスクリプトの超シンプルなユニットテストを書いてみました. 今回は, そのユニットテストを TravisCI と AWS CodeBuild で実行するまで作業をダイジェストでお送りいたします.

と言っても, まずはコードを御覧ください

shunit2-with-moto-sample - shunit2 と moto を使った awscli をラップしたシェルスクリプトのユニットテストを行うサンプル的なもの

github.com

本記事は殆どコードで語ります.

TravisCI で実行する

.travis.yml

sudo: false
language: python
python:
  - 3.6
before_script:
  - aws configure set default.region ap-northeast-1
  - aws configure set aws_access_key_id ''
  - aws configure set aws_secret_access_key ''
script:
  - invoke shunit
  - invoke unittest

これだけと言ったら, これだけです.

工夫したところ (イケてないかもしれないところ)

Python 環境でやった

Bash 環境 language: bash も用意されていましたが, Python 2.7 系だったのと, urllib3 のインストールに手こずりそうだったので, Python 3 を提供する language: python を利用しました.

awscli を利用する準備

TravisCI や後述の AWS CodeBuild でも同じことが言えますが, awscli を初めて利用する為に必要な設定 (~/.aws ディレクトリの作成等) を行う必要があります. ディレクトリを作ったりするのは煩わしいので, 以下のように aws configure set ... を並べることにしました.

before_script:
  - aws configure set default.region ap-northeast-1
  - aws configure set aws_access_key_id ''
  - aws configure set aws_secret_access_key ''

生の AWS リソースを触るわけではないので, 当然ながらアクセスキーやシークレットアクセスキーはブランクで構いません.

実行結果

いい感じです.

AWS CodeBuild で実行する

AWS CodeBuild x GitHub

AWS CodeBuild と GitHub の連携については, 事前に行っておく必要があります. 詳細については, 以下のドキュメントをご一読下さい.

AWS CodeBuild で機能するよう設計された GitHub プルリクエストサンプルについて説明します。

docs.aws.amazon.com

一度, 1 つのプロジェクトで GitHub と OAuth 連携をすると, 以降のプロジェクトでは特に意識することなく, GitHub リポジトリとの連携が可能です.

buildspec.yml

AWS CodeBuild の紹介は割愛させて頂きます.

version: 0.2

env:
  variables:
    TERM: "xterm"
    _ENV: "test"

phases:
  pre_build:
    commands:
      - aws configure set default.region ap-northeast-1
      - aws configure set aws_access_key_id ''
      - aws configure set aws_secret_access_key ''
  build:
    commands:
      - invoke shunit
      - invoke unittest

TravisCI と同様に事前に awscli を叩く準備が必要となりますので, pre_build フェーズで叩くようにしています.

工夫したところ (イケてないかもしれないところ)

謎の tput: No value for $TERM and no -T specified

ビルド中に以下のような出力がありました. おそらく, 環境変数 $TERM が未定義状態の為に出力されてしまっているものだと思います.

tput: No value for $TERM and no -T specified

ビルド自体は成功しますが, 気持ち悪かったので, buildspec.yml の環境変数定義に以下を追加しています.

...
env:
  variables:
    TERM: "xterm"
...

事前にコンテナイメージをビルド

以下のような Dockerfile を利用して, 事前にビルド (テスト実行) 用のコンテナイメージをビルドしておきました.

FROM python:3
COPY requirements.txt ./
RUN pip install --no-cache-dir -r requirements.txt

ビルドしておくことで, Python モジュールのインストール時間を省けるのは良いことだと思いました.

実行結果

LGTM, LGTM.

おまけ

CloudFormation テンプレート

今回, AWS CodeBuild を利用するにあたって, Amazon EC2 Container Registry も合わせて利用しています. 複数の AWS リソースをマネジメントコンソールからポチポチするのはツライし, もう一度, 同じ環境が欲しいと思っても手順が…ってことになりそうだったので, CloudFormation のテンプレートも書きました.

詳細は別記事 (README) をご一読頂ければと思います. また, CloudFormation の書き方等で可怪しな点等ありましたらご指摘頂けると幸いでござります.

最後に

結局, .travis.yml や buildspec.yml の紹介だけに終始してしまい申し訳ございませんでした. しかし, このくらい簡単に実装出来るという点は実感頂けたかと思います.

尚, 通常の運用では TravisCI と AWS CodeBuild を両方利用するシチュエーションはかなり少ないとは思います. 用法用量を守って, お好きな環境をご利用頂ければと存じます.

それでは.

元記事はこちら

shUnit2 で awscli を使ったシェルスクリプトのユニットテストを Travis CI と AWS CodeBuild で実行した際のメモ