【入門編】Jenkinsのサーバー負荷を軽減!分散ビルドを実現するノード管理の極意 – バージョン管理・CI/CD活用バイブル

こんにちは!日々のビルド待ち時間や、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構成を導入することで、サーバーの安定性が劇的に向上し、チーム全体の開発スピードも見違えるほど加速します。

最初は少し難しく感じるかもしれませんが、一度仕組みを作ってしまえば、あなたの毎日の開発ライフは驚くほど快適になりますよ。ぜひ、今日の業務から試してみてくださいね!

タイトルとURLをコピーしました