システム開発現場の道具箱

株式会社モノクレアが運営するIT技術系のブログです。システム開発の現場で役に立つ情報を掲載しています。

Jenkins2でPipelineジョブのサンプルを実行する

Jenkins2.Xをインストールし、PipelineジョブでJenkins同梱のサンプルを実行する手順です。 作業のおおまかな流れは、以下の通りです。

  • Jenkinsの入手、インストール、起動
  • Jenkinsの初期設定
  • プラグインのインストール
  • Jenkinsで使用するMavenの設定追加
  • Pipelineジョブの登録、実行

準備

事前準備として、JDKとMavenをインストールします。下記リンク先の「実行環境」を参照し、実施してください。

クイックスタート · sitoolkit/sit-wt-all Wiki · GitHub

Jenkinsの入手、インストール、起動

Jenkinsの入手、インストール、起動手順です。

Windows

  1. 下記URLからインストーラを入手します。
  2. Downloads」メニュー>「2.X.war」ボタン>「Windows」を選択し、インストーラをダウンロードします。 f:id:tkdy0115:20160520212130p:plain
  3. ダウンロードしたインストーラを実行し、ウィザードに従ってインストールを実施します。インストールフォルダはデフォルトのままでOKです。

Jenkinsの起動については作業不要です。 インストール時にWindowsサービス化され、自動で起動された状態になります。

MacOS

1.ターミナルで下記コマンドを実行し、Jenkinsをインストールします。

brew install jenkins

2.続けて以下のコマンドを実行し、Jenkinsを起動します。

jenkins

Jenkinsの初期設定

Jenkinsの初期設定を実施します。初期設定の内容は下記3点です。

  • Jenkinsの解除
  • Jenkinsのカスタマイズ
  • 管理者ユーザの登録

Jenkinsの解除

1.ブラウザを開き「http://localhost:8080」へアクセスします。自動的にJenkinsの解除画面へ遷移します。 f:id:tkdy0115:20160521001429p:plain

2.Jenkinsの解除画面に表示されているパスワードファイル「initialAdminPassword」をテキストエディタで開き、ファイルに記載されているパスワードをコピーします。 ファイルの中身をコマンドプロンプト、またはターミナルで確認する際は、以下のコマンドを実行します。

Windows(コマンドプロンプト)
type "C:\Program Files (x86)\Jenkins\secrets\initialAdminPassword"
MacOS(ターミナル)
cat /usr/<Your Account>/.jenkins/secrets/initialAdminPassword

3.コピーしたパスワードを「Administrator password」欄に貼り付け、「Continue」ボタンをクリックします。

Jenkinsの初期設定

  1. Install suggested plugins」ボタンをクリックします。 f:id:tkdy0115:20160521001447p:plain
  2. プラグインのインストールが開始するので、完了を待ちます。 f:id:tkdy0115:20160521001506p:plain

管理者ユーザの登録

以下の項目を任意に入力し、「Save and Finish」ボタンをクリックします。

  • ユーザー名
  • パスワード
  • パスワードの確認
  • フルネーム
  • メールアドレス

f:id:tkdy0115:20160521001545p:plain

ここまでで初期設定完了です。「Start using Jenkins」ボタンをクリックすると、ログイン済みの状態でJenkinsのダッシュボードが開きます。
f:id:tkdy0115:20160521001609p:plain

f:id:tkdy0115:20160520214222p:plain

Jenkinsで使用するMavenの設定追加

Jenkinsの実行で使用するMavenの設定を追加します。

  1. Jenkinsの管理画面を開き「Global Tool Configuration」リンクをクリックします。 f:id:tkdy0115:20160520224349p:plain
  2. Global Tool Configuration画面下部の「Maven追加」ボタンをクリックします。 f:id:tkdy0115:20160520224524p:plain
  3. 以下の通り入力し、「Save」ボタンをクリックします。
    • 名前:M3
    • 自動インストール:チェックなし
    • MAVEN_HOME:Mavenのインストールパス
      ※「MAVEN_HOME」は「自動インストール」のチェックをはずすと表示されます。
      f:id:tkdy0115:20160520224541p:plain

