【CI奮闘記】第6章:エージェントを作ってみよう!


はじめに

前回のブログでは、CIやCDのデメリットについて説明しました。
前回のブログはこちら
今回は、前回紹介した分散ビルドを実施するための下準備として、エージェントを設定する内容となります。

登場人物

吉田:転職したてのエンジニア。前職では積極的にCIやCDという事に取り組みながら開発をしていた。

溝口:入社20年のベテラン。現職の部署の開発経験しかなく、従来通りのウォーターフォールでの開発経験しかない。新しい取り組みには積極的だが、どうしても今までの成功体験に寄ってしまいがち。

服部:配属1年後の新人。CIやJenkinsについては言葉は聞いたことがある程度。もともと開発で今回初めて環境周りを扱う事になった。

エージェントを作成する

今回は「エージェント」を実際に作っていってみようか。
「エージェント」ってなにか覚えてる?

ジョブを実行するリソースですよね。
ノード上で動いているものです。

そうだね。今回はエージェントを設定して分散ビルドの準備をしてみようか。

分散ビルドとか言うと途端に難しく感じるのですが。。。

大丈夫!やってみよう。
分散ビルドについてもう一度触れるわね。

分散ビルドのおさらい

分散ビルドのイメージはこんな感じ。
Jenkinsを軸として複数台のノードを接続して、それぞれのノードでビルドを行うの。

こうすることでまず単純にビルドに使えるリソースが増えるから、複数のビルドを同時に走らせるという事が可能になるわ。

前回の奮闘記で「異なる環境の提供」や「セキュリティ面」でもメリットがあると説明されていましたね。

そうね。あと分散ビルドと書いているけど、ビルドに限った話ではないわ。
複数同時にテストを走らせたいけど、例えばそれぞれのテストが同じポートを使ったり、UIテストで同じブラウザを使ったりといった、お互いに干渉してしまう場合にも有効ね。

クラウドといった仮想化系の技術と相性がよさそうですね。
それぞれのマシンにJenkinsをインストールする必要があるんですか?

エージェントを作成するために行う事

それぞれのマシンにJenkinsをインストールする必要はないわ。あくまで軸であるJenkinsは一個。
それぞれのノードにagent.jarと呼ばれる小さなプログラムを走らせばエージェントの構築は完了ね。

jarという事はノードはJavaが実行できる環境である必要があるんですね。
こんなイメージですか?

そう!

このagent.jarファイルはどこかからとってくる必要があるんですか?

Jenkinsから取得する事ができるの。
$JENKINS_URL以下の /jnlpJars/agent.jar にアクセスすればjarファイルを取得できるわ。

localhostの場合はこのようになります

どこかから探さなくて良いのは便利ですね!

Jenkinsのバージョンとあまりに乖離したagent.jarだとうまく動作しないこともあるから、稼働中のJenkinsから取得したほうが良いわね。

なるほど。

ここでちょっとややこしいんだけど、エージェントと呼ばれる前はこの仕組みをスレーブと呼んでいたのね。
なので、古い資料ではこの小さなプログラムが「slave.jar」となっていたりするの。
今でも$JENKINS_URL以下の /jnlpJars/slave.jarにアクセスするとjarファイルが取得できるわ。

agent.jarと同じようにslave.jarの取得ができます。

何か違いがあるんですか?

中身は全く同じね。ファイル名が違うだけ。
なのでどちらでも利用はできるんだけど、今から新しく始める場合は用語にあわせてagent.jarを利用したほうが良いのかなと個人的に思うわ。

ファイル比較ソフトを用いてagent.jarとslave.jarの中身を比較。このようにファイル名が異なるだけで中身は同一です。

実際にエージェントを作成する

仕組みもわかったところで実際に設定していきましょう。
まずノードを定義してあげるわ。
今回はサンプルとして作成するので、Jenkinsコントローラーが動いているマシンにエージェントを作成するわね。
「Jenkinsの管理」から「ノードの管理」を選択して、新規ノードの作成を行いましょう。

初期状態ではmasterのみ表示されています。

ノード名には用途がわかりやすいように名前を付けるといいわ。
例えばJDKのバージョン違いのノードを作るのが目的であれば「JDK8」「JDK11」といった具合ね。
今回はそのままsampleと入れるわね。

