【CI】 Jenkins ~ 初級設定編 / (3) Jenkins で JUnit を定期的に実行する ~

初めに

http://blogs.yahoo.co.jp/dk521123/33813814.html
で考えたことを実際に環境設定してみる。
初めなので、ローカル上にCIツールを使って、プロジェクト管理環境を構築する 

構成

* 初めっから色々と欲を出すと挫折したので、手始めに、以下のようなシンプルな構成を行う
 * CIツール       :Jenkins
 * プログラム言語 :Java(開発環境はEclipse)
 * ビルドツール   :Ant
 * 単体試験ツール :JUnit

手順

 [1] Jenkins を設定する

 * 以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/34440556.html
 [2] Jenkins に Ant を設定する

 * 以下の関連記事を参照のこと
http://blogs.yahoo.co.jp/dk521123/34977781.html
 [3] 以下を作成する(実際のファイルは以下のサンプルを参照のこと)
  3-1) Java
  3-2) 3-1)のコードの JUnit
  3-3) 3-2)の実行を行う build.xml

 [4] ジョブ作成を作成する
  4-1) Jenkinsのトップ画面から、「新規ジョブ作成」を選択

  4-2) 以下を設定し、「OK」ボタンを押下する
   4-2-1) ジョブ名:「(任意の名前。ここでは)SampleProjectJob」
   4-2-2) 「フリースタイル・プロジェクトのビルド」にチェックを付ける

  4-3) JDK欄を「(JDKの名前。ここでは)jdk1.8.0」に選択する

  4-4) ビルド欄にある[ビルド手順の追加]-[Antの呼び出し]を選択し、以下を設定する
   4-4-1) 「高度な設定...」を押下(=>「ビルドファイル」欄などが表示される)
   4-4-2) 使用するAnt:「(「設定手順」の4-2)の任意の名前。ここでは)ant1.9.4」
   4-4-3) ターゲット : 「(使用したいAntのターゲット名。ここでは)test.all」
   4-4-4) ビルドファイル : 「3-3)のAntのbuildファイル名」
  => この時点で、「保存」し「ビルド実行」を押下して、「成功」すれば、まずはOK!!

  4-5) ビルド・トリガ欄で「定期的に実行」にチェックを付けると、
       スケジュール欄が表示されるので、ひとまず「H/5 * * * *」(5分ごと)を入力する
     ... 以下『補足:「定期的に実行」の書き方について』を参照のこと
  4-6) 「保存」ボタン押下
  => 5分ごとにテストが実行され、成功すればOK

