GitLab:当合并请求打开时,如何防止推送挂钩触发?

GitLab: when merge request is open, how to prevent a push hook to trigger?

我已经集成了 GitLab CE 和 Jenkins。创建合并请求时会触发一个 GitLab 挂钩。 Jenkins 管道然后执行所有集成测试并在一切通过时接受合并。我还有另一个用于推送代码的挂钩,但在这种情况下,只执行单元测试。

一切运行良好,但如果有一个打开的 MR 并将修复推送到分支,则会触发两个挂钩。 push hook 执行单元测试,MR hooks 也执行单元测试和集成测试。第一次执行是没有用的。

如果在GitLab中打开了MR,如何防止push hook被触发?在Jenkins中快速中止推送构建也是一个很好的解决方案。

编辑:我不想拥有两个 Jenkins 作业。我们试过了,但我们的用户感到困惑。我们还需要维护两个作业的代码。

可以为 Jenkins 作业添加不同类型的事件,因此在您的情况下您必须这样做:-

  1. 仅添加 "Push events" 用于在推送代码时要在其中构建的作业。
  2. 仅添加 "Merge request events" 用于提出合并请求时要在其中构建的作业。

在GitLab中添加webhooks时请参考以下内容:-

Edit: I don't want to have two Jenkins jobs. We've tried it and our users get confused. We also need to maintain the code for two jobs.

在这种情况下,Generic Webhook Trigger 将帮助您配置 仅为特定的 webhook 令牌执行。

您还可以检查那些插件 Conditional Build Step and Run Condition 它们允许您指定执行作业的条件。

编辑前建议的解决方案:

打开合并请求时,您希望防止触发推送挂钩。

为了在您的 Jenkins 管道中执行此操作,请在“构建触发器”部分勾选以下内容:

  • 在将更改推送到 GitLab 时构建。 GitLab CI 服务 URL:
    • 打开的合并请求事件

在 GitLab 中,转到“设置”>“集成”,然后在您的 WebHook 中仅勾选以下内容:

这样您就有了一个 仅由打开的合并请求事件触发的管道。

你是这么说的:

The push hook executes the unit tests, and the MR hooks also executes the unit tests and the integration tests. This first execution is useless.

据我了解您只需要触发 MR 挂钩,因为它还会执行单元测试。

但是如果你需要在推送事件上执行单元测试,你应该创建一个新的作业或一个新的管道只被推送事件触发.

为了在您的 Jenkins 管道或工作中这样做,请在“构建触发器”部分勾选以下内容:

  • 在将更改推送到 GitLab 时构建。 GitLab CI 服务 URL:
    • 推送事件

在 GitLab 中,转到“设置”>“集成”,然后在您的 WebHook 中仅勾选以下内容:

这样,当推送修复时,只会执行此作业或管道(仅限单元测试)。

并且在创建合并请求时,仅执行与此事件关联的管道(所有测试)。