開発者（個人）のためのJenkins - Parameter編

# はじめに

「開発者（個人）のための」としているのは、別に自分でやっても良いんだけど Jenkins に任せられるなら任せたい、くらいのモチベーションを表現したつもりです。

# 環境

* Ubuntu 14.04 LTS
* Jenkins 1.575

# Jenkins ジョブのパラメータ化

Jenkins は、パラメータを使いはじめると、その便利さに拍車がかかります。似たようなジョブを量産する必要がなくなります。

ここでは、Jenkinsに標準搭載されているパラメータのうち、String, Text, Choice を中心に紹介します。

さきにざくっとまとめると、以下のようなイメージです。

|用途|パラメータ|
|:-----------|:-----------|
|文字列（短い、一行、ビルド毎に変わる）|String パラメータ|
|文字列（長い、複数、ビルド毎に変わる）|Text パラメータ or String パラメータを複数用意|
|文字列（使用する文字列は一定）|Choice パラメータ|
|真偽値|Boolean パラメータ|
|たくさんパラメータがあって、ジョブに定義するのが面倒|EnvInjection or Parameterized Trigger Plugin|

## String, Text

String と Text はどちらも文字列を扱うパラメータです。
違うのは、String は 1行、Textは複数行を受け取るパラメータだということです。
~~ただし、Textはシェルの実行上では、改行 -> 空白 に変換されます。~~

Textパラメータの改行は、改行のまま変数に入っていました。
echo が改行を空白にしていました。ダブルクォートで挟まないといけませんでした...

