Job DSL PluginによるJenkinsジョブのテンプレート化


Jenkinsで似たようなジョブをテンプレートにする方法として、ここで取り上げる [Job DSL Plugin](https://jenkinsci.github.io/job-dsl-plugin/) の他にも、
[Jobcopy Builder Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Jobcopy+Builder+plugin) のような方法もある。

GroovyでDSLとしてジョブを定義できる点が気に入って、今回はJob DSL Pluginを採用したので、使い方を書き残す。

## テンプレートDSLの作成
今回は、こんなジョブのテンプレートを作成する。

* GitBucket上で管理したGitリポジトリからソースコードを取得する
* ビルド、テストはGradleを使う
* ジョブ名、リポジトリのURL、ビルド結果メールの送信先が可変要素

### DSL作成時のポイント
* プラグインの [API  Reference](https://jenkinsci.github.io/job-dsl-plugin/) が充実しているため、そちらを参照しながら実装する
* プラグインの [Wiki](https://github.com/jenkinsci/job-dsl-plugin/wiki) には、使い方を中心としたドキュメントがあるため、そちらも参照する
  * 特に、 [ローカルで開発する方法](https://github.com/jenkinsci/job-dsl-plugin/wiki/User-Power-Moves#run-a-dsl-script-locally) を使うと、実装が早い
  * プラグインに存在しない設定項目は、 **Configure block** を用いる
* Groovyスクリプトのファイル名には英数字とドット、アンダースコアしか使えない。ハイフンを用いるとビルドエラーになることに注意。
  * 実際にやった…

### DSL例
Groovyで以下のようなスクリプトを記述し、Git管理させておく。

```groovy
// 全て大文字の識別子はJenkinsのジョブパラメータとして定義する前提
job(DSL_PROJECT_NAME) {
  // リポジトリの設定
  scm {
    git {
      remote {
        url(DSL_GITBUCKET_REPO_URL)
        credentials(DSL_CREDENTAILS)
      }
      branch('*/develop')
    }
  }
  // ビルドのステップ
  steps {
    gradle {
      switches('--refresh-dependencies')
      tasks('clean')
      tasks('build')
      gradleName('Gradle 2.10')
      useWrapper(false)
      makeExecutable(true)
      useWorkspaceAsHome(false)
    }
  }
  // ビルド後の処理
  publishers {
    // JUnitテスト結果の集計
    archiveJunit('**/build/test-results/*.xml') {
      allowEmptyResults(false)
    }
    // Email-ext pluginに送信先とトリガーを設定
    extendedEmail {
      recipientList('$DEFAULT_RECIPIENTS')
      triggers {
        aborted { recipientList(DSL_NOTIFY_LIST) }
        failure { recipientList(DSL_NOTIFY_LIST) }
        unstable { recipientList(DSL_NOTIFY_LIST) }
      }
    }
  }
  // ここからDSLにAPIがない設定
  configure { project ->
    // GitBucketへのpushをビルドトリガーにする
    project / triggers << 'org.jenkinsci.plugins.gitbucket.GitBucketPushTrigger' {
      passThroughGitCommit(false)
    }
    // GitBucketのリポジトリURL（GitリポジトリURLではない）
    project / 'properties' / 'org.jenkinsci.plugins.gitbucket.GitBucketProjectProperty' {
      url(DSL_GITBUCKET_URL)
      linkEnabled(true)
    }
    // ビルドの履歴を10個までしか保持しない
    project / 'properties' / 'jenkins.model.BuildDiscarderProperty' {
      strategy {
        daysToKeep(-1)
        numToKeep(10)
        artifactDaysToKeep(-1)
        artifactNumToKeep(10)
      }
    }
    // JUnitテスト結果集計の空模様
    project / publishers / 'hudson.tasks.junit.JUnitResultArchiver' << {
      healthScaleFactor('1.0')
    }
  }
}
```

## Jenkinsの設定
DSLが作成できたら、ジョブ生成の元になるジョブ **seed job** を作成する。

* Jenkinsで **新規ジョブ作成** を選択し、ジョブ名を記入した上でフリースタイルのジョブとして登録
* 以下のようにジョブを設定

  * Git管理している場合は、ソースコード管理パートにて、通常のJenkinsジョブと同様の設定をする
  * DSLに対するパラメータがある場合は、 **ビルドのパラメータ化** を選択し、パラメータを追加する

    * DSL内では、パラメータの **名前** で直接参照可能
    * パラメータの種類を **認証情報パラメータ** にしておくことで、Gitへの認証をDSL内に書く必要がなくなるため推奨

  * ビルドパートにて、 **ビルド手順の追加 -> Process Job DSLs** を選択
  * **Look on Filesystem DSL Scripts** を選択し、Gitリポジトリ上のファイル名をワークスペースからの相対パスで記述

    * 例：app_job_seed.groovy

  * 保存ボタンを押下

## ジョブの生成
* seed jobにて、 **パラメータ付きビルド** を押下することで、パラメータ入力と実行ができる
* 正常終了後、Jenkinsのダッシュボードにジョブが生成されていることを確認する