仅在合并时触发的Azure DevOps管道

8
我正在寻找一种方法,仅在成功合并(或尝试合并)拉取请求时触发 Azure Pipeline。

现在我有:

trigger:
 branches:
  include:
    - DEV

steps:
- script: FOO

但是每次 DEV 分支发生更改时都会运行该程序,我希望避免这种情况。

此外,我想要一个编程响应而不是每次都通过 UI。

编辑: 发生了奇怪的事情

condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))

获取:

Expanded: and(True, eq('IndividualCI', 'PullRequest'))" 

在进行PR时,可能会发现代码并没有按照预期工作。

2个回答

9
我正在寻找一种方法,只有在成功(或尝试)合并拉取请求时才触发Azure管道。目前还没有这样的开箱即用的方法。我们只能在目标分支上设置CI触发器,但可以设置管道条件以避免构建任何任务。
and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))

For example:

trigger:
 branches:
  include:
    - DEV

steps:
- script: FOO
  condition: and(succeeded(), eq(variables['Build.Reason'], 'PullRequest'))

或者您可以为阶段、作业等设置条件。

请查看文档 Specify conditions 获取更多详细信息。

如果 DEV 分支上有更改,但它会被条件所避免。

注意:使用上述方法,流水线将被触发,但不会执行任何任务。

如果您甚至不希望触发流水线。您可以添加新的流水线,使用 powershall 任务调用 REST API 触发上述流水线,并将条件设置为 powershell 任务。

这样,只有当提交来自 PR 时,流水线才会被触发。

更新:

对 DEV 分支进行 PR 的结果是:“Expanded: and(True, eq('IndividualCI', 'PullRequest'))”

是的,您说得对。这是因为 Azure DevOps 没有触发流水线在 PR 完成后的功能。Pull Request 触发器和构建验证都在 PR 开始 时触发流水线。

要解决此请求,我们可以尝试创建服务钩子来监视 PR 状态。如果 PR 状态发生变化,则通过 API 或应用程序触发流水线,您可以查看此文档获取更多详细信息。

另一种实现方式是使用 REST API。

主要思路是:

  1. 创建一个流水线,并将其设置为构建验证,但不要将其设置为必需,应将其设置为可选

enter image description here

  1. 在上述流水线中添加 powershell 任务来调用 REST API 监视 PR 状态,直到它完成,并添加另一个任务来调用REST API 来触发您当前的流水线

因此,您可以删除:

trigger:
 branches:
  include:
    - DEV

在你当前的流程中。


@DavidMuñozTord,哪个案例的示例?第一个还在使用REST API吗? - Leo Liu
1
使用 PR 条件测试。 - David Muñoz Tord
@DavidMuñozTord,请查看我更新的答案作为示例。 - Leo Liu
1
@LeoLiu-MST,它似乎不起作用... 在 DEV 分支上进行 PR 的结果是:"Expanded: and(True, eq('IndividualCI', 'PullRequest'))"。 - David Muñoz Tord
1
@DavidMuñozTord,抱歉,现在是非工作时间,我明天会创建一个测试用例来完善答案。 - Leo Liu
显示剩余2条评论

2
您设置的触发器是CI触发器,它将在目标分支有新提交时工作。
目前没有一个触发器可以在拉取请求完成时工作。
最接近您需求的功能是PR触发器和构建验证分支策略。它们将在拉取请求创建更改时工作。
如果您使用的是Azure Repos Git,请使用构建验证的分支策略。如果您使用的是GitHubBitbucket Could,请使用PR触发器。单击文档以获取详细信息。
此外,您可以使用分支策略来防止直接提交。当您设置任何类型的分支策略时,只有具有“绕过策略”权限的用户才能直接向分支提交。其余用户必须通过拉取请求提交分支。
如何创建分支策略:分支策略和设置
如何设置“绕过策略”权限:设置 Git 存储库权限

你好,感谢您的回答,但我已经看到了所有这些建议,但都不令人满意。此外,我想要一个编程响应,而不是每次都通过UI进行操作。 - David Muñoz Tord
你好@DavidMuñozTord,能否请您更详细地解释一下“编程响应”?对于分支策略,您需要通过UI进行设置,但随后管道将会被“编程方式”触发。 - Jane Ma-MSFT
我想通过一个yml脚本来完成,因为我需要对数十个仓库进行操作。 - David Muñoz Tord

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