AWSのCodePipeline/CodeBuildでRESTAPIテスト自動化


ついこの執筆の1週間前にCodePipelineをやっと触り始めて(AWS自体は1年前くらいから触り始めた)、CodePipeline完全に理解したので備忘のために記載します。

0.前提

こんな感じのパイプラインを組みたかった

  • CodeCommitに資源が反映される
  • 上記資源とは別のリポジトリにあるテスト用のプロジェクトをCodeBuildでテスト
  • テストOKの場合、反映された資源をビルド&デプロイ
  • テストは単体テストではなく、RESTAPIのテストを想定しており、プロジェクトのリポジトリとは独立して存在している

1.悩んだ点

  • RESTAPIのテストフレームワーク何にしようか
  • テスト資源のビルドスペック記載方法
  • 参照したいプロジェクトが複数あるときどうすればいいのか(既存のパイプラインにどう組み込むか)

2.↑の解決策

この辺り多分知っている人にとっては当たり前なのですが、私は入力アーティファクト&出力アーティファクトすらよく分からなかったので、同じレベル感で詰まっている人の助けになることを祈って書きます。

・RESTAPIのテストフレームワーク何にしようか

今回必須の条件として、codeBuildで動かせる(テスト結果をハンドリングできる)ことだったので、
これに対応するフレームワークを探したところ、frisby.jsが良さそうでした。(他にいいフレームワーク知っている方いたらご教示ください。)

構築手順

1.リンクの通り、npmコマンドをぽちぽちやって環境構築

Console.log
$ cd testFolder
$ npm install -g jasmine-node
$ npm install [email protected]
$ mkdir testspec

※frisby最新版ではテストの実行環境がjestに変更となるとのことでしたので、本記事ではfrisbyのバージョンを指定することにします。ご指摘いただいたH1Gdevさんありがとうございましたm(_ _)m

2.作成したtestspecフォルダ内に、RESTAPIのテスト資源(***test_spec.js)を作成(詳しい記載方法はリンク参照)
3.テスト実行時は下記のコマンドを実行

Console.log
$ cd testFolder/testspec
$ jasmine-node .

テストに成功すると下記のようなログが出力されるはず

Console.log
...............

Finished in 21.753 seconds
15 tests, 28 assertions, 0 failures, 0 skipped

※テスト数などは適宜読み替えてください

・テスト資源のビルドスペック記載方法

下記buildspec.ymlをtestFolder直下に格納でOKです

buildspec.yml
version: 0.2

phases:
  install:
    commands:
      - echo Installing Jasmine...
      - npm install -g jasmine-node
  pre_build:
    commands:
      - echo Installing source NPM dependencies...
      - npm install frisby
  build:
    commands:
      - echo Build started on `date`
      - echo Compiling the Node.js code
      - jasmine-node .
  post_build:
    commands:
      - echo Build completed on `date`

・既存のパイプラインにどう組み込むか

コードパイプライン、今回は
Sourceステージ、Testステージ、Buildステージ、Deployステージの4つとします。
CodeCommitに資源push→資源をビルド→サーバーにデプロイのパイプラインにテストステージを加えるものとします。

1.Sourceステージ

Sourceステージにアクションを追加で本来配備したい資源のCodeCommitとテスト資源が格納されている資源のCodeCommitの2つを並べる。
テスト資源CodeCommitの出力アーティファクト名は、今回は「TestSourceArtifact」とします。

2.Testステージ

ない場合はTestステージの追加から実施

  1. アクションの追加
  2. アクション名:任意(TestなどでOK)
  3. アクションプロパイダ:CodeBuild
  4. CodeBuild:CreateProject
    --ここからCodebuild--
  5. プロジェクト名:任意
  6. 環境イメージ:マネージド
  7. OS:Ubntsu
  8. ランタイム:node.js
  9. サービスロール:適切な権限があるもの
  10. ビルド仕様:buildspec.ymlをチェック
    --ここまでCodeBuild--
  11. 入力アーティファクト:TestSourceArtifact
  12. 出力アーティファクト:なし(本テスト資源で後続に渡す必要があるものはないため)

で完了

Build、Deployステージは既存のままでOK

所感など

CodeBuildは裏でコンテナが起動して、buildspecのスクリプトを読み込んでいるんだ!という腹落ち感があってから理解がよく進んだ
入力アーティファクト、出力アーティファクトはパイプライン内で複数持てることを今回調査して知った

AWS楽しいですね!