用途に合った名称を付けていく。

するとこのように設定画面が表示されるわ。

ノードの設定画面

ぱっと見、項目多いですね。

このリモートFSルートにはJenkinsコントローラーが動作しているノード上のフォルダも指定もできるわ。今回は作成の検証なのでJenkinsノードにJenkins-agent\sampleというフォルダを作ってそこを指定しましょう。

各項目の後ろにある「?」ボタンを押下するとその項目の説明がでるので、うまく活用しましょう。
この設定が完了するとノードが登録が完了ね。

お!本当ですね。
でも×マークがついてます。

まだ登録しただけだからね。
さっき登場したagent.jarを動かしてあげる必要があるわ。
作成したノードをクリックするとこんな風に起動方法が説明されているのでそれに従って実行しましょう。

今回はagent.jarをダウンロードして先ほどの「リモートFSルート」に配置して、画面に記載してあるコマンドを実行してみましょう。

このようにコマンドをコピペし、jarファイルを実行します。

×マークが消えました!

現在Jenkinsコントローラーと同じパソコンにsampleを立てているのでmasterと同じ値になっているけど、このようにノードの空きディスク容量のモニタリングといったこともできる様になるわ。

エージェントの起動方法として、それ以外にも様々な方法があります。
お使いの環境に合わせてエージェントを起動することが可能です。

SSHコネクタを利用する
JenkinsはビルトインのSSHクライアントを備えているため、エージェント側のマシンでsshdが起動していればコントローラー側の操作のみで、sshによってエージェントを自動的にコピーし起動や停止が可能になります。
この方法を用いればエージェント側のノードでの作業無しにエージェントを起動することができます。

Java Web Startを利用する
Java Web Start (JNLP) を利用することでも、エージェントの設定を行うことが可能になります。
エージェントを利用するノードからJenkinsコントローラーへアクセスができれば利用が可能な方法なので、Jenkinsコントローラーサーバがファイアーウォールの外にあり、エージェントがファイアーウォールの中にあるといった場合でも利用が可能です。

JNLP-HTTPコネクタを利用する
Java Web Startの方法と似ていますが、こちらはagent.jarを用いてエージェントのノードからコマンドを実行してエージェントを起動します。

ノードがWindowsの場合のエージェントの設定
こちらは複数設定方法があります。
Windowsのリモート管理機能(WMI + DCOM)を利用した場合、WMI Windowsエージェントプラグイン
https://plugins.jenkins.io/windows-slaves/
を利用してのエージェントの設定も可能ですし、
MicrosoftOpenSSHを使用してWindowsエージェントを起動することも可能です。

今回の例ではjarファイルを配置しコマンドラインで起動するという方法を用いて起動しましたが、このように様々なエージェントの起動方法があります。
https://wiki.jenkins.io/display/JA/Distributed+builds
こちらのJenkinsのwikiに他の方法についても詳しく記載されているので、併せてご確認いただければと思います。

まとめ

ノードの作成手順はこれまで説明してきたように次の順番で実施することで作成することが可能です。

  1. 「Jenkinsのダッシュボード」 > 「Jenkinsの管理」 > 「ノードの管理」
  2. 「ノードの管理」より、新規ノード作成をクリックし、ノードを作成する。
  3. ノードの設定値(リモートFSルート等)を入力する
  4. ノードとJenkinsコントローラーを接続する

このようなことを繰り返し実施することでエージェントを増やしていくことができるわ。
また、一度作成した設定をコピーしてノードを作る事もできるの。

sampleノードの設定を元にsample2ノードを作成。

作成が楽になりそうですね!
ちなみに1つのJenkinsに接続するエージェントの上限は有るんですか?

Jenkinsとしての制約は無いけど、実際にはコントローラーのノードのスペックに依存することになると思う。
ノードのメモリであったり、ネットワークだったり、実行したログはコントローラーのノードに保存されるのでディスクI/Oであったりかしらね。
実例としては500以上のオンラインノードを持つ例もあるので、必要量増やしていってみて問題が発生したら制限するという考え方でいいと思うわ。

なるほどです。

それじゃあ次回は実際にJenkinsのジョブを作成してみようかしら。

CI奮闘記一覧