【jasmine + Karma】の単体テストをCircleCIで実行されるようにしてみた


【jasmine + Karma】 による AngularJs 単体テストをしてみた
で作ったプロジェクトについて、CircleCIを使って、githubにpushされたらkarmaでjasmineの単体テストが実行されるようにしてみました。

CircleCI の 設定

CircleCI の 登録

CircleCIの「Authorize Github」で、githubアカウントでcircleCIの登録を行います。

CircleCI で Buildを行いたいレポジトリを選択

CircleCIのAdd Projectで、ciで回したいリポジトリを追加します。
今回は、リポジトリ「test-circleCI」を追加しようと思いますので、
下記添付画像の ① > ② > ③ の順でクリックしていきます。

build projectをクリックした段階で、対象のリポジトリに対してBuildが行われます。

circleCIの設定を置いていなくてもなんかいい感じにnpm testを実施してうまいこといっている雰囲気なのですが、nodeのversionが古かったりするので、circle.ymlでちゃんと記述してこうかと思います。

circle.yml

node versionの上げ方については、ここを参考にしてます。てゆうかまんまコピペ・・・

依存関係は、「dependencies」で記述するらしい?ので、ここで、npm install を行います。
キャッシュが悪さしてnpm install 失敗するのもいやなので、npmのキャッシュを消してからnpm install しています。

最後に、testとして、package.jsonに記述しているkarma実行scriptを叩いています。

circle.yml
machine:
  timezone:
    Asia/Tokyo
  node:
    version: 6.3.0
  post:
    - npm install -g npm@3

dependencies:
  override:
    - npm cache clean
    - npm install

test:
  override:
    - npm run karma

Coverage

CircleCIのArtifactsにCoverageのhtmlを吐き出したいのですが、ローカルでは、./Coverageに吐き出したい。

ということで、karma.config.jsのcoverageReporterプロパティを追加します。
htmlを吐き出すディレクトリは、
ローカルの時は、 ./coverage/
CircleCIの時は、Artifacts/coverage/
となるようにします。

karma.config.js
+  var reportDir = process.env['CIRCLE_TEST_REPORTS'] || '.';

+  coverageReporter: {
+    dir: reportDir + '/coverage/',
+    reporters: [ { type: 'html' } ]
+ },

実際にBranchをpushして、CircleCIが回るか確認する。

ちゃんと、CircleCIでKarmaが実行されて、Artifactsにcoverageが吐き出されてます(^ ^)

因みに、ローカルでテストした場合は、./coverage に吐き出されていました。

折角なので、githubのmasterブランチを保護する

CircleCIでテスト実施の環境が整ったので、githubのmasterブランチについて、テストが通らないとマージできないように保護したいと思います。

保護したいリポジトリのsetting > Branches > Protected branches で mastarを選択し、status checks で、circleciを選択するだけです。

保護した結果

ciが回っている間や、テストに失敗した場合は、マージボタンがdisableとなりマージできなくなりました。

CircleCI Running

CircleCI Test NG

CircleCI Test Success

テストを含めBuildが全て問題なく完了した場合は、マージボタンが活性化しました。

おわりに

CircleCIのど導入は、思っていた以上にあっさりできてしまいました。
CircleCIは、無料プランでもいろいろできるようなので、どんどん使っていきたいですね。

ソースはgithubで公開しています。