こんにちは!現場の最前線で開発とインフラの魔改造を楽しんでいる先輩エンジニアです。
今日は、多くのチームが一度はハマる「Jenkinsのビルドが突然スタックする恐怖」について、その根本原因と鮮やかな解決策を伝授しようと思います。
「あれ?さっきまで動いていたビルドが、キューに入ったまま一歩も進まない…」
「並列実行数を増やした途端に、Jenkins全体が重くなってフリーズする…」
こんなデスマーチ、経験したことありませんか?実はこれ、Jenkinsの『隠れたデッドロック』と、ジョブの優先順位付けの不在が引き起こす悲劇なのです。
これをマスターすれば、毎日のビルド待ちのイライラから解放され、チーム全体の開発スピードが劇的に向上しますよ。さあ、一緒にJenkinsの奥深い世界を紐解いていきましょう!
—
1. Jenkinsってどんなツール?(基本のキ)
まず、これからJenkinsに触れる方のために、その役割をサクッと整理しておきましょう。
Jenkinsは、いわば「あなたのチームの優秀な自動化執事」です。
コードがGitHubにプッシュされたら、自動でビルドし、テストを走り抜けさせ、本番環境へデプロイする。この一連のパイプライン(CI/CD)を24時間文句も言わずに実行し続けてくれる、モダン開発にはなくてはならないエンジンです。
しかし、この執事も「命令の整理整頓(優先順位)」をしてあげないと、同時にたくさんの仕事を頼まれたときにパニックを起こして立ち往生してしまいます。それが「ビルドのスタック」の正体です。
—
2. 最小限の手間で完了する!基本のインストールとセットアップ
まずは、Jenkinsを動かすための土台を作りましょう。一番手軽で確実な方法である Docker を使った環境構築手順を解説します。
DockerでJenkinsを起動する
以下のコマンドをターミナルに叩いてみてください。これだけで、最新のLTS(長期サポート)版Jenkinsがあなたの手元に立ち上がります。
docker run -d \
–name jenkins-master \
-p 8080:8080 \
-p 50000:50000 \
-v jenkins_home:/var/jenkins_home \
-v /var/run/docker.sock:/var/run/docker.sock \
jenkins/jenkins:lts-jdk17
💡 ここがポイント(先輩の知見):
`-v /var/run/docker.sock:/var/run/docker.sock` という設定を入れています。これは、Jenkinsコンテナの中からもホスト側のDockerを操作できるようにするマジックです。これがないと、Jenkins自身の中でテスト用コンテナを起動するような「Docker-in-Docker」の構成でドハマりします。
起動したらブラウザで `http://localhost:8080` にアクセスし、初回ロック解除パスワード(コンテナのログに出力されます)を入力して初期設定を完了させましょう。「推奨プラグインのインストール」を選択しておけば間違いありません。
—
3. 精度高い「Hello World」ジョブで動作確認
Jenkinsが動いたら、まずは一番シンプルなパイプラインで「動く喜び」を実感しましょう。
1. Jenkinsダッシュボードの左メニュー 「新規ジョブ作成 (New Item)」 をクリック。
2. ジョブ名(例: `hello-world-pipeline`)を入力し、「パイプライン (Pipeline)」 を選択して「OK」。
3. 画面下部の「Pipeline」セクションのスクリプト欄に、以下のコードを貼り付けます。
pipeline {
agent any // 利用可能なエージェントで実行
stages {
stage(‘挨拶ステージ’) {
steps {
// コンソールにメッセージを出力するだけのシンプルなタスク
echo ‘こんにちは!Jenkinsの世界へようこそ!’
sh ‘uname -a’ // 実行環境のOS情報を確認
}
}
}
}
4. 「保存 (Save)」 を押した後、左メニューの 「ビルド実行 (Build Now)」 をクリック!
左下のビルド履歴から実行中のジョブをクリックし、「Console Output」 を覗いてみてください。「こんにちは!Jenkinsの世界へようこそ!」と表示されていれば、あなたのJenkinsは完璧に稼働しています。
—
4. 現場の罠:なぜJenkinsは「隠れたデッドロック」を起こすのか?
ここからが本題です。プロジェクトが大きくなり、ジョブの数が数十個、数百個と増えてくると、以下のような現象に直面します。
- 「緊急のホットフィックス用のビルドなのに、重い夜間テストのジョブがリソースを食い潰していて何時間も待ちぼうきになる」
- 「特定のプラグインの組み合わせ(例:Gitプラグインと古いCredentialプラグインなど)で、リソースのロックが解放されず、全スレッドがフリーズする」
これが、Jenkinsの隠れたデッドロックです。
競合が発生しやすいプラグインのアンチパターン
多くの機能を追加しようと、片っ端からプラグインを入れるのは厳禁です。特に以下の組み合わせは競合を引き起こしやすいので注意してください。
1. 古いビルドトリガー系プラグインと最新のPipelineプラグインの混在
- 解決策:極力「Pipeline(Declarative Pipeline)」の標準機能でトリガーを制御し、古いFreestyleジョブ用の拡張プラグインはアンインストールする。
2. 過剰なエージェント共有とロック機構
- 複数のジョブが同じリソース(特定のDBやポート)を無秩序に奪い合うことで、相互にロックがかかり進まなくなる。
—
5. 極限の最適化:Priority Sorterでジョブの優先順位を完全制御する
このスタック地獄から抜け出すための決定打が、「Priority Sorter プラグイン」の導入と適切なジョブキュー戦略です。
ステップ1: 優先度プラグインの導入
1. `Manage Jenkins` > `Plugins` > `Available plugins` から Priority Sorter plugin を検索してインストール。
2. Jenkinsを再起動します。
ステップ2: 優先度のポリシー設計
すべてのジョブが「平等」である必要はありません。開発現場では明確なヒエラルキーが存在するはずです。
- Priority 1 (最優先): 緊急パッチ(Hotfix)、セキュリティスキャン
- Priority 5 (通常): プルリクエスト時のCI(Unit Test / Lint)
- Priority 9 (低優先): 夜間バッチ、定期的なドキュメント生成
ステップ3: ジョブ設定への組み込み
プラグインを入れると、各ジョブの設定画面に「Project Priority(プロジェクトの優先度)」という項目が出現します。ここに数値(低いほど優先度が高い設定にするのが一般的)を割り当てます。
また、Pipelineスクリプト内で動的に優先度を制御したい場合は、以下のように記述することも可能です(※環境のプラグイン設定に依存しますが、キューの振る舞いを制御する基本思想です)。
pipeline {
agent { label ‘linux-worker’ }
options {
// 同時実行数を制限し、リソース枯渇を防ぐ
disableConcurrentBuilds()
}
stages {
stage(‘優先制御されたビルド’) {
steps {
echo ‘このビルドは適切な優先度キューに基づき実行されています。’
}
}
}
}
—
まとめ:スムーズなCI/CDライフのために
今回は、Jenkinsの基本から、現場を悩ませる「隠れたデッドロック」の正体、そしてPriority Sorterを用いたジョブキューの最適化戦略までを解説しました。
- プラグインは「引き算」の意識で: 必要最小限に絞り、競合を防ぐ。
- ジョブには「身分(優先度)」を与える: すべてを平等に扱わず、緊急性の高いものから処理させる。
この2つを意識するだけで、Jenkinsの安定性は劇的に向上し、チーム全体のストレスが嘘のように消え去ります。
毎日のビルドがスムーズに流れる快適な環境を手に入れて、よりクリエイティブなコーディングに集中してくださいね!それでは、良きCI/CDライフを!