jenkins agent node 追加を試す
上記のページによって、 jenkins-master を立ち上げる。
そして、 該当の jenkins master ノードに、そのまま ganyairya-master というラベルをつける。
これによって ganyariya-master というラベルを指定し、該当の master ノードで job を実行できる。
ただ、同一の master node で処理を実行すると jenkins が重くなってしまう。
そのため、ベストプラクティスは job を実行する専用のノードを用意する、となっている。
そのため、別ノードをセットアップする。
https://scrapbox.io/files/67300411facc114676ee1969.pnghttps://scrapbox.io/files/67300471f9aa75a2a7883393.png
code:groovy
pipeline {
agent {
label 'ganyariya-master'
}
stages {
stage('Hello') {
steps {
echo 'Hello World from Jenkins Pipeline!'
}
}
}
}
jenkins-agent 用のノードを建てる
https://scrapbox.io/files/67300d4cfe90a09ed29bd079.png
jenkins-agent (debian) を建てる。
jenkins-agent から → jenkins (jenkins-master) に通信をするため、外部 IP は用意していない。
ただし、外部IPを持たない場合 apt update や apt install が行えないため、 NAT Gateway を公開タイプで用意しておく。
これで apt install が行える。
https://scrapbox.io/files/67300f572e1124eb2fa95428.png
jenkins-agent 内で java を install することでセットアップを完成させる。
code:bash
sudo apt update
sudo apt install fontconfig openjdk-17-jre
jenkins-master 側で通信を受け付けて ノード設定を行う
Jenkins の管理 > Security から Agent 通信を待ち受けるポートを 50000 に固定する。
これによって、エージェントノード jenkins-agent → jenkins-master:50000 に通信できるようになる。
ランダムにするとセキュリティ的によくないが、ファイアウォールが設定しづらい。
そのため、 50000 に設定し、かつ送信元の IP をファイアウォールで制限するようにする。
https://scrapbox.io/files/67300fef45256cb0b6b73774.png
続いて、これから追加したいノード(jenkins-agent のこと)を jenkins-master 側で設定する。
あらかじめ jenkins-master 側で agent1 のように名前をつけて「これから1台受け入れますよ〜」を設定しないといけないみたい。
500 台とか大量に agent を追加したい場合は、シェルスクリプトや groovy を書いて、jenkins-master 上で 500 台ノード設定を追加する && 各 agent で接続設定をする、なのかな...
https://scrapbox.io/files/67301137facc114676ee618c.png
agent1 の画面を開くと、以下のようなセットアップスクリプトが表示される。
これを jenkins-agent 側の CLI で実行することで、 jenkins-agent → jenkins-master へ通信するらしい。
https://scrapbox.io/files/673012278339242d2aa8adef.png
ここに表示されているのは jenkins-master の外部 IP。
ただ、 jenkins-master の外部IPには ganyariya の自宅からしかアクセスできないファイアウォールを設定している。
そのため、面倒なので jenkins-master の内部IPを使って通信することにする。
jenkins-master から agent.jar をダウンロードする。
code:bash
jenkins agent の通信を待ち受ける port 50000 は正常に動作している。
code:bash
Jenkins-Agent-Protocols: JNLP4-connect, Ping
Jenkins-Version: 2.479.1
Jenkins-Session: 4d3deb63
Client: 10.146.0.9
Server: 10.146.0.8
Remoting-Minimum-Version: 3107.v665000b_51092
この状態で jenkins-master 上で表示される接続コマンドを、 jenkins-agent 側で実行すると下記のエラーが出た。
これは /var/jenkins/agent を作成する権限がないため(root 権限が /var 以下は必要)
code:bash
ganyariya@jenkins-agent:~$ java -jar agent.jar -url http://10.146.0.8:8080/ -secret secret1(ここは本当はランダムシークレット) -name agent1 -webSocket -workDir "/var/jenkins/agent" Exception in thread "main" java.nio.file.AccessDeniedException: /var/jenkins
at java.base/sun.nio.fs.UnixException.translateToIOException(UnixException.java:90)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:106)
at java.base/sun.nio.fs.UnixException.rethrowAsIOException(UnixException.java:111)
at java.base/sun.nio.fs.UnixFileSystemProvider.createDirectory(UnixFileSystemProvider.java:397)
at java.base/java.nio.file.Files.createDirectory(Files.java:700)
at java.base/java.nio.file.Files.createAndCheckIsDirectory(Files.java:807)
at java.base/java.nio.file.Files.createDirectories(Files.java:793)
at org.jenkinsci.remoting.engine.WorkDirManager.initializeWorkDir(WorkDirManager.java:213)
at hudson.remoting.Launcher.initialize(Launcher.java:508)
at hudson.remoting.Launcher.run(Launcher.java:485)
at hudson.remoting.Launcher.main(Launcher.java:455)
そのため、 /home/ganyariya/jenkins-agent という、 java -jar agent.jar を実行するときにフォルダ権限が足りているパスを remote fs ルートにする。
https://scrapbox.io/files/673015f0ef5706946da25bef.png
この状態で以下のコマンドを実行すると、jenkins-agent vm の /home/ganyariya/jenkins-agent を agent 作業用ディレクトリとして、jenkins-master と通信が行えた。
jenkins-master で 50000 port を agent 通信用ポートとして固定しましたが、コマンドライン上では 10.146.0.8:8080 のように jenkins 本体の url で指定することに注意ですね...
code: bash
ganyariya@jenkins-agent:~$ java -jar agent.jar -url http://10.146.0.8:8080/ -secret secret1 -name agent1 -webSocket -workDir "/home/ganyariya/jenkins-agent" Nov 10, 2024 2:10:34 AM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /home/ganyariya/jenkins-agent/remoting as a remoting work directory
Nov 10, 2024 2:10:34 AM org.jenkinsci.remoting.engine.WorkDirManager setupLogging
INFO: Both error and output logs will be printed to /home/ganyariya/jenkins-agent/remoting
Nov 10, 2024 2:10:34 AM hudson.remoting.Launcher createEngine
INFO: Setting up agent: agent1
Nov 10, 2024 2:10:34 AM hudson.remoting.Engine startEngine
INFO: Using Remoting version: 3261.v9c670a_4748a_9
Nov 10, 2024 2:10:34 AM org.jenkinsci.remoting.engine.WorkDirManager initializeWorkDir
INFO: Using /home/ganyariya/jenkins-agent/remoting as a remoting work directory
Nov 10, 2024 2:10:34 AM hudson.remoting.Launcher$CuiListener status
INFO: WebSocket connection open
Nov 10, 2024 2:10:34 AM hudson.remoting.Launcher$CuiListener status
INFO: Connected
label を jenkins-ganyariya-agent に変更し、ジョブを実行したところ正常に動作した。
code:groovy
pipeline {
agent {
label 'jenkins-ganyariya-agent'
}
stages {
stage('Hello') {
steps {
echo 'Hello World from Jenkins Pipeline!'
sh 'pwd'
}
}
}
}
https://scrapbox.io/files/673016792e1124eb2fa982df.png
https://scrapbox.io/files/673016d8e7d21ca834362633.png
https://scrapbox.io/files/6730178f45256cb0b6b757a0.png
もう 1 Node (agent2) を追加する
動作検証として agent2 を jenkins-master で作成する。
ただし、 agent1, agent2 は両方 gcp vm jenkins-agent で動かしてしまう(もう1つ GCP-VM を建てるのが面倒なので。)
https://scrapbox.io/files/6730187bbc9ce9a1c50f9c5b.png
agent1, agent2 のセットアップコマンドを並べたところ、いくつか異なる点があった。
はじめに、 secret がそれぞれ異なる。
そのため、 jenkins-master は node ごとに異なる secret を発行し、 jenkins-agent が該当の secret をもちいて通信することで「自分を agent1 として登録させてください〜がんばってジョブ実行します〜」と伝えている。
この secret があることで、不正な第三者のノードが勝手に追加されることを防いでいる。
また、 workDir や name が異なり、このあたりは jenkins 上の設定と同じ。
java -jar agent.jar -url http://10.146.0.8:8080/ -secret aaaaaaaaaaaaaaaaaaaaaaaa -name hogefuga -webSocket -workDir "/home/ganyariya/jenkins-agent" のように name を変更すると接続が拒否される。
そのため、第三者が不正に jenkins-master にエージェントノードを追加したい場合は「Jenkins Master IP+Port & secret & agent-name」をすべて知る必要がありかなり大変。
code:sh
# agent1
java -jar agent.jar -url http://10.146.0.8:8080/ -secret aaaaaaaaaaaaaaaaaaaaaaaa -name agent1 -webSocket -workDir "/home/ganyariya/jenkins-agent" # agent2
java -jar agent.jar -url http://10.146.0.8:8080/ -secret bbbbbbbbbbbbbbbbbbbbbbbb -name agent2 -webSocket -workDir "/home/ganyariya/jenkins-agent-second" 同じ gpc vm jenkins-agent を使いまわしたが、正常に agent2 として jenkins-master が認識してくれた。
https://scrapbox.io/files/67301a9429e972cd2112cd81.png
agent1, agent2 両方で job が実行されていることが確認できた。
https://scrapbox.io/files/67301ae0432a9074d2b2a344.pnghttps://scrapbox.io/files/67301aedc33383db35b5ef76.png