■「JUnitテスト結果の集計」を行う
以降は、任意の設定だが、せっかくだから、設定する

 [5] プロジェクトの高度なオプション欄の「高度な設定...」ボタンを押下
  5-1) 「カスタムワークスペースを使用」に、チェックを付ける
  5-2) 「ディレクトリ」に、EclipseのWorkspaceを設定する(ここでは「C:\workspace」)
  5-3) 「表示用プロジェクト名」に、任意の文字を設定する(ここでは「SampleProject」)
 [6] ビルド後の処理欄の[ビルド後の処理の追加]-[JUnitテスト結果の集計]を選択
  6-1) 「テスト結果XML」に、「【Eclipseのプロジェクト名】(/【任意のディレクトリ】)/*.xml」を設定する
       (ここでは「SampleJavaCodes/result/*.xml」)
 [7] 「保存」ボタン押下
  => 「ビルド実行」を押下して、「テスト結果の推移」が表示されれば、OK!!

サンプル

 * あくまで、設定を確認するものなので、あんまり込み入ったことはしない

3-1) Java

public class Main {
   public static String sayHello(String name) {
      return "Hello, " + name + "!";
   }
}

3-2) 3-1)のコードの JUnit

import static org.junit.Assert.assertEquals;

import org.junit.Test;
import org.junit.runner.RunWith;
import org.junit.runners.Suite;
import org.junit.runners.Suite.SuiteClasses;

@RunWith(Suite.class)
@SuiteClasses({})
public class MainTest {
  @Test
  public void test() {
     String result = Main.sayHello("Mike");
     assertEquals("Hello, Mike!", result);
  }
}

3-3) 3-2)の実行を行う build.xml

以下を参考にする
http://blogs.yahoo.co.jp/dk521123/34003097.html
Eclipseを使用しているなら、[File]-[Export]-[General]-[Ant Buildfiles]からbuild.xmlを生成する(junit.jarをパスが変わるので)
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<project basedir="." default="test.all" name="SampleJavaCodes">
    <property name="ECLIPSE_HOME" location="../../eclipse/"/>
    <property name="junit.output.dir" value="result"/>
    <property name="junit.src.test" value="./test"/>
    <path id="JUnit 4.libraryclasspath">
        <pathelement location="${ECLIPSE_HOME}plugins/org.junit_4.11.0.v201303080030/junit.jar"/>
        <pathelement location="${ECLIPSE_HOME}plugins/org.hamcrest.core_1.3.0.v201303031735.jar"/>
    </path>
    <path id="SampleJavaCodes.classpath">
        <pathelement location="bin"/>
        <path refid="JUnit 4.libraryclasspath"/>
    </path>
  <target name="init" description="初期化">
    <property name="class.path" value="./class" />
    <delete dir="${class.path}"/>
    <mkdir dir="${class.path}"/>
  </target>
  <target name="compile" depends="init" description="Javaコンパイル">
    <javac srcdir="./src" destdir="./class" />
  </target>
  <target name="test.all">
        <mkdir dir="${junit.output.dir}"/>
        <junit fork="yes" printsummary="withOutAndErr">
            <formatter type="xml"/>
            <batchtest fork="yes" todir="${junit.output.dir}">
               <fileset dir="${junit.src.test}" >
                  <include name="**/*Test.java" />
               </fileset>
            </batchtest>
            <classpath refid="SampleJavaCodes.classpath"/>
        </junit>
    </target>
</project>

補足:「定期的に実行」の書き方について

基本的に「?」アイコン(ヘルプ)にのってることだが
 * 各行は、TABかスペースで区切った5つの項目から構成されている

   例:5分ごとに実行する
    H/5     *    *   *     *
    ---
    MINUTE HOUR DOM MONTH DOW
      |     |    |    |    +- 曜日 (0-7) 0と7は日曜日
      |     |    |    +------ 月 (1-12)
      |     |    +----------- 日 (1-31)
      |     +---------------- 時 (0-23)
      +---------------------- 分 (0-59)

 * 空行や'#'で始まる行は、コメントとして無視される

記述例

 * 0-30分の間で10分ごと
  => H(0-29)/10 * * * *
 * 平日の9-16時の間で2時間ごと
  => H 9-16/2 * * 1-5
 * 12月を除く毎月1日と15日に1回
  => H H 1,15 1-11 *


関連記事

■ 関連記事シリーズ

Jenkins ~ 初級設定編 / (1) Jenkins の設定 ~

http://blogs.yahoo.co.jp/dk521123/34440556.html

Jenkins ~ 初級設定編 / (2) Ant の設定 ~

http://blogs.yahoo.co.jp/dk521123/34977781.html

Jenkins ~ 初級設定編 / (3) Jenkins で JUnit を定期的に実行する ~

http://blogs.yahoo.co.jp/dk521123/33846615.html

Jenkins ~ 初級設定編 / (4) プラグインを設定 ~

http://blogs.yahoo.co.jp/dk521123/35294010.html

■その他

Ant で jUnit を実行する

http://blogs.yahoo.co.jp/dk521123/34003097.html

プロジェクト管理を円滑に進めるために ~Java編~

http://blogs.yahoo.co.jp/dk521123/33813814.html

Jenkins ~概要編~

http://blogs.yahoo.co.jp/dk521123/33165892.html