TL; 博士
我们希望通过 Continuous deployment trigger
阻止 Azure Devops 中的 Pull Request 分支策略构建触发发布。机制。
问题
我们目前是 Azure DevOps Server 2019 版本 Dev17.M153.3 的用户
我们同时使用构建和发布管道。当用户提交 pull 请求时,我们有一个 Branch Policy
将构建排队以确保代码编译和任何测试通过。此构建的完成会触发 Continuous deployment trigger
我们已经在相应版本的 Build 工件上进行了配置 - 这对我们来说不是理想的行为。
我们的理想行为是让分支策略构建通过 pull 请求排队,而不触发 Continuous deployment trigger
因此不要排队发布。我们只想通过 Continuous deployment trigger
触发发布如果我们手动排队构建。我们永远不希望在 Pull Request
上构建分支策略时发生这种情况。 .
我们已经尝试使用 Build branch filters
在 Continuous deployment trigger
,但没有运气。我试过使用 Exclude
设置它和设置 Build branch
至 pull/*
, refs/pull/*
和 merge
但是这些过滤器没有任何运气,发布仍在排队中。
我想知道是否有更好的方法来处理这种情况,或者是否可以将其他过滤器添加到 Continuous deployment trigger
减少不需要的发布排队。
最佳答案
我们已经确定目前没有针对此问题的“最佳解决方案”,以下是一些替代方案。
简单的解决方法
发布变量和自定义条件(单个工件)
如果您的版本中只有一个工件,您可以使用
Build.SourceBranchName
跳过作业级别的任务。 release variable :当变量表达式解析时,如果
Build.SourceBranchName
变量等于 merge
它跳过以下所有任务:发布变量和自定义条件(多个工件)
最后,如果您在发布中使用多个工件,您仍然可以完成上述行为,尽管您需要使用 PowerShell 脚本做一些额外的工作。
您使用 PowerShell 脚本查看
RELEASE_TRIGGERINGARTIFACT_ALIAS
环境变量然后查看对应的RELEASE_ARTIFACTS_<RELEASE_TRIGGERINGARTIFACT_ALIAS>_SOURCEBRANCHNAME
多变的。您的环境变量(在发布的
Initialize Job
步骤中可见)如下所示。...
[RELEASE_ARTIFACTS_PROJECT1_SOURCEBRANCHNAME] --> [master]
...
[RELEASE_ARTIFACTS_PROJECT2_SOURCEBRANCHNAME] --> [merge]
...
[RELEASE_ARTIFACTS_PROJECT3_SOURCEBRANCHNAME] --> [master]
...
[RELEASE_TRIGGERINGARTIFACT_ALIAS] --> [PROJECT2]
...
这在标准发布 View 中也可见。
最终我们想看看触发工件的源分支名称变量是否设置为
merge
, 如果是这样,我会通过 Control Options Custom conditions
使释放短路并跳过所有以下任务.这不是一个理想的情况,因为 Pull Request 构建仍然会触发不必要的发布,但是,它会阻止任何实际的发布操作发生。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 - 防止 pull 请求构建触发持续部署触发器 Azure DevOps 服务器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58940407/