Technofara

Golangエンジニア!仕事で必要になって勉強した事とか、新しい事とか色々まとめたりを緩くやります。技術系と思考系だけにしておきます、

# jenkinsでのunitテストは、dockerでクリーン環境を作って行おう

準備

docker

dockerに関してはこちら(導入手順もあります)

jenkins

jenkins構築に関してはこちら(centos編)

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を使って、テストをするまでだったので そういったところは、省きましたが次回、テスト部分をもっと書いていきたいです。