ジョブの登録

ジョブの登録を実施します。

1.Jenkinsのダッシュボードを開き、「新規ジョブ作成」メニューをクリックします。 f:id:tkdy0115:20160520230637p:plain

2.「Enter an item name」に任意のジョブ名を入力して「Pipeline」を選択し、「OK」ボタンをクリックします。 f:id:tkdy0115:20160520230823p:plain

3.「Pipeline」タブをクリックし、Pipelineの設定箇所へスクロールします。 f:id:tkdy0115:20160520234830p:plain

4.「try sample Pipeline...」プルダウン>「GitHub + Maven」をクリックします。クリックと同時に、「Script」にサンプルのスクリプトが追加されます。
f:id:tkdy0115:20160520231925p:plain

5.Windowsの場合は「Script」内のmvnコマンド行を、以下の通り修正します。※MacOSの場合は修正不要です。

修正前

   sh "${mvnHome}/bin/mvn clean install"

修正後

   bat "${mvnHome}\\bin\\mvn clean install"

6.「保存」ボタンをクリックするとジョブが保存され、ジョブ画面へ遷移します。

ジョブの実行、結果確認

  1. ジョブ画面左側のメニューにある「ビルド実行」をクリックします。 f:id:tkdy0115:20160520232756p:plain
  2. ビルドが開始され、Stage Viewに、script内で定義したステージごとの結果が表示されます。 f:id:tkdy0115:20160520232919p:plain
  3. ビルド履歴欄で確認したい番号のリンクをクリックし、該当のビルド履歴画面へ遷移します。 f:id:tkdy0115:20160520235324p:plain
  4. コンソール出力」メニューをクリックすると、ビルド実行時のログ、ビルド結果が確認できます。 f:id:tkdy0115:20160520233312p:plain

サンプルで使用するプロジェクト「simple-maven-project-with-tests」のテストクラスの実装(詳細は下記補足参照)により、Mavenビルドの成否はランダムで決まりますが、 ここではMavenビルドの「test」フェーズによるテスト実行と、Pipelineの完了が確認できればOKです。