![Jenkins-Parameter-String-Text-Input-Exm.png](https://qiita-image-store.s3.amazonaws.com/0/27201/0a6cc85e-250b-fb16-c4dc-21850b5474d7.png)

このパラメータを echo し、od コマンドで 16 進数で出力すると、次のようになります。

![Jenkins-Parameter-String-Text-Input-Exm-Result2.png](https://qiita-image-store.s3.amazonaws.com/0/27201/7e5deaab-66a9-21d4-4fd7-d775adbfd77a.png)

## Choice

ドロップボックス形式のパラメータを作成します。

私がよく設定する例を示します。

![Jenkins-Parameter-Choice-Setting.png](https://qiita-image-store.s3.amazonaws.com/0/27201/4f0e48ec-9b94-2524-256b-f09cb22da10c.png)

選択値の先頭に半角スペースを使っているのがミソです。
デフォルトの選択値を用意したくない時に使います。
半角スペースなしにただ改行しただけだと、再度ジョブの設定を編集した際に、改行の部分が無かったことにされます。

## File

マシンからファイルをアップロードします。
アップロード先は、WORKSPACE 直下です。

毎ビルドごとにファイルをアップロードする作業が面倒くさいので、個人的にはあまりメリットの感じないパラメータです。
適当な Gitリポジトリを作って pull してもらう方がずっと楽です。

## 真偽値
その名の通りです。true または、false が入ります。

## ビルド
「プロジェクト」で指定したプロジェクトのビルドが選択でき、パラメータとして使えます。
例えば↓のような設定をして、

![Jenkins-Parameter-Build.png](https://qiita-image-store.s3.amazonaws.com/0/27201/66ac63ed-1269-f6f8-5d4d-95f5c9e234f4.png)

`echo $BUILD` とすると

```bash
+ echo http://localhost:8080/job/GitSample/52/
http://localhost:8080/job/GitSample/52/
```


このように、選択したビルドのURLになります。APIを使うときに便利そうですね。
個人的には API を使い出すとメンテし辛いのであまり使いませんが...。

あいにく、このパラメータで指定した「プロジェクト」名は、呼び出し先のジョブ名を変更しても自動更新されません。

# [Parameterized Trigger Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Parameterized+Trigger+Plugin)

Jenkins でパラメータを使い始めたら、この Plugin が欲しくなります。
何も考えずインストールしておくべき Plugin の１つです。

## ビルド後に、パラメータを下流ビルドに引き継ぐ

一番良く使う、「Parameterized Trigger Plugin」という名の通りの機能です。
パラメータの有無にかかわらず、下流ビルドの実行は全て「Parameterized Trigger Plugin」でやっていいと思います。

![Jenkins-Parameterised-af-build.png](https://qiita-image-store.s3.amazonaws.com/0/27201/155f590e-9872-18cd-c041-97d088959d62.png)

「Trigger When build is」とあるように、
ビルドの結果によって下流ビルドを実行するか・しないか、を制御できます。
Jenkins が標準でもつ「他のプロジェクトのビルド」でも制御できますが選択肢が少ないです。

「Trigger build without parameters」は、Add Parameters で引き渡すパラメータを何も指定しなかった時に起きるエラーを無視します。
要するに、「Trigger build without parameters」をチェックすれば、「他のプロジェクトのビルド」と同じ機能になるということです。

「Add Parameters」では、どのパラメータを下流ビルドに渡すのか指定します。
私がよく使うものを列挙します。

|名前|用途|
|:-----------|:-----------|
|Current build parameters|このビルドのパラメータをそのまま下流ビルドに渡す|
|Build on the same node|下流ビルドを同じノード（スレーブ）上で実行させる。私はこの設定より、[NodeLabel Parameter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin)を良く使います|
|Predefined parameters|下流ビルドに渡すパラメータを定義する。記法はJVMプロパティ方式。シェル変数の定義とは違うので注意|
|Parameters from properties file|プロパティファイルに設定されたパラメータを下流ビルドに渡す。こちらもJVMプロパティ方式|

## ビルド中の処理として、下流ビルドを実行

「Parameterized Trigger Plugin」を使えば、ビルド後ではなく、ビルドの処理の中で、下流ビルドを実行する事が可能になります。

![Jenkins-Parameterised-on-build.png](https://qiita-image-store.s3.amazonaws.com/0/27201/e7cfb29b-269b-6cb0-8cbd-4ff2c53eef48.png)

「Block until the triggered projects finish their builds」をチェックすると、下流ビルドが完了するまで、次のビルドの処理を実行しません。

「Add ParameterFactories」は少し特殊な機能です。
下流ビルドを、パラメータの値を変えて連続して実行することができます。

例として「For every matching file, invoke one build」の使用例を示します。

![Jenkins-Parameterised-on-build-exm-1.png](https://qiita-image-store.s3.amazonaws.com/0/27201/f75750b5-8dd9-525d-fd7c-7e5717550032.png)

まずはじめに、このような感じでファイルを２つ用意します。

![Jenkins-Parameterised-on-build-exm-2.png](https://qiita-image-store.s3.amazonaws.com/0/27201/9d3128d5-e840-ebed-52db-a9715877dd8d.png)

次に、「Add ParameterFactories」を↑のように設定します。
「Block until the triggered projects finish their builds」のチェックがないと想定通り動きませんでした。
こうすると、ジョブ「ParameterSampleChild」に対して、prop1.file と、prop2.file を渡した場合の 2 パターンを自動的に連続してビルドしてくれます。

実際にビルド結果を見てみます。

![Jenkins-Parameterised-on-build-exm-3.png](https://qiita-image-store.s3.amazonaws.com/0/27201/924f6a95-04bb-d592-331a-337154802fb0.png)

２回ビルドされていることが分かります。

![Jenkins-Parameterised-on-build-exm-4.png](https://qiita-image-store.s3.amazonaws.com/0/27201/40c6ddbd-1d19-9443-71f3-3322e3e3da4b.png)

こちらは、prop1.file

![Jenkins-Parameterised-on-build-exm-5.png](https://qiita-image-store.s3.amazonaws.com/0/27201/dd166bde-c573-6fd4-8226-e98daddf5a93.png)

こちらは、prop2.file が転送さています。

### 備考

[Conditional BuildStep Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Conditional+BuildStep+Plugin)と組み合わせることで、ビルドの実行を細かく制御することができます。

個人で使うJenkinsに、そこまで複雑なジョブフローを構築する必要はないと思いますので、紹介するだけにとどめます。

# その他 プラグイン

Parameterized Trigger Plugin 以外にも、パラメータと関連したプラグインをいくつか列挙します。
時間があれば、別途記事にまとめようと思っています。

* [EnvInject Plugin](https://wiki.jenkins-ci.org/display/JENKINS/EnvInject+Plugin)
    * ビルド前中後、それぞれのタイミングで環境変数を追加できる
    * Jenkinsで使用する環境変数を初期化できる
* [Extended Choice Parameter plugin](https://wiki.jenkins-ci.org/display/JENKINS/Extended+Choice+Parameter+plugin)
    * ジョブのパラメータに、ラジオボックスや複数選択などの選択方式を追加できる
    * 選択肢をファイルで読み込んだり、Groovyで生成できる
* [Mask Passwords Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Mask+Passwords+Plugin)
    * Jenkins本体が持つパスワードパラメータは、echo すると丸見えなので、ちゃんと隠したい時に使う
* [NodeLabel Parameter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin)
    * ビルドを実行する時のスレーブを指定するパラメータが使える
* [Configuration Slicing Plugin](https://wiki.jenkins-ci.org/display/JENKINS/Configuration+Slicing+Plugin)
    * 複数のジョブのパラメータを、一括して修正できる
    * Choiceパラメータの選択値を追加・削除する時に便利