如何通过Gitlab Webhook触发Jenkins多分支流水线

32

我目前设置了一个基于Gitlab服务器上托管的Git仓库的Jenkins多分支Pipeline作业。Jenkins可以读取仓库中的分支并为仓库中的每个分支创建作业。但是我无法弄清如何使用Gitlab的Webhooks触发这些作业。

我的问题如下:

  1. 我该如何从我们的Gitlab服务器中触发创建新分支作业在Jenkins中?我找不到用于推送新分支的Webhook。

  2. 如何触发单个分支的实际构建作业?我只能添加一个推送事件的Webhook,但我不知道如何添加分支名称。

  3. 如何确保Gitlab始终在将推送发送到分支之前触发“创建分支作业”。

我尝试过触发多分支作业,但这没有任何效果,并且按照此帖子的方法也无法工作。


1
我和你一样,也遇到了同样的问题,无法通过Webhook触发构建作业。 - baz
1
这个有成功吗? - jhagege
4个回答

16

您需要在Jenkins上安装Gitlab插件

这将在Jenkins上添加一个/project端点。(在Jenkins => 管理Jenkins => 配置系统 => Gitlab中查看)

现在在您的Gitlab项目=>设置=>集成中添加Webhook。(或在旧版本的Gitlab中:Gitlab项目=>轮子图标=>集成,此时您似乎需要是项目所有者)

在URL中:将http://*yourjenkins.com*/**project**(/*foldername*)?/*yourprojectname*设置为值,然后单击“添加Webhook”即可。

当您在Webhook上单击测试时,它应该触发您的Jenkins管道构建。(您应该具有200 HTTP响应)

它在Gitlab插件中不需要身份验证,但欢迎进行身份验证配置。


9
你所做的就只有这些吗?如果按照你描述的设置多分支流水线,我在GitLab中会得到200响应,但在Jenkins中什么也没有发生。我也有一些自由风格的任务,它们可以按照你的描述工作... - CordlessWool
2
我有一个 Jenkinsfile 在 develop 分支中,并且已经运行它,但是触发器不起作用。我还读到 Jenkins GitLab 插件不支持多分支管道。 - CordlessWool
3
Gitlab插件无法完全支持多分支流水线任务,问题在于您需要手动在Gitlab侧创建Webhook。 - Antoine
12
这似乎是针对单个 Pipeline 作业的说明,但不适用于多分支作业。我应该为多管道作业中创建的每个分支配置一个 Webhook 吗?谢谢。 - jhagege
3
被接受的答案是正确的。然而,正如许多人所指出的那样,当他们在多分支作业上测试来自Gitlab的Webhook时,他们得到了一个200的状态码,但是Jenkins上没有触发任何操作。实际上,这是由于Gitlab上的测试功能存在问题。如果您通过向分支推送代码进行实时测试,它将被触发。 - Louis Stekhoven-Smith
显示剩余3条评论

5

使用GitLab分支源插件

有一个(仍然有些新的)Jenkins插件叫做GitLab分支源,它提供了很多优秀的功能,如果没有该插件,我将很难轻松地设置这些功能,而且也可以很容易地满足OP的要求。

例如,您可以创建一个“多分支流水线”Jenkins任务,将所需的“GitLab项目”配置为其“分支源”,即可自动为您的项目分支创建新的Jenkins任务以及新的Jenkins合并请求任务。该插件还可以自动安装GitLab项目上的Web钩子,以便今后的新分支、提交或合并请求会触发Jenkins。

所有这些都可以进行良好的配置,例如,您可以选择加入或退出自动Web钩子创建,或者指定合并请求任务应该创建和检出用于测试的本地合并提交/结果。


GitLab分支源似乎已经损坏:它不允许您指定GitLab服务器。而且它也不再得到维护。Jenkins 2.249.1。 - mrclary

5

重要的多分支工作 - 200响应但没有触发任何操作

接受的答案是正确的。然而,正如许多人指出的那样,当使用GitLab分支源插件时,当他们从gitlab测试webhook时,会得到一个200的响应,但在Jenkins上没有触发任何操作。

实际上,这是gitlab上测试功能的问题。

如果你通过推送代码到你的分支进行实时测试,它将被触发。

这给我带来了很多痛苦!希望我能为你节省一些时间。


哇,还没有点赞。这个救了我 :)Gitlab <=> Jenkins 配置没问题(使用 Jenkins 的 gitlab-plugin),webhook 测试返回 200 OK,但是 Blue Ocean 流水线构建并没有被 webhook 测试触发。 ==> 这确实是一个 webhook 测试函数的问题!-- 注意:我的工作 webhook URL 是:https://<jenkinsUser>:<jenkinsToken>@<jenkinsUrl>/project/<jobName>[可选:/<branch>] - Louis GRIGNON
合并请求每次都在不同的分支上创建。你如何知道你需要在Webhook中放置哪个“/branch”? - Tristan
这似乎适用于GitLab分支源插件,而不是Gitlab插件。GitLab Branch Source 插件 - Bruno
它完全按照你描述的方式使用了gitlab分支源插件。非常感谢。 - Marcelo Fernandes

3

以下翻译是关于合并请求的问题评论的更长回复,由于长度较长,我将其发布为答案而不是评论。

多分支管道不支持Gitlab合并请求挂钩。 更准确地说,gitlab插件不支持此功能。 如果您添加合并请求Webhook并进行测试,则会收到响应..."此项目不支持合并请求挂钩"。 转到文档中,您可以找到...

"管道多分支作业

注意:无法将外部数据从GitLab传递到管道多分支作业,因此GitLab环境变量不会为此作业类型填充。 GitLab仅会为Jenkins项目触发分支索引,而Jenkins将相应地构建分支,而不需要例如git branch env var。 因此,插件仅侦听GitLab推送挂钩以用于多分支管道作业;合并请求钩子会被忽略。" https://github.com/jenkinsci/gitlab-plugin#pipeline-multibranch-jobs

非常遗憾。 您至少可以创建一个类型为“Pipeline”的经典作业,并使用“SCM中的流水线脚本”选项,这将依赖于存储库中的Jenkinsfile。 这将支持脚本化或声明性,或两者的混合。 这意味着您可以将其指向Blue Ocean中已经创建的Jenkinsfile(但是要发现对于在Blue Ocean创建的管道总是多分支的,因此无法为此执行合并请求)。 然后,您可以配置此经典管道作业以使用作业配置触发合并请求。 您需要在脚本中使用插件步骤来根据需要更新GitlabCommitStatus和acceptGitLabMR。 这至少会导致能够在更现代的Blue Ocean UI中查看管道运行。 并且您Gitlab MR中的管道链接也将引导您到相同的UI。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接