Help us understand the problem. What is going on with this article?

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

More than 5 years have passed since last update.

準備

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

shinofara
work: Emacs/VisualStudioCode Golang/PHP/Pyhton/Shell AWS/Docker/VirtualBox/Mac Vagrant/Terraform/Packer/Ansible OSS/LT like: Photo/Diving/Snowboard history: Y! -> schoo -> Y! -> MedPeer
https://log.shinofara.xyz/
moneyforward
「お金を前へ。人生をもっと前へ。」をMissionとして、個人向け、法人向け様々なFintechサービスを開発、提供しています。
https://moneyforward.com/
Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away