我可以将 Azure Dev Ops 构建定义同时用于发布管理管道和拉取请求,但后者不会触发管道吗
Can I use an Azure Dev Ops build definition both for a Release Management pipeline and a pull request but with the latter not triggering the pipeline
简而言之;我们希望使用构建定义来为发布管理和检查拉取请求生成工件,但不允许后者触发新发布。
我们在 Git 回购协议中有 CI 构建定义,将工件提供给发布管理管道。像许多团队一样,我们也设置了 Pull Requests 来保护我们的 git master。我们希望在合并之前重用我们的 CI 构建来验证合并请求,但这样做会自动触发我们的发布管道(绕过合并到主服务器)。
到目前为止,我们一直在通过复制构建来解决这个问题,但这感觉很笨拙。查看文档,没有明显的方法来过滤发布触发器,或跳过构建中的发布步骤。我觉得必须避免在不复制构建的情况下阻止触发,但我看不到它!
基于构建的 refspec 触发发布的能力目前不是一种能力。
目前没有开箱即用的功能来实现这一点,VSTS User Voice 上已经提交了类似的功能请求,您可以投票:Trigger release definition only for specific branches。
实现此目的的替代方法是更新您的发布定义以将其配置为由 "Manual" 触发,然后在您的构建定义中添加一个 PowerShell 脚本任务以检查当前构建的源引用和然后通过 VSTS Rest API.
触发释放
我不确定这个问题是否太旧以至于这个答案无效,但是如果您现在使用的是 Azure DevOps(以前称为 VSTS),您可以通过使用 Control Options: Custom Conditions for CI 发布工件的构建任务。
Azure Dev Ops 现在有一种实现此行为的方法。您可以修改发布定义的持续部署触发器。两个适用的选项是:
- 禁用(标题简单的)拉取请求触发器
- 添加一个分支过滤器,即只包括主
请注意另一个答案建议将工件上传设置为有条件的,但是由于其他原因我们仍然需要工件。
在 Azure DevOps 中,我无法完全阻止发布的触发,但我能够对它们进行排序以获取触发发布的分支,然后在我的发布任务上使用自定义条件,如果触发分支是 merge
PowerShell 任务
下面是我目前在第一个任务中使用的 PowerShell
# Use the triggering artifact alias and constructing the name of the variable that will ultimately get us the source branch that triggered the release
$SrcBranchName = "RELEASE_ARTIFACTS_$(('$(RELEASE.TRIGGERINGARTIFACT.ALIAS)' -replace '(^\s+|\s+$)','' -replace '\s+','_').ToUpper())_SOURCEBRANCHNAME"
# Get the environment variable that holds the name of the source branch
$SrcBranchName = Get-Item env:$SrcBranchName | Select-Object -ExpandProperty Value
Write-Host "SrcBranchName: $SrcBranchName"
if ($SrcBranchName -eq "merge") {
Write-Host "Release caused by a PR - no further steps will run."
}
# Set an environment variable with the source branch name for use in a Custom Conditions Control
Write-Host "##vso[task.setvariable variable=TriggeringArtifactSourceBranchName;]$SrcBranchName"
自定义条件
然后对于我在每个任务中的自定义条件,如果 TriggeringArtifactSourceBranchName
设置为 merge
,我使用以下跳过任务。
and(succeeded(), ne(variables['TriggeringArtifactSourceBranchName'], 'merge'))
简而言之;我们希望使用构建定义来为发布管理和检查拉取请求生成工件,但不允许后者触发新发布。
我们在 Git 回购协议中有 CI 构建定义,将工件提供给发布管理管道。像许多团队一样,我们也设置了 Pull Requests 来保护我们的 git master。我们希望在合并之前重用我们的 CI 构建来验证合并请求,但这样做会自动触发我们的发布管道(绕过合并到主服务器)。
到目前为止,我们一直在通过复制构建来解决这个问题,但这感觉很笨拙。查看文档,没有明显的方法来过滤发布触发器,或跳过构建中的发布步骤。我觉得必须避免在不复制构建的情况下阻止触发,但我看不到它!
基于构建的 refspec 触发发布的能力目前不是一种能力。
目前没有开箱即用的功能来实现这一点,VSTS User Voice 上已经提交了类似的功能请求,您可以投票:Trigger release definition only for specific branches。
实现此目的的替代方法是更新您的发布定义以将其配置为由 "Manual" 触发,然后在您的构建定义中添加一个 PowerShell 脚本任务以检查当前构建的源引用和然后通过 VSTS Rest API.
触发释放我不确定这个问题是否太旧以至于这个答案无效,但是如果您现在使用的是 Azure DevOps(以前称为 VSTS),您可以通过使用 Control Options: Custom Conditions for CI 发布工件的构建任务。
Azure Dev Ops 现在有一种实现此行为的方法。您可以修改发布定义的持续部署触发器。两个适用的选项是:
- 禁用(标题简单的)拉取请求触发器
- 添加一个分支过滤器,即只包括主
请注意另一个答案建议将工件上传设置为有条件的,但是由于其他原因我们仍然需要工件。
在 Azure DevOps 中,我无法完全阻止发布的触发,但我能够对它们进行排序以获取触发发布的分支,然后在我的发布任务上使用自定义条件,如果触发分支是 merge
PowerShell 任务
下面是我目前在第一个任务中使用的 PowerShell
# Use the triggering artifact alias and constructing the name of the variable that will ultimately get us the source branch that triggered the release
$SrcBranchName = "RELEASE_ARTIFACTS_$(('$(RELEASE.TRIGGERINGARTIFACT.ALIAS)' -replace '(^\s+|\s+$)','' -replace '\s+','_').ToUpper())_SOURCEBRANCHNAME"
# Get the environment variable that holds the name of the source branch
$SrcBranchName = Get-Item env:$SrcBranchName | Select-Object -ExpandProperty Value
Write-Host "SrcBranchName: $SrcBranchName"
if ($SrcBranchName -eq "merge") {
Write-Host "Release caused by a PR - no further steps will run."
}
# Set an environment variable with the source branch name for use in a Custom Conditions Control
Write-Host "##vso[task.setvariable variable=TriggeringArtifactSourceBranchName;]$SrcBranchName"
自定义条件
然后对于我在每个任务中的自定义条件,如果 TriggeringArtifactSourceBranchName
设置为 merge
,我使用以下跳过任务。
and(succeeded(), ne(variables['TriggeringArtifactSourceBranchName'], 'merge'))