Jenkins

開発者(個人)のためのJenkins - Slave編

More than 3 years have passed since last update.


はじめに

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

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


環境


  • Ubuntu 14.04 LTS

  • Jenkins 1.580, 1.582


    • 途中から 1.582 に Upgrade しました




スレーブの設定方法


まずはスレーブを作ってみる

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


スレーブの新規作成

SlaveSetting-First-001.png

SlaveSetting-First-002.png

SlaveSetting-First-003.png


スレーブの設定

SlaveSetting-First-004.png

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


  • 「リモートFSルート」はディレクトリを指定します。存在しないディレクトリでも構いません。勝手に作ってくれます。

  • 「ラベル」は空白区切りで複数指定できます。私はついついコンマ区切りと間違えてしまいます。

  • 起動方法は、「SSH経由でUnixマシンのスレーブエージェントを起動」を選択し、「ホスト」をlocalhost、「認証情報」は『localhostに存在するアカウント』を登録しています。


    • 認証については、こちらに少しだけ書いてます。



設定が終われば保存します。

masterと同じ数値が出ていますが、localhostなので当然ですね。


スレーブの起動を確認

SlaveSetting-First-005.png

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


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

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

SlaveSetting-Config-001.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

jenkins master マシンの、~/.ssh/config で、ProxyCommand で Proxy 設定を済ませている必要があります。

また、-t オプションが必要かもしれません。


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

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

SlaveSetting-Config-003.png

「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の設定にベタ書きする必要があります。


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


基本

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

SlaveJob-Config-001.png

式とある通り、&&|| などでコントロールすることも可能です。

このラベルとは、スレーブの名前も含みます。

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


NodeLabel Parameter Plugin で、パラメータで指定する

文字列でパラメータ化した値を使おうとしてもうまくいきません。

スレーブの指定をパラメータ化したい場合は、別途プラグインを使用する必要があります。

NodeLabel Parameter Plugin をインストールすると、パラメータに「Node」と「Label」の項目が追加されます。

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


Node

SlaveJob-Config-002.png

SlaveJob-Config-003.png

SlaveJob-Config-004.png

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

選択肢はスレーブ名になるようです。


Label

SlaveJob-Config-005.png

SlaveJob-Config-006.png

使用するノードを入力して指定します。

Show nodes で確認できるようです。最近追加されたんでしょうか。便利になりましたね。


まとめ

スレーブがその威力を発揮するのは、「マルチ構成プロジェクト」を使用する時だと思います。お手軽な並列実行機能です。

また、スレーブを外部サーバーに立てれば、お手軽な負荷分散もできます。

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