はじめに
「開発者(個人)のための」としているのは、別に自分でやっても良いんだけど Jenkins に任せられるなら任せたい、くらいのモチベーションを表現したつもりです。
ここでは、スレーブの作り方と使い方を簡単にまとめてみました。
環境
- Ubuntu 14.04 LTS
- Jenkins 1.580, 1.582
- 途中から 1.582 に Upgrade しました
スレーブの設定方法
まずはスレーブを作ってみる
とりあえず作るなら、localhost だけで十分です。
スレーブの新規作成
スレーブの設定
赤枠で囲んでいる部分が、手を加えている場所です。
- 「リモートFSルート」はディレクトリを指定します。存在しないディレクトリでも構いません。勝手に作ってくれます。
- 「ラベル」は空白区切りで複数指定できます。私はついついコンマ区切りと間違えてしまいます。
- 起動方法は、「SSH経由でUnixマシンのスレーブエージェントを起動」を選択し、「ホスト」をlocalhost、「認証情報」は『localhostに存在するアカウント』を登録しています。
- 認証については、こちらに少しだけ書いてます。
設定が終われば保存します。
masterと同じ数値が出ていますが、localhostなので当然ですね。
スレーブの起動を確認
新しくスレーブが追加されています。
スレーブ作成に必要なもの
先ほど作ったスレーブのログを見るとよく分かるのですが、
赤枠で囲んだ部分で書いてある通り、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 をたたく必要があります。
jenkins master マシンの、~/.ssh/config
で、ProxyCommand で Proxy 設定を済ませている必要があります。
また、-t
オプションが必要かもしれません。
/etc/profile や ~/.bashrc で設定した環境変数を使用したい場合
結論から述べると、こんな感じで設定すればできます。
「SSH経由でUnixマシンのスレーブエージェントを起動」にせよ「マスターでコマンドを実行してスレーブを起動」にせよ、
non-interactive モードでSSH接続するため、/ect/profile
や .bashrc
といったファイルは読み込まれません。
そもそもJenkinsは、Jenkins上で設定したこと以外は何の設定もされない、という状態が基本です。PATH や JDK や Maven のバージョンなどが、環境によってバラバラになるのを防ぐため、Jenkinsで設定できるようになっています。
スレーブ固有の設定は、スレーブごとに設定できるようになっています。
(キャプチャ画像でチラチラ見えている、「環境変数」がまさにそれです)
とはいえ、いちいちGUIで設定するのも面倒なのと、手元でコツコツ整えた環境のままスレーブ化したい場合も多いので、↑の方法を用いることもあります。
スレーブ用マシンを自動構築するプラグイン
Docker Plugin
Dockerコンテナをスレーブとして生成するプラグインです。
コンテナはスレーブを必要とするタイミングで自動起動され、不要になり次第停止します。
8月末に出た docker 1.2 が動かなかったのですが、10/3 に更新されたDocker Plugin 0.8 では修正されています。
私はてっきり、Jenkinsサーバー上に Docker が無いと使えないものかと思っていましたが、Docker daemon の-H
オプションで指定したポートを使ってAPIをコールし、コンテナを起動する仕組みのようなので、別のサーバー上のDockerもスレーブ化できるかもしれません。
Amazon EC2 Plugin
AWS EC2 をスレーブとして構築できるプラグインです。
設定したスレーブが使用されるタイミングでEC2が生成されます。
不要な時は、Jenkinsの画面から削除することも可能です。
VPCも使えます。
懸念点として、Access KEY と Credential KEY を Jenkinsの設定にベタ書きする必要があります。
使用するスレーブを指定する
基本
ジョブの設定から「実行するノードを制限」をチェックします。
式とある通り、&&
や ||
などでコントロールすることも可能です。
このラベルとは、スレーブの名前も含みます。
ラベル名には、UseProxy とか、Ubuntu とか、Java8 とか、環境や用途をつけると便利です。
NodeLabel Parameter Plugin で、パラメータで指定する
文字列でパラメータ化した値を使おうとしてもうまくいきません。
スレーブの指定をパラメータ化したい場合は、別途プラグインを使用する必要があります。
NodeLabel Parameter Plugin をインストールすると、パラメータに「Node」と「Label」の項目が追加されます。
これらのパラメータを使用すると、「実行するノードを制限」の設定は無視されます。
Node
実行するノードをプルダウン形式で選択できるようになります。
選択肢はスレーブ名になるようです。
Label
使用するノードを入力して指定します。
Show nodes で確認できるようです。最近追加されたんでしょうか。便利になりましたね。
まとめ
スレーブがその威力を発揮するのは、「マルチ構成プロジェクト」を使用する時だと思います。お手軽な並列実行機能です。
また、スレーブを外部サーバーに立てれば、お手軽な負荷分散もできます。
「誰かが作った秘伝のタレなマシンじゃないとビルドできない」 + 「Jenkins がなぜが動かない」という絶望下でも、スレーブを使えば Jenkins で自動化することも可能です。