こんにちは、テクマトリックスの長久保です。
今回はJenkinsのプラグインであるGitLab Branch Sourceプラグインを使ってみたので備忘を兼ねて記載していきたいと思います。

GitLab Branch Sourceプラグインとは何か

JenkinsとGitLabを連携する際のプラグインです。プラグインのインストール数的にJenkinsとGitLabを連携する場合GitLabプラグインを利用して連携する方も多いと思いますが、このプラグインも結構便利です。

JenkinsとGitLabを連携させる場合、

  • Multibranch Pipelineのジョブタイプでジョブを作成する。
  • Branch SourcesでGitを選択し、プロジェクトのURLを登録する。
  • GitLabプラグインを用いてWebhookの設定を行う。

という手順を取られる場合が多いかと思います。この方法でもJenkinsとGitLabを連携できるのですが、GitLab Branch Sourceプラグインを利用すると、より簡単にジョブの作成ができる印象です。
GitLab Branch Sourceプラグインを使った場合以下の2種類の方法でジョブを作成できます。

  • Multibranch Pipeline:単一プロジェクトの場合。
  • Folder Organization:所有者(ユーザー/グループ/サブグループ)内の複数のプロジェクトの場合。

Folder Organizationで作成しておけばプロジェクトが増えた場合でも、フォルダ階層形式でJenkinsに自動でジョブが作成されます。

GitLab Branch Sourceの設定方法

ここでは簡単に利用方法について説明します。

プラグインのインストール

Jenkinsの管理 > プラグインの管理 > 利用可能タブでGitLab Branch Sourceプラグインを検索します。GitLab Branch Source Pluginを選択すれば、実行に必要なそのほかのプラグインも同時にインストールされます。

プラグインの設定

Jenkinsの管理 > システムの設定より設定をしていきます。GitLabセクションに必要な情報を入力していきます。この際、GitLabプラグインもJenkinsにインストールしている場合、どちらもGitLabというセクション名で表示されるので注意が必要です。

GitLabプラグインの設定箇所
GitLab Branch Sourceプラグインの設定箇所

プラグインの説明ページに従い値を入力していきます。

Display Nameジョブ追加画面で表示される識別子です。defaultのままでも問題ありません。
Server URLGitLab ServerのURLを入力します。プロジェクトのURLではありません。
CredentialsGitLab上でPersonal Access Tokenを発行し、認証情報の種類をGitLab Personal Access Tokenとして登録します。

最低限この3項目を登録すれば設定は完了します。それ以外にも「高度な設定」項目を含めると細かな設定項目がありますが、通常利用する場合もこれにWebhookの設定を追加で行うくらいかと思います。

ジョブの作成

GitLab Branch Sourceプラグインをインストール後はBranch Sourcesの選択肢にGitLab Projectが表示されるようになります。GitLab Projectを選択後それぞれの項目を入力していきます。

Server先ほどプラグインの設定で登録した「Display Name」を選択してください。
Checkout CredentialsGitLabからCheckoutする際の認証情報です。種類を「SSHユーザー名と秘密鍵」または「ユーザー名とパスワード」で登録します。
OwnerGitLabのユーザー名、またはグループ名を入力します。
ProjectsServerとOwnerを入力するとコンボボックスにプロジェクトが表示されます。ジョブの実行対象のプロジェクトを選択します。
このようにProjectが表示されるので実行対象を選択します。

作成されたジョブについて

通常のMultiBranch Pipelinesと同じようにブランチごとにジョブが自動的に作成されます。以下のようにMerge Requestを別タブとして表示させることも可能です(デフォルト)。

また、GitLab上からも実行状況の確認ができます。

Jenkinsのジョブが成功したものは緑色のチェックで、失敗したものは赤色の×で表示されます。このアイコンをクリックしていくとJenkinsのジョブの画面に遷移も可能です。
GitLab Branch Sourceプラグインはわずかな設定でこれらの連携をしてくれます。

GitLab Branch Sourceを設定していてハマったこと

裏で色々よろしくやってくれるプラグインなので問題の切り分けが大変です。そして、この記事を書いている3カ月前頃から頻繁にいくつかバージョンが変わり、おそらくジョブ作成時にOwnerを指定する箇所が変わっています。

2021/12月頃、以下の条件で構築しているときはうまくいっていましたが、バージョンを上げたらうまく動かなくなりました(動いていたバージョンについては時期からの推測です)。

