何回か同じことを調べている気がするので、書き出し。
環境
- Jenkins 2.73.2 + Mercurial Plugin 2.2
- Mercurial 4.0
- Mercurial リポジトリに対して Jenkins で Multibranch Pipeline を実行している
事象
- ブランチに対して何も変更コミットがないはずなのに、そのブランチに対するビルドが何回も trigger されてしまう
原因
- Mercurial リポジトリに対して Multibranch Pipeline が scan する時の挙動は以下のような流れで動いている
-
hg heads --template "{node} {branch}\n"
でブランチとそのブランチの head コミット ID 一覧を取得する - 各コミットに対して
hg locate -I path:Jenkinsfile
して、Jenkinsfile が存在するかチェックする - head コミットが、前回 Jenkins がビルドしたブランチのコミットと違う場合、変更があったと検知してビルドを trigger する
- 前回ビルドしたコミットは、ジョブディレクトリ内の
branches/<ブランチ名を略した名前>/scm-revision-hash.xml
というファイルに書かれている
- 前回ビルドしたコミットは、ジョブディレクトリ内の
-
- あるブランチに対して複数の head コミットが存在する場合、↑の3. でそのブランチは常に変更があったとみなされてしまうのが原因
対処方法
- 同じブランチ名で head コミットが複数ないか
hg heads
で確認する - どちらかのコミットをマージするなりクローズするなりして、double head を解消する
- そもそも、double head を拒否するように hook を書けばいいじゃん、という話もありますが…
余談
- Git だと double head は起こり得ない雰囲気がする
- Mercurial はコミットごとにブランチ名が記録されるが、Git の場合はブランチはあくまでもコミットを指し示すポインタでしかないので
- Multi-branch Pipeline のビルドが動く度に、ログが2つ出て来るとか、ビルドが2つ走っちゃうとかいう問題も別にある
-
https://issues.jenkins-ci.org/browse/JENKINS-37384
- Git では Git Plugin 側で修正しているというお話だそうです
- Multibranch Pipeline 周りの実装は大変そう…
-
https://issues.jenkins-ci.org/browse/JENKINS-37384