つばくろぐ @takamii228

知は力なり

JenkinsのMultibranch PipelineではGitLabのtag pushビルドが走らない

Multibranch PipelineでTagが拾えるようになったらしい

Multibranch PipelineジョブのJenkinsfileの中で、when句にtagが使えるらしい。

jenkins.io

これを使えばレポジトリへのtag Pushを契機にリリース資材をライブラリに追加したりS3に配置したりなんてことが可能になる!と思ったので試してみました。

GitLabでは自動実行されなかった

GitLabとJenkinsの連携手順は以下を参照。

Webhookの発行のところのTriggerのTag Pushにチェックを入れればGitLabからJenkinsへWebhookが飛ぶようになります。

qiita.com

実際に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に対する記述はありません。

github.com

ソースコードを読んでみても、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;
...

他にも困っている人がいた

ググると騒いでいる人々を発見。やはりできないっぽい。

回避方法

仕方ないのでブランチPushでブランチ名からtag名を取得して、Jenkinsfile内部でtagをレポジトリへpushするように設定した。

やり方はこちらを参考にした。

int128.hatenablog.com

GitLab APIGitHub APIは結構違う

ドキュメントを見るとGitLabとGitHubAPIのパラメータは構造もパラメータ名も結構違う。

世の中の大半はGitHubで動いてるっぽいので、GitLab勢にとっては世知辛い

GitLabのWebhookをGitHub API互換に変換する何かがあるとみんな幸せになったりするのだろうか🤔🤔🤔