こんにちは、テクマトリックスの米田です。
Jenkinsでは、既存のジョブをコピーして新しいジョブを作成することができます。しかしマルチブランチパイプラインジョブをコピーした場合では、コピー元ジョブのブランチのパイプラインがコピー先のジョブ内に表示され、実行される現象が生じました。
今回はこの現象と解決策について備忘録として残します。
目次
Jenkinsのマルチブランチパイプラインジョブとは
マルチブランチパイプラインジョブはJenkinsで作成できるジョブの一種で、GitやSubversionなどのSCMツールと連携して使用します。対象のリポジトリをスキャンし、Jenkinsfileが含まれるブランチを検知すると、そのブランチに対応するジョブを自動で作成することができます。SCMツール側でブランチを削除すると、Jenkins側でも対応するジョブが自動で削除されます。これにより、パイプラインの手動作成や管理が不要になります。

(Jenkinsのマルチブランチパイプラインジョブに関する公式サイトはこちらです)
Jenkinsのジョブのコピーとは
Jenkinsでは、既存のジョブをコピーして、その設定を引き継いだまま新しいジョブを作成することができます。JenkinsのUI側で多くの設定をしているジョブを再利用したい場合や、フォルダーで管理しているジョブをコピーして様々なプロジェクトで利用したい場合などで便利な機能です。以下の手順でジョブをコピーすることができます。
- Jenkinsのダッシュボードにアクセスし、[新規ジョブ作成]を選択。
- 作成するジョブの名前を入力し、画面下部にある [コピー元]の欄に、コピーしたいジョブの名前を入力し、[OK] をクリック。
- 遷移先の設定画面で各種項目を入力して [保存] をクリック。
(Jenkinsのジョブのコピーに関する公式サイトはこちらです)
マルチブランチパイプラインジョブのコピーにおける問題
ここからはマルチブランチパイプラインジョブをコピーした際に発生した問題について説明します。
発生した環境
- OS:Windows11 pro
- Jenkins:バージョン2.516.2
- Subversion:バージョン1.14.5
Jenkinsではマルチブランチパイプラインジョブ「sample-job」が作成されています。Subversionのリポジトリと連携しており、問題なく動作している状態です。

コピー元のジョブと、コピーして新規に作成するジョブの情報については以下の表のとおりです。
コピー元のジョブ | コピーして新規に作成するジョブ | |
---|---|---|
ジョブ名 | sample-job | sample-job-copy |
リポジトリ名 | sample-job | sample-job-copy |
ブランチ名 | branches/dev-01 branches/dev-02 | branches/dev-01-copy branches/dev-02-copy |
発生した問題
上記の手順に従って、Jenkinsのジョブコピー機能を利用し、既存のマルチブランチパイプラインジョブを複製しました。新しいジョブ名は「sample-job-copy」とし、コピー元として「sample-job」を選択しました。その後、遷移先の設定画面でジョブの設定を行いました。すると、コピー元のジョブ「sample-job」にあるブランチ名のパイプラインが取り消し線付きで表示され、実行されてしまう問題が生じました。
改めてScan Multibranch Pipeline Nowを押下するとコピー元のブランチの表示は消え、設定画面で入力したリポジトリのブランチのみが表示されました。

調査内容
「コピー元のジョブにあるブランチ名のパイプラインが取り消し線付きで表示され、実行されてしまう問題」に対していくつか調査をしました。
①コピー元のジョブにあるブランチに対応したパイプラインの実行状況
コピー元のジョブにあるブランチに対応したパイプラインは、すべてが成功しているわけではなく、一部は実行が失敗しており、失敗しているパイプラインのコンソールには以下の出力がありました。②でワークスペースを確認してみます。

②ワークスペース
ジョブを実行しているエージェントノードのworkspaceフォルダを参照すると、表示・実行されているコピー元のパイプラインのフォルダが存在していましたが、パイプラインの実行が失敗したジョブのフォルダは空になっていました。何らかのタイミングでワークスペースが更新されたためフォルダが空になり、実行したいbatファイルが見つからなかったため、①のようにコンソールに出力されたものと考えられます。

③マルチブランチパイプラインジョブ作成時のScan Multibranch Pipeline Logの確認
マルチブランチパイプラインジョブ作成時には、Jenkinsが連携しているSCMのリポジトリにJenkinsfileが登録されているかどうかをスキャンして確認します。そのログはサイドメニューの「Scan Multibranch Pipeline Log」に表示されますが、このページの下部には以下のような表示がありました。

orphaned itemsとは「孤立したアイテム」という意味です。Jenkinsが連携先のSCMツールをスキャンした際に、元々存在していたブランチがなくなると表示されます。スキャンはマルチブランチパイプラインジョブをコピーした後に設定したリポジトリに対して行われ、元々存在していたブランチのジョブはorphaned itemsと認識されため、取り消し線付きで表示されたものと考えられます。
④システムログの確認
[Jenkinsの管理] > [システムログ]に出力されるログを確認しましたが、解決のために参考になりそうな出力はありませんでした。
⑤Subversion以外のSCMツールの利用
試しにGitLabと連携してみました。Subversionの場合と同様にコピー元のブランチが表示・実行されたため、連携するSCMツールの問題ではないようです。
その他気がかりだった箇所
調査を重ねていくにあたって、既存のジョブをコピーして新規にジョブを作成する手順を何回か繰り返しましたが、いずれもコピー元のジョブにあるブランチに対応したパイプラインが先に実行されており、ある程度進んでいました。
⇓
上述の推測と調査内容を踏まえ、ジョブのコピー後の設定画面で設定項目を編集して「保存」を押下する前に、既にパイプラインが実行されている可能性がある、と推測しました。
⇓
ジョブコピー後の設定画面で設定項目を編集する前に、左上のダッシュボード画面へのリンクを別のタブで開いてみると、コピーしたジョブが既にダッシュボード画面に表示されており、そのジョブも実行されていることが分かりました。

原因
原因は以下の2点でした。
- マルチブランチパイプラインジョブのコピー時に、コピー元の設定でジョブが実行されたこと
- 設定項目を保存後にその内容が上書きされたこと
また、実際にJenkinsのジョブのコピーが完了するタイミングは、以下の図のタイミングであることが分かりました。

対策
この問題を回避するには、既存のマルチブランチパイプラインジョブをコピーするのではなく、新規に作成することが必要です。手順は以下です。
- ダッシュボード画面の[新規ジョブ作成]から新規ジョブ名を入力し、Multibranch Pipelineを選択して「OK」をクリック
- 設定画面でリポジトリURLや認証情報など、必要な設定を入力して「保存」をクリック。
まとめ
今回はJenkinsでマルチブランチパイプラインジョブをコピーした際にハマった問題についてまとめました。ジョブのコピーは便利ですが、マルチブランチパイプラインジョブの場合では、コピー時に元の設定のままスキャンされ、ジョブが実行されてしまうので注意が必要です。マルチブランチパイプラインジョブを作成する際には、コピーを用いずに新規に作成することが対応策として挙げられます。
同様の内容で困っている方の参考になれば幸いです。