使(っていると言)えるJenkinsプラグインX個選


タイトルは適当。使っている(た)Jenkinsプラグインを`/pluginManager/installed`の上から順に(なのでまとまりは皆無)メモしていく。
観点が少し偏っているかも知れないが、大目に見て頂けると幸い。

### Android Emulator Plugin

Androidのテスト実行が必要という平凡な理由。
設定で指定したAPIレベルが実行環境になければAndroid SDKを自動的にダウンロードする機能がついており便利。
Gradleにも[同じ機能を持つプラグイン](https://github.com/JakeWharton/sdk-manager-plugin)が存在しているため、場合に応じて使い分けるのもアリだろう。

### Artifactory Plugin

自前のライブラリをprivateなmavenリポジトリに上げる際に使用していた。最近はGradleのサブモジュールとしてライブラリを扱うことが多く出番減少。

### build timeout plugin

ジョブにタイムアウトを設定する。無いと地味に困る。
基本は絶対タイムアウトしないように設定しておき(タイムアウトしそうならジョブを分割するなどして対応)、タイムアウト=異常 と判断できるようにしている。

### Cron Column Plugin

ジョブ一覧にトリガー(cron/ポーリング)設定の表示を追加できる。これもジミーズだが便利。
Workflowジョブ(後述)の場合、追加してもトリガー設定が表示されないというバグ(仕様?)があり、現在PR中。
https://github.com/jenkinsci/cron_column-plugin/pull/2

### Dependency Graph Viewer Plugin

ジョブの依存関係(ex. Aのジョブの前/後にビルド)を視覚化できる。
Workflowジョブで定義した依存関係には対応していないため、最近はほぼ使っていない。

### Email-ext plugin

標準とは別のEmail notification機能を提供する。'ext'とあるように標準のEmail notification機能よりも高機能...なのだろう。
自分がJenkinsを使い始めたときには既にインストールされていたため、機能差がどの程度なのかをしっかりと調べたことがない。

### GIT plugin

特に説明なし。文句なしに必須。

### Gradle plugin

Gradleのビルド設定を提供する。
AndroidのビルドツールがGradleになったために使い始めたが、mavenプロジェクトからお引越しするぐらいにはお気に入りに。
Mavenの規約ベース+Antの手続きベース両方のおいしい所取りができる点、Gradle wrapperの存在により各ノードに事前のインストールがいらない点が良い。

### Groovy Label Assignment plugin

ジョブを実行するノードをGroovyスクリプトにより動的に決定できるプラグイン。
「実行するノードを制限」という標準の設定項目があるが、これは静的にしか指定できない。ジョブ実行時に指定できるビルドパラメータも、「実行するノードを制限」に指定した場合には上手く展開できず、この目的では使えない。

そこでこのプラグイン。ビルドパラメータで指定した変数をGroovyスクリプトで処理することにより、実行ノードを動的に決定できる。

```groovy:
binding.getVariables().get("node")
```

### HTML Publisher plugin

Webページ(指定したディレクトリ以下の一式)をビルド履歴に紐付けて保存できるプラグイン。
`Sphinx`などのドキュメントビルドツールと組み合わせると、ビルド->ドキュメント公開がJenkins上で完結する。
外部公開は然るべき場所が必要だが、社内公開であればこれで十分だろう。

### Javadoc Plugin

まあなんとなく入れているが、テストメソッドにJavaDoc書くかというと...暇人と化している。

### Job Configuration History Plugin

Job設定の変更が保存され、差分確認や設定のrevertが行えるようになる。
便利なはずだが、revertせずに手動で書き戻してしまうことが多く活用できていない。

### Jobcopy Builder plugin

既存のジョブからコピーした新規ジョブを作るCopyジョブが定義できるようになる。
コピー元の特定文字列を書き変えたジョブを作成できる。
ビルドパラメータと組み合わせて書き変える内容を制御することで、「コピー用のテンプレートジョブ」から「内容(ex. ジョブの名前/実行するタスク。)が微妙に異なるジョブ」を生成する作業が非常に楽になる。

### JUnit Plugin

テストがJUnitメインなので。以上。

### Maven Project Plugin

Gradleに切り変えていない一部の古いジョブの実行ぐらいにしか使用しなくなった。

### Parameterized Trigger Plugin

「ビルド後の処理」で後続のジョブをキックする際、現在のジョブのビルドパラメータを後続のジョブに渡せるようになる。
これもWorkflowジョブの導入により「ビルド後の処理」を利用してジョブの依存関係を定義しなくなり殆ど使用しなくなった。

### Rebuild Plugin / Safe Restart Plugin

2つまとめて紹介。
サイドバーにRebuild(前回のビルドと同じビルドパラメータで再ビルド)/Restart(Jenkins再起動)ボタンを追加する。
直接HTTPリクエスト投げればいい、というツッコミは聞かない。WebUIからだらーと処理したいときもある...と思う。

### SSH Slaves plugin

SSHでSlaveと接続する機能。必須級。
管理ジョブ(ex. Workflowジョブ, Copyジョブ)はmasterで、テストジョブはslaveで、と使い分けている。

### Template Project plugin

ジョブの処理を別のジョブに委譲できるようになる。
「ジョブの大枠を書いたbaseJobを定義」->「他のJobはbaseJobに処理を委譲、ビルドパラメータにより処理を切り変える」 などができるようになり、処理の共通化がはかれる。
とはいえ全部の処理が委譲できるわけではないことに注意。委譲できるのは「ソースコード管理」「ビルド」「ビルド後の処理」であり、「ビルドパラメータの設定」や「ビルド環境」は委譲できない。

### Workflow Plugin

ジョブの実行・依存関係の定義などをGroovyスクリプトで行えるようになる。

```groovy
# Job実行部を関数化したり...
def buildJob(job, parameters, wait) {
    try {
        def b = build(
            job: job, 
            parameters: parameters,
            wait: wait,
            propagate: true)
    } catch (e) {
    }
}

# Jobを並列に実行したり...
parallel(
    job_path1: {
        buildJobs(jobs1, true)
    }, 
    job_path2: {
        buildJobs(jobs2, true)
    }
    failFast: false
)

```


これらの定義がGroovyスクリプトに落とせることの利点について、私見を述べると以下の通り。

- 依存関係をリポジトリで管理できる。
- 「ビルド後の処理」での依存関係定義と比べて、依存関係の組みかえが容易。これにより依存関係の最適化(ex. 実行時間の短縮)が随分行いやすくなる。

逆に欠点として

- プラグインの仕様を多少意識してWorkflowスクリプトを書く必要がある。(例) [Workflowプラグイン内のシリアライズ処理](https://github.com/jenkinsci/workflow-plugin/blob/master/TUTORIAL.md#serialization-of-local-variables)。
- Workflowプラグインの仕様上、既存の機能/プラグインと組み合わせて使うのが(現状は)難しい。例えば、Workflowスクリプトの実行後にemail notificationを飛ばす、という一見簡単そうに見える処理すらできない。(ただし、Workflowスクリプトに、email notificationの処理を記述することは可能) 

などが上げられるか。ただし2番目については徐々に対応されている模様。
https://github.com/jenkinsci/workflow-plugin/blob/master/COMPATIBILITY.md

開発もかなり活発に行われており、個人的にかなり今後が楽しみなプラグイン。

# 結論

Jenkins便利杉