- tl;dr
- と言っても, まずはコードを御覧ください
- TravisCI で実行する
— .travis.yml
— 工夫したところ (イケてないかもしれないところ)
—– Python 環境でやった
—– awscli を利用する準備
— 実行結果 - AWS CodeBuild で実行する
— AWS CodeBuild x GitHub
— buildspec.yml
— 工夫したところ (イケてないかもしれないところ)
—– 謎の tput: No value for $TERM and no -T specified
—– 事前にコンテナイメージをビルド
— 実行結果 - おまけ
— CloudFormation テンプレート - 最後に
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 リソースを触るわけではないので, 当然ながらアクセスキーやシークレットアクセスキーはブランクで構いません.
実行結果
いい感じです.
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 モジュールのインストール時間を省けるのは良いことだと思いました.
実行結果
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 で実行した際のメモ」