# jenkinsでのunitテストは、dockerでクリーン環境を作って行おう
準備
docker
jenkins
jenkinsがdockerを利用するために、グループ追加
sudo gpasswd -a jenkins docker
CI用Dockerの環境定義
Dockerfileで環境定義
# cat Dockerfile FROM centos RUN yum install -y git man # NVM インストール RUN git clone --depth 1 https://github.com/creationix/nvm.git ~/.nvm # nodejs インストール RUN bash -c ". /.nvm/nvm.sh; nvm install 0.10" # スクリプト実行ユーザの作成 RUN useradd -u 45678 -s /bin/bash -m worker # ワークスペースのマウント先を作成 RUN mkdir /workspace ENTRYPOINT ["/bin/bash", "-c"]
jenkinsのjob作成
新規job作成
ジョブ名を今回は「docker_test」と入力して、フリースタイルを選択
jobの設定内容
ビルド->シェルの実行を選択して、以下を記述
#job名をIMAGEに保存 IMAGE=$JOB_NAME #dockerで作成するときのimage名定義 #ワークスペースをjenkinsのワークスペースに設定 docker build -t $IMAGE $WORKSPACE docker run -v $WORKSPACE:/workspace -w /workspace $IMAGE "$(cat <<EOL source ~/.nvm/nvm.sh nvm use 0.10 npm install jasmine-node -g jasmine-node --junitreport --output junit-reports/ spec EOL )" #nvmを読み込み #nvm0.10を使用 #jasmine-nodeをglobalでインストール #jasmineでjsのunitテストを実行 # - --junitreportでjunit形式のレポートを出力する # - --outputでレポート出力先をjunit-reportsに設定 # specディレクトリ以下のspecを実行
ビルド後の処理
JUnitテスト結果の集計
junit-reports/*xml
ワークスペースにサンプルでテストを作成する
テスト対象のjsを作成
# cat lib/stylist.js var Stylist, exports; Stylist = (function() { function Stylist() {} Stylist.prototype.styles = {}; Stylist.prototype.decorate = function(target, options) { var key, value, _ref; if (!target) { return this.styles[options.style]; } _ref = this.styles[options.style]; for (key in _ref) { value = _ref[key]; if (options.override || !target[key]) { target[key] = value; } } return target; }; return Stylist; })(); if (!exports) { exports = {}; } exports.Stylist = Stylist;
specを作成
# cat spec/stylist_spec.js var Stylist = require('lib/stylist').Stylist; describe('Stylist', function() { beforeEach(function() { this.stylist = new Stylist; this.stylist.styles["normal"] = { width: '50', height: '100' }; this.stylist.styles["double height"] = { width: '50', height: '200' }; }); describe('オブジェクトをデコレートした場合', function() { it('オブジェクトに指定されたスタイルを付与すること', function() { var obj = { name: 'マネキン' }; this.stylist.decorate(obj, { style: "double height" }); expect(obj.width).toEqual('51'); expect(obj.height).toEqual('200'); expect(obj.name).toEqual('マネキン'); }); describe('オブジェクトにスタイルと同名のプロパティがあった場合', function() { it('プロパティを上書きしないこと', function() { var obj = { name: 'マネキン', width: '1000' }; this.stylist.decorate(obj, { style: "double height" }); expect(obj.width).toEqual('1000'); expect(obj.height).toEqual('200'); expect(obj.name).toEqual('マネキン'); }); it('上書きフラグが立っていればプロパティを上書きすること', function() { var obj = { name: 'マネキン', width: '1000' }; this.stylist.decorate(obj, { style: "normal", override: true }); expect(obj.width).toEqual('50'); expect(obj.name).toEqual('マネキン'); }); }); }); });
これで、jenkins,docker,js,unitテストの準備が完了!
jenkinsでjobを実行
http://localhost:8080/job/docker_test/ を開いて、左カラムのビルド実行を押下 するとテストが走ります。 左下に結果が表示されます。
おわりに
今回は、ワークスペースにjs,unit testファイルを事前に準備しましたが gitrepositoryを定義して、jobが走るごとに、checkoutしてきて テストする。とすると なんかCIぽくなります
今回は、dockerを使って、テストをするまでだったので そういったところは、省きましたが次回、テスト部分をもっと書いていきたいです。