JenkinsのMultibranch PipelineではGitLabのtag pushビルドが走らない
Multibranch PipelineでTagが拾えるようになったらしい
Multibranch PipelineジョブのJenkinsfileの中で、when
句にtagが使えるらしい。
これを使えばレポジトリへのtag Pushを契機にリリース資材をライブラリに追加したりS3に配置したりなんてことが可能になる!と思ったので試してみました。
GitLabでは自動実行されなかった
GitLabとJenkinsの連携手順は以下を参照。
Webhookの発行のところのTriggerのTag Push
にチェックを入れればGitLabからJenkinsへWebhookが飛ぶようになります。
実際にtag pushしてみましたが、Git PluginがTagに対応しているので、Tagに応じてジョブをdiscoverするものの自動実行されませんでした。
ログを見る限りWebhookは飛んでいるもののJenkinsがうまく受け取れていないようです。
GitLabプラグインの中を見てみる
README.mdにtag pushについては以下のことしか書いてなかった。
In order to build when a new tag is pushed:
1. In the GitLab webhook configuration, add 'Tag push events'
2. In the job configuration under 'Source code management':
i. Select 'Advanced...' and add '+refs/tags/:refs/remotes/origin/tags/' as the Refspec
ii. You can also use 'Branch Specifier' to specify which tag need to be built (example 'refs/tags/${TAGNAME}')
これはフリースタイルでジョブを作ったときの設定で、Multibranchに対する記述はありません。
ソースコードを読んでみても、TagPushTreggerに関するコードは見当たらなかったので実装がないっぽい。
gitlab-plugin/GitLabPushTrigger.java at master · jenkinsci/gitlab-plugin · GitHub
... private boolean triggerOnPush = true; private boolean triggerOnMergeRequest = true; private boolean triggerOnPipelineEvent = false; private boolean triggerOnAcceptedMergeRequest = false; private boolean triggerOnClosedMergeRequest = false; private boolean triggerOnApprovedMergeRequest = false; ...
他にも困っている人がいた
ググると騒いでいる人々を発見。やはりできないっぽい。
- [JENKINS-45838] MR/PR or Tag push from Gitlab to multibranch pipeline - Jenkins JIRA
- Jenkins users - Multibranch pipeline / Gitlab integration: tag push events
回避方法
仕方ないのでブランチPushでブランチ名からtag名を取得して、Jenkinsfile内部でtagをレポジトリへpushするように設定した。
やり方はこちらを参考にした。
GitLab APIとGitHub APIは結構違う
ドキュメントを見るとGitLabとGitHubのAPIのパラメータは構造もパラメータ名も結構違う。