ユーザーAdmin Userが実行
[Pipeline] node
Running on master in C:\Program Files (x86)\Jenkins\workspace\sample
[Pipeline] {
[Pipeline] stage (Checkout)
Entering stage Checkout
Proceeding
[Pipeline] git
Cloning the remote Git repository
Cloning repository https://github.com/jglick/simple-maven-project-with-tests.git
       :
[INFO] --- maven-surefire-plugin:2.18.1:test (default-test) @ simple-maven-project-with-tests ---
[INFO] Surefire report directory: C:\Program Files (x86)\Jenkins\workspace\sample\target\surefire-reports

-------------------------------------------------------
 T E S T S
-------------------------------------------------------
Running test.OtherTest
Tests run: 1, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec - in test.OtherTest
Running test.SomeTest
Tests run: 6, Failures: 0, Errors: 0, Skipped: 0, Time elapsed: 0 sec - in test.SomeTest
       :
[INFO] --- maven-install-plugin:2.4:install (default-install) @ simple-maven-project-with-tests ---
[INFO] Installing C:\Program Files (x86)\Jenkins\workspace\sample\target\simple-maven-project-with-tests-1.0-SNAPSHOT.jar to C:\WINDOWS\system32\config\systemprofile\.m2\repository\test\simple-maven-project-with-tests\1.0-SNAPSHOT\simple-maven-project-with-tests-1.0-SNAPSHOT.jar
[INFO] Installing C:\Program Files (x86)\Jenkins\workspace\sample\pom.xml to C:\WINDOWS\system32\config\systemprofile\.m2\repository\test\simple-maven-project-with-tests\1.0-SNAPSHOT\simple-maven-project-with-tests-1.0-SNAPSHOT.pom
[INFO] ------------------------------------------------------------------------
[INFO] BUILD SUCCESS
[INFO] ------------------------------------------------------------------------
[INFO] Total time: 8.768 s
[INFO] Finished at: 2016-05-19T18:31:45+09:00
[INFO] Final Memory: 15M/90M
[INFO] ------------------------------------------------------------------------
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
Finished: SUCCESS
【補足】Mavenビルドの成否がランダムに決まる仕組み

プロジェクト「simple-maven-project-with-tests」に含まれるテストクラス「Base.java」のrun()メソッドは、取得した乱数が0.1より小さい場合にテストを失敗させる実装になっています。 また、テストクラス「OtherTest.java」、「SomeTest.java」は、いずれも「Base.java」を継承しており、それぞれのテストケースでrun()メソッドを呼び出しています。 Mavenビルドの「test」フェーズではこれらのテストクラス「OtherTest.java」、「SomeTest.java」のテストケースが実行されるため、ビルドの成否がランダムに決まります。

Base.java(抜粋)

class Base {

    protected void run() {
        double r = Math.random();
        if (r < 0.1) {
            fail("oops");
        } else if (r < 0.2) {
            throw new AssumptionViolatedException("skipping");
        }
    }

}

OtherTest.java(抜粋)

public class OtherTest extends Base {

    @Test public void mytest() {
        run();
    }

}

SomeTest.java(抜粋)

public class SomeTest extends Base {

    @Test public void test1() {
        run();
    }
       :
    @Test public void test6() {
        run();
    }

}
【補足】ビルドがNoSuchMethodErrorで失敗する場合

環境によっては、作成したサンプルプロジェクトのビルドが失敗し、以下のように、 「java.lang.NoSuchMethodError」エラーがコンソール出力される場合があります。その場合は、Jenkinsを再起動することでビルドを通すことが出来るようになります。

ユーザーAdmin Userが実行
[Pipeline] node
Running on master in C:\Program Files\Jenkins\workspace\sample
[Pipeline] {
[Pipeline] stage (Checkout)
Entering stage Checkout
Proceeding
[Pipeline] }
[Pipeline] // node
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: No such DSL method 'git' found among [archive, bat, build, catchError, checkout, deleteDir, dir, echo, emailext, error, fileExists, input, isUnix, load, mail, node, parallel, properties, pwd, readFile, retry, sh, sleep, stage, stash, step, svn, timeout, timestamps, tool, unarchive, unstash, waitUntil, withCredentials, withEnv, wrap, writeFile, ws]
    at org.jenkinsci.plugins.workflow.cps.DSL.invokeMethod(DSL.java:108)
    at org.jenkinsci.plugins.workflow.cps.CpsScript.invokeMethod(CpsScript.java:113)
    at groovy.lang.GroovyObject$invokeMethod.call(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:151)
    at org.kohsuke.groovy.sandbox.GroovyInterceptor.onMethodCall(GroovyInterceptor.java:21)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onMethodCall(SandboxInterceptor.java:115)
    at org.kohsuke.groovy.sandbox.impl.Checker$1.call(Checker.java:149)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:146)
    at org.kohsuke.groovy.sandbox.impl.Checker.checkedCall(Checker.java:123)
    at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.methodCall(SandboxInvoker.java:15)
    at WorkflowScript.run(WorkflowScript:6)
        ...
Finished: FAILURE

Jenkinsの再起動は、タスクマネージャーの「サービス」タブから実行します。 f:id:moriyamajr:20160601174522j:plain

【補足】Jenkinsのポートを変更する

[Windowsサービスとしてインストールした場合] Jenkinsのインストールディレクトリ直下にあるjenkins.xmlを開き、argumentsに「--httpPort=変更したいポート番号」を指定する。

  <arguments>-Xrs -Xmx256m -Dhudson.lifecycle=hudson.lifecycle.WindowsServiceLifecycle -jar "%BASE%\jenkins.war" --httpPort=8180</arguments>

[OS X Homebrewでインストールした場合] /usr/local/bin/jenkinsをテキストエディタで開き、コマンドに「--httpPort=変更したいポート番号」を追加する。

exec java -jar /usr/local/Cellar/jenkins/<i>version</i>/libexec/jenkins.war --httpPort=8180 "$@"