こんにちは!日々のビルド待ち時間や、Jenkinsサーバーが突然重くなって「あぁ、またか…」と頭を抱えた経験はありませんか?
開発チームが大きくなり、プロジェクトの規模が拡大するにつれて、CI/CDサーバーへの負荷は爆発的に増えていきます。すべてのビルドを1台の「Master(マスター)」サーバーだけで処理しようとすると、CPUやメモリが悲鳴を上げ、最悪の場合はサーバーがクラッシュしてチーム全体の開発が止まってしまいます。
これを華麗に解決し、毎日の作業を劇的に楽にしてくれるのが「Master/Agent構成(旧スレーブ構成)」による分散ビルドです。
今回は、Jenkinsのサーバー負荷を極限まで軽減し、ビルド時間を劇的に短縮するためのノード管理の極意を、初心者の方にもわかりやすく、かつ現場で即役立つ実践的なアプローチで優しく解説していきますね。これをマスターすれば、あなたのJenkins環境は見違えるほど軽快になりますよ!
—
1. なぜ「Master/Agent構成」が必要なのか?(本質を理解する)
まずは、Jenkinsの基本構造を整理しましょう。
- Master(マスター): Jenkinsの頭脳です。Web UIの表示、ジョブの管理、スケジューリング、プラグインの管理を行います。
- Agent(エージェント): 実際の「労働者」です。Masterからの指示を受けて、コードのチェックアウト、テストの実行、ビルドなどの重い処理を実際に実行します。
痛みの共有:すべてをMasterでやることの恐怖
もし、あなたがすべてのビルドをMasterサーバー上で実行しているなら、それは「会社の社長が一人で全社員の書類のコピー取りから配達までやっている」ような状態です。
Masterがダウンすれば、Jenkinsの画面すら見られなくなり、チーム全員のデプロイがストップします。
分散ビルドがもたらす3つの果実
1. サーバー負荷の分散: 重いビルド処理を別マシン(Agent)にオフロードすることで、MasterのCPUとメモリを守ります。
2. ビルドの並列化(Time to Marketの短縮): 複数のAgentを用意すれば、同時に何個ものビルドを走らせることができます。「テストが終わるのを30分待つ」なんて時間とはおさらばです。
3. 環境の分離(エコシステムの最適化): Java 8のビルド用Agent、Node.js 18のビルド用Agentなど、用途に合わせた環境を綺麗に分離できます。
—
2. 実践:Master/Agent構成の構築ステップ
それでは、実際にAgentをMasterに接続し、仕事を分担させる環境を作ってみましょう。今回は分かりやすく、Dockerを使ってローカル環境にMasterとAgentを立てる手順をベースに解説します。
ステップ1:セキュリティと通信の基本を押さえる
MasterとAgentは、通常 JNLP (Java Network Launch Protocol) または SSH を使って通信します。現場では安全性と管理のしやすさからSSH接続が好まれますが、今回は最も手軽で確実に動かせる「インバウンド・エージェント(JNLP方式)」をベースに進めます。
ステップ2:Jenkins Masterの設定(ノードの追加)
まずは、MasterのWeb UIから「ここに新しいAgentが参加していいよ」という枠を作ります。
1. Jenkinsのダッシュボードから 「Jenkinsの管理」 > 「ノードの管理」 をクリック。
2. 左メニューの 「新規ノード作成」 をクリック。
3. ノード名(例: `worker-agent-01`)を入力し、「Permanent Agent(常時稼働エージェント)」 を選択して「次へ」。
4. 設定画面で以下の項目を入力します:
- リモートFSルート: エージェント側で作業領域にするディレクトリ(例: `/home/jenkins/agent`)
- ラベル: このエージェントを特定するためのキーワード(例: `docker-linux`)
- 起動方法: 「Inbound agent(Java Web Start)」を選択。
5. 「保存」をクリック!
これでMaster側の準備は完了です。作成したノードをクリックすると、Agentを接続するための「秘密鍵(セークレットキー)」やコマンドが表示されます。
—
3. Agentの接続と「HelloWorld」ジョブの実行
次に、Agent側のマシン(今回はコンテナや別サーバーを想定)からMasterに接続します。
Agent起動コマンドの例
Agent側で以下のJavaコマンド、またはDockerコンテナを立ち上げます。
Jenkins Masterから提供されたセークレットキーとURLを指定してAgentを起動
java -jar agent.jar \
-url http://your-jenkins-master-ip:8080/ \
-secret 秘匿された長いセークレット文字列 \
-name “worker-agent-01” \
-workDir “/home/jenkins/agent”
- 親切アドバイス: 本番環境では、これをsystemdなどのサービスとして登録し、サーバーが再起動しても自動でAgentが立ち上がるように設定しておきましょう。
「ノードの管理」画面に戻り、`worker-agent-01` のアイコンが緑色になっていれば、無事に接続成功です!おめでとうございます、これで労働者が仲間に加わりました。
—
4. 【現場の裏技】特定のジョブを特定のAgentに振り分けるノード管理の極意
ただAgentを繋ぐだけではもったいない!ここからがプロの腕の見せ所です。
「どのジョブに、どのAgentを割り当てるか」をコントロールするラベル機能を使いこなしましょう。
ラベルを使ったルーティング戦略
例えば、以下のようにラベルを設計します。
- `linux-high-spec`: 大規模なコンパイルを行う重いジョブ用
- `docker-builder`: Dockerイメージのビルド専用(Dockerイン・Docker環境)
設定手順:
1. ジョブの設定画面を開く。
2. 「高度なプロジェクトの設定」 または全般にある 「このビルドを実行できるノードを制限」 にチェックを入れる。
3. 「ラベル式 (Label Expression)」 に `linux-high-spec` と入力する。
これだけで、このジョブは必ずそのラベルを持つAgent上で実行されるようになります。Masterの負荷は完全にゼロになり、安全かつ高速にビルドが完了します。
—
5. さらに負荷を軽減する!知られざる極意(まとめとTips)
最後に、現場で本当に役立つJenkins運用・負荷軽減のハックをいくつかご紹介します。
- マスタートラフィックの制限: Master上で直接シェルスクリプトを走らせるジョブ(`Execute shell`など)は絶対に禁止にしましょう。Masterの executors(実行スロット)数は `0` に設定するのが、大規模Jenkins運用の鉄則です。Masterは「采配」だけに専念させます。
- Kubernetesプラグインによる動的スケーリング: 「普段はAgentが1台で十分だけど、朝会前のデプロイラッシュ時だけAgentを10台に増やしたい!」という場合は、Kubernetes Pluginを導入しましょう。ビルドが発生した瞬間だけKubernetes上にAgent Podが自動で立ち上がり、終わったら消えるという「究極のオートスケーリング構成」が構築できます。
いかがでしたでしょうか?
Master/Agent構成を導入することで、サーバーの安定性が劇的に向上し、チーム全体の開発スピードも見違えるほど加速します。
最初は少し難しく感じるかもしれませんが、一度仕組みを作ってしまえば、あなたの毎日の開発ライフは驚くほど快適になりますよ。ぜひ、今日の業務から試してみてくださいね!