如何使用 Gitlab Webhook 触发 Jenkins 多分支流水线

How to trigger Jenkins Multi-Branch Pipeline with Gitlab Webhook

我目前设置了一个基于 Git 存储库的 Jenkins 多分支管道作业,该存储库托管在我们的 Git 实验室服务器上。 Jenkins 可以读取存储库中的分支,并为存储库中的每个分支创建一个作业。但我不知道如何在 Gitlab.

中使用 webhooks 触发作业

我的问题是:

  1. 如何从我们的 Gitlab 服务器在 Jenkins 中触发创建新的分支作业?我看不到正在推送的新分支的 webhook。

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

  3. 如何确保 Gitlab 在推送到分支触发构建作业本身之前始终触发 "creation of the branch job"。

到目前为止我尝试的是触发多分支作业,但这没有任何效果并且跟随 根本不起作用。

您需要在 Jenkins 上安装 Gitlab Plugin

这将在 Jenkins 上添加一个 /project 端点。 (在 Jenkins 中查看 => Administrate Jenkins => Configure System => Gitlab )

现在在您的 Gitlab 项目上添加一个 webhook => 设置 => 集成。 (或者在旧的 Gitlab 版本中:Gitlab 项目 => 轮子图标 => 集成,在这种情况下你似乎需要成为项目的所有者)

在Url中:设置http://*yourjenkins.com*/**project**(/*foldername*)?/*yourprojectname*即可,然后点击"Add Webhook"。

当您点击 webhook 上的测试时,它应该会触发您的 jenkins 管道构建。 (您应该有一个 200 http 响应)

在Gitlab插件中无需认证即可使用,欢迎配置认证。

这是对上述关于合并请求的问题评论的较长回复,由于篇幅原因,我将其作为答案而不是评论发布。

多分支管道不支持 Gitlab 合并请求挂钩。更准确地说,gitlab 插件不支持这个。如果您添加合并请求 webhook 并对其进行测试,您将获得响应..."Merge Request Hook is not supported for this project"。转到您找到的文档...

"管道多分支作业

注意:无法将外部数据从 GitLab 传递到 Pipeline Multibranch 作业,因此不会为此作业类型填充 GitLab 环境变量。 GitLab 只会触发 Jenkins 项目的分支索引,而 Jenkins 将相应地构建分支而不需要例如git 分支环境变量。因此,该插件只监听多分支管道作业的 GitLab Push Hooks;合并请求挂钩被忽略。” https://github.com/jenkinsci/gitlab-plugin#pipeline-multibranch-jobs

非常不幸。您至少可以创建一个 "Pipeline" 类型的经典作业,并使用 "Pipeline script from SCM" 选项,这将依赖于 repo 中的 Jenkinsfile。这将支持脚本化或声明式,或两者的混合。这意味着您可以将其指向您已经在 Blue Ocean 中创建的 Jenkinsfile(只是发现您无法为此执行合并请求,因为创建了管道在 Blue Ocean 中当然总是多分支的)。然后,您可以使用作业配置将此经典管道作业配置为在合并请求时触发。您将需要使用脚本中的插件步骤来根据需要更新 GitlabCommitStatus 和 acceptGitLabMR。这至少会导致能够在更现代的蓝海 UI 中查看管道运行。你的 Gitlab MR 中的管道 link 也会将你定向到相同的 UI.

使用 GitLab 分支源插件

有一个名为 GitLab Branch Source 的(仍然 有点 新的)Jenkins 插件,它提供了许多我无法在没有插件的情况下轻松设置的强大功能,应该轻松满足 OP 的要求。

例如,您可以创建一个“多分支管道”Jenkins 作业,将其配置为将所需的“GitLab 项目”作为其“分支源”,这将自动为您的项目分支创建新的 Jenkins 作业和新的合并请求的詹金斯工作。该插件还可以负责在 GitLab 项目上自动安装 Web 挂钩,以便新的分支、提交或合并请求将触发 Jenkins 继续前进。

所有这些都可以很好地配置,例如,您可以选择加入或退出自动创建网络挂钩。或者您可以指定合并请求作业应创建并签出本地合并 commit/result 以进行测试。

重要的多分支作业 - 200 响应但没有触发

接受的答案是正确的。然而,正如许多人指出的那样,当他们从 gitlab 测试 webhook 时,他们得到了 200,但在 Jenkins 上没有任何触发。

其实是gitlab上测试功能的问题

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

这让我很痛苦!希望我能为您节省一些。