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

# はじめに

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

ここでは、スレーブの作り方と使い方を簡単にまとめてみました。

# 環境
* Ubuntu 14.04 LTS
* Jenkins 1.580, 1.582
    * 途中から 1.582 に Upgrade しました

# スレーブの設定方法
## まずはスレーブを作ってみる

とりあえず作るなら、localhost だけで十分です。

### スレーブの新規作成

![SlaveSetting-First-001.png](https://qiita-image-store.s3.amazonaws.com/0/27201/8373d1c2-f9eb-2022-8273-d4590c4b269d.png)

![SlaveSetting-First-002.png](https://qiita-image-store.s3.amazonaws.com/0/27201/e38576b6-b33b-0d62-8ea8-8b6e58ca079d.png)

![SlaveSetting-First-003.png](https://qiita-image-store.s3.amazonaws.com/0/27201/a4e2f1b6-dc61-865c-6a85-f11c2ddec719.png)

### スレーブの設定

![SlaveSetting-First-004.png](https://qiita-image-store.s3.amazonaws.com/0/27201/8a8fd04f-e261-c99e-8fd5-8126b2e15952.png)

赤枠で囲んでいる部分が、手を加えている場所です。

* 「リモートFSルート」はディレクトリを指定します。存在しないディレクトリでも構いません。勝手に作ってくれます。
* 「ラベル」は空白区切りで複数指定できます。私はついついコンマ区切りと間違えてしまいます。
* 起動方法は、「SSH経由でUnixマシンのスレーブエージェントを起動」を選択し、「ホスト」をlocalhost、「認証情報」は『localhostに存在するアカウント』を登録しています。
    * 認証については、[こちら](http://qiita.com/yasuhiroki/items/61a2be613fc7dcfc8682)に少しだけ書いてます。

設定が終われば保存します。
masterと同じ数値が出ていますが、localhostなので当然ですね。

### スレーブの起動を確認

![SlaveSetting-First-005.png](https://qiita-image-store.s3.amazonaws.com/0/27201/c702c450-6aa1-8190-3890-dee7bc642cb2.png)

新しくスレーブが追加されています。

## スレーブ作成に必要なもの

先ほど作ったスレーブのログを見るとよく分かるのですが、

![SlaveSetting-Config-001.png](https://qiita-image-store.s3.amazonaws.com/0/27201/e7e2e7a2-2625-128b-8695-d74fdaa9f01c.png)

赤枠で囲んだ部分で書いてある通り、`java -jar slave.jar` が、slave の起動方法です。
`java -jar slave.jar` さえ実行できればスレーブが構築できるわけです。

slave.jar は、「SSH経由でUnixマシンのスレーブエージェントを起動」であれば、Jenkinsが勝手に配置してくれます。

基本的には、スレーブ化したいマシンにSSHログインすれば良いので、上記の設定で localhost や、認証をそれぞれ置き換えるだけですが、
次のような場合は、「SSH経由でUnixマシンのスレーブエージェントを起動」ではうまくいきません。

## Proxy経由でスレーブマシンと接続する場合

「SSH経由でUnixマシンのスレーブエージェントを起動」ではProxyやSocksなどの設定ができません。
そのため、Proxy経由の場合は、「マスターでコマンドを実行してスレーブを起動」で、slave.jar をたたく必要があります。

![SlaveSetting-Config-002.png](https://qiita-image-store.s3.amazonaws.com/0/27201/dd7ec78f-5126-4557-1e0d-de955f78fd66.png)

jenkins master マシンの、`~/.ssh/config` で、ProxyCommand で Proxy 設定を済ませている必要があります。 
また、`-t` オプションが必要かもしれません。

## /etc/profile や ~/.bashrc で設定した環境変数を使用したい場合

結論から述べると、こんな感じで設定すればできます。

![SlaveSetting-Config-003.png](https://qiita-image-store.s3.amazonaws.com/0/27201/a5f43898-677b-0269-9815-7701f7ce6737.png)

「SSH経由でUnixマシンのスレーブエージェントを起動」にせよ「マスターでコマンドを実行してスレーブを起動」にせよ、
non-interactive モードでSSH接続するため、`/ect/profile` や `.bashrc` といったファイルは読み込まれません。

そもそもJenkinsは、Jenkins上で設定したこと以外は何の設定もされない、という状態が基本です。PATH や JDK や Maven のバージョンなどが、環境によってバラバラになるのを防ぐため、Jenkinsで設定できるようになっています。
スレーブ固有の設定は、スレーブごとに設定できるようになっています。
（キャプチャ画像でチラチラ見えている、「環境変数」がまさにそれです）

とはいえ、いちいちGUIで設定するのも面倒なのと、手元でコツコツ整えた環境のままスレーブ化したい場合も多いので、↑の方法を用いることもあります。

# スレーブ用マシンを自動構築するプラグイン

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

Dockerコンテナをスレーブとして生成するプラグインです。

コンテナはスレーブを必要とするタイミングで自動起動され、不要になり次第停止します。
8月末に出た docker 1.2 が動かなかったのですが、10/3 に更新されたDocker Plugin 0.8 では修正されています。

私はてっきり、Jenkinsサーバー上に Docker が無いと使えないものかと思っていましたが、Docker daemon の`-H` オプションで指定したポートを使ってAPIをコールし、コンテナを起動する仕組みのようなので、別のサーバー上のDockerもスレーブ化できるかもしれません。

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

AWS EC2 をスレーブとして構築できるプラグインです。
設定したスレーブが使用されるタイミングでEC2が生成されます。
不要な時は、Jenkinsの画面から削除することも可能です。
VPCも使えます。

懸念点として、Access KEY と Credential KEY を Jenkinsの設定にベタ書きする必要があります。

# 使用するスレーブを指定する

## 基本

ジョブの設定から「実行するノードを制限」をチェックします。

![SlaveJob-Config-001.png](https://qiita-image-store.s3.amazonaws.com/0/27201/23e56a98-d2b3-cdce-1695-14eb19ab8308.png)

式とある通り、`&&` や `||` などでコントロールすることも可能です。
このラベルとは、スレーブの名前も含みます。

ラベル名には、UseProxy とか、Ubuntu とか、Java8 とか、環境や用途をつけると便利です。

## [NodeLabel Parameter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin) で、パラメータで指定する

文字列でパラメータ化した値を使おうとしてもうまくいきません。
スレーブの指定をパラメータ化したい場合は、別途プラグインを使用する必要があります。

[NodeLabel Parameter Plugin](https://wiki.jenkins-ci.org/display/JENKINS/NodeLabel+Parameter+Plugin) をインストールすると、パラメータに「Node」と「Label」の項目が追加されます。

これらのパラメータを使用すると、「実行するノードを制限」の設定は無視されます。

### Node

![SlaveJob-Config-002.png](https://qiita-image-store.s3.amazonaws.com/0/27201/b9e72d4a-31d2-3f17-e980-f5973cf780af.png)
![SlaveJob-Config-003.png](https://qiita-image-store.s3.amazonaws.com/0/27201/c84db916-0740-f010-1825-3a223780be10.png)
![SlaveJob-Config-004.png](https://qiita-image-store.s3.amazonaws.com/0/27201/c8084f1b-ab6b-63be-b77e-98e5bca99198.png)

実行するノードをプルダウン形式で選択できるようになります。
選択肢はスレーブ名になるようです。

### Label

![SlaveJob-Config-005.png](https://qiita-image-store.s3.amazonaws.com/0/27201/ca564c82-56fe-fbba-a30b-5a72df9e371b.png)
![SlaveJob-Config-006.png](https://qiita-image-store.s3.amazonaws.com/0/27201/3810143d-0aa2-c63f-df3c-322a1d885a6e.png)

使用するノードを入力して指定します。
Show nodes で確認できるようです。最近追加されたんでしょうか。便利になりましたね。

# まとめ

スレーブがその威力を発揮するのは、「マルチ構成プロジェクト」を使用する時だと思います。お手軽な並列実行機能です。
また、スレーブを外部サーバーに立てれば、お手軽な負荷分散もできます。

「誰かが作った秘伝のタレなマシンじゃないとビルドできない」 + 「Jenkins がなぜが動かない」という絶望下でも、スレーブを使えば Jenkins で自動化することも可能です。