ツール動いていたバージョン(推測)動かなくなったバージョン
Jenkins2.303.32.346.2
GitLabgitlab/gitlab-ce:14.6.3-ce.0gitlab/gitlab-ce:15.0.2-ce.0
GitLab Branch Source1.5.9633.ved9984f943da_

動いていたバージョンの頃はOwner欄にroot/Passwordの場合rootといった具合に、GitLabのユーザー名を入れれば動作していました。しかし動かなくなったバージョンとしている方ではrootと入れてもProjectのコンボボックスは以下のようになります。また、以前はユーザーのIDを入れても設定できていたかと思うのですが、その場合も同じように表示されます(そもそも存在しない内容をOwner欄に入れると「-なし-」と表示されます。)。

Jul 27, 2022 5:10:40 AM WARNING io.jenkins.plugins.gitlabbranchsource.GitLabSCMSource$DescriptorImpl doFillProjectPathItems
Exception caught:org.gitlab4j.api.GitLabApiException: 404 Group Not Found
org.gitlab4j.api.GitLabApiException: 404 Group Not Found
	at org.gitlab4j.api.AbstractApi.validate(AbstractApi.java:642)
	at org.gitlab4j.api.AbstractApi.get(AbstractApi.java:214)
	at org.gitlab4j.api.Pager.<init>(Pager.java:92)
	at org.gitlab4j.api.GroupApi.getProjects(GroupApi.java:436)
	at org.gitlab4j.api.GroupApi.getProjects(GroupApi.java:406)
	at io.jenkins.plugins.gitlabbranchsource.GitLabSCMSource$DescriptorImpl.doFillProjectPathItems(GitLabSCMSource.java:855)
	at java.base/java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:710)
	at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:398)
	at org.kohsuke.stapler.Function$InstanceFunction.invoke(Function.java:410)
	at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:208)
	at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:141)

Jenkins側にもログが吐き出されており、jenkins.ioのissuesにも同様の報告(Can’t make gitlab-branch-source-plugin work at all)が挙がっているので自分だけの環境の問題ではないかなと思います。
今回はGroupの情報を登録すれば回避できることが分かったので、そちらで対応しました。

GitLabのGroupのPathまたはIDを指定すれば実行は可能です。ユーザー名の指定でも以前は動いていたので、近いうち解消されればなと思います。

あとこの問題についてはそもそもプラグイン側で解消できるのか、実運用上どこまで影響があるのかはわかりませんが、

  • Jenkinsでジョブを作成
  • GitLabでMRを発行。
  • Jenkins側でパイプラインが実行。
  • GitLab側にパイプラインの実行結果が登録。
  • Jenkinsの該当ジョブを削除する

とした場合、GitLab側にパイプラインの実行結果が残り、実行結果のアイコンからJenkinsにアクセスしようとするとHTTP ERROR 404 Not Foundになります。同一ジョブ名で再度Jenkinsに登録した場合、ジョブ番号との関連付けがおかしくなります。

実行元が異なるジョブですが、同一のMRの結果として登録されます。

もしかしたらSystem hookを正しく設定すれば解消する問題かもしれないので、その場合教えていただけると嬉しいです。

GitLab Branch Sourceについて思う事

使ってみてとても便利なプラグインだと思います。ただ、

  • Jenkinsの管理の設定箇所の名称がGitLabプラグインとかぶっていてわかりづらい。どちらも似たような項目を登録するので初めて見たときは混乱する。
  • バージョン1.5.2時点でWebhookにシークレットトークンが必須になったのだから、現状の設定項目のような順番や表示になっているのは多少不親切。
  • Immediate Web Hook triggerやWeb Hook trigger delayという設定項目があるが、プラグインの説明ページにはない。プラグインのヘルプ(?アイコン)を押すと簡易的な説明は出てくるが、現時点の自分の知識ではもう少し情報が欲しいと思ってしまう。

等々若干不便だなと思う事もあります。
その一方でもう少しプラグインの利用者数が増えればもっと情報も増えるでしょうし、色々変わってくるのかなとも思います(2022/7/28時点でGitLabプラグインのインストール数が58,033に対して、GitLab Branch Sourceは8,824)。

色々書きましたが設定自体はGitLabのPersonal Access Tokenを発行し、Jenkinsでいくつか設定するだけで利用できる便利なプラグインなので、GitLabとJenkinsの組み合わせで利用されている方はぜひ試してみて下さい。

By nagakubo

主にCI環境構築をメインで担当しています。 Certified CloudBees Jenkins Engineer (CCJE)