🎂

Jenkins PipelineでSCMポーリングが実行され続ける問題の解決案

2022/12/15に公開

Applibot Advent Calendar 2022」 15日目の記事になります。
前日は @h_km さんの「オススメの技術書紹介します」という記事でした!

はじめに

プロジェクトのJenkinsジョブを全てPipelineに移行するにあたり、つまったポイントについて書いていきます。

概要(発生していた問題)

Jenkins PipelineジョブでSCMをポーリングを有効にした場合に無限に実行されてしまう。
図1の場合, 対象リポジトリに変更がなくても1時間に1回実行されていた。

図1: scmのポーリング設定

プロジェクト構成

リポジトリA
└── Jenkinsfile

リポジトリB(ビルド対象リポジトリ)
└── Unityなどのプロジェクトファイル

JenkinsジョブではPipeline script from SCMでリポジトリAをチェックアウトし、Jenkinsfileからpipelineを設定している。
Jenkinsfileの処理では、リポジトリBをチェックアウトし、ビルド処理を実行している。

今回の原因

リポジトリBのgit設定を使い、リポジトリAに向けて更新確認を行っていたため、更新があると錯覚し、毎時ビルドが実行されていた。

$git ls-remote -h

解決案1

checkoutでブランチ指定をする際に*/をつける[1]

*/${BRANCH}

*/をつけるとチェックアウトする revision を特定するために、gitのpluginで実行されるコマンドに違いが出るからと推測されている。

*/なしの場合:/usr/local/bin/git rev-parse master^{commit}
*/ありの場合:/usr/local/bin/git rev-parse refs/remotes/origin/master^{commit}

結果として、今回の問題はこちらの方法では解決できなかった。

解決案2

Lightweight checkoutのチェックを外す

図2: lightweight checkoutの設定
結果として、今回の問題はこちらの方法で解決できた

Lightweight checkoutとは

Lightweight checkoutの説明(原文)

If selected, try to obtain the Pipeline script contents directly from the SCM without performing a full checkout. The advantage of this mode is its efficiency; however, you will not get any changelogs or polling based on the SCM. (If you use checkout scm during the build, this will populate the changelog and initialize polling.) Also build parameters will not be substituted into SCM configuration in this mode. Only selected SCM plugins support this mode.

DeepLによる日本語訳

このモードを選択すると、完全なチェックアウトを行わずに SCM から直接 Pipeline スクリプトの内容を取得しようとします。このモードの利点はその効率性です。しかし、SCM に基づく変更履歴やポーリングを取得することはできません。(ビルド中に checkout scm を使用すると、チェンジログが作成され、ポーリングが初期化されます)。また、このモードではビルドパラメータが SCM の設定に代入されることはありません。このモードをサポートしているのは一部の SCM プラグインのみです。

つまり、全てをCheckoutしなくてもJenkinsfileを読み込んでPipelineを実行してくれるという優れもの

結果

Jenkinsfileを格納しているリポジトリが巨大な場合、Lightweight checkoutが最大限に効果を発揮すると考える。
しかし、今回のユースケースではLightweight checkoutを使うことでポーリングが初期化され、毎時ビルドが走る原因になった。

まとめ

Lightweight checkoutは使い方次第ではすごく良い機能だなと思いました。
Pipeline化の大きめのハマりポイントだったので、同じ轍を踏む人が一人でも減ることを願っております。

フリースタイルジョブからPipelineへの全置き換えは結構大変な作業なので、初めからPipelineにしておけばよかったと思いました。

以上、「Applibot Advent Calendar 2022」 15日目の記事でした。
明日は@Sigsigumaさんです!

参考記事

脚注
  1. Jenkinsのjobが「SCMのポーリングが実行」によって実行されないようにする ↩︎

Discussion