ようへいの日々精進XP

よかろうもん

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

tl;dr

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

inokara.hateblo.jp

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

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

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 リソースを触るわけではないので, 当然ながらアクセスキーやシークレットアクセスキーはブランクで構いません.

実行結果

f:id:inokara:20180503072118p:plain

いい感じです.

AWS CodeBuild で実行する

AWS CodeBuild x 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 モジュールのインストール時間を省けるのは良いことだと思いました.

実行結果

f:id:inokara:20180503074504p:plain

LGTM, LGTM.

おまけ

CloudFormation テンプレート

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

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

最後に

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

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

それでは.