git - 防止 pull 请求构建触发持续部署触发器 Azure DevOps 服务器

标签 git powershell azure-devops azure-pipelines

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 filtersContinuous deployment trigger ,但没有运气。我试过使用 Exclude 设置它和设置 Build branchpull/* , refs/pull/*merge但是这些过滤器没有任何运气,发布仍在排队中。

我想知道是否有更好的方法来处理这种情况,或者是否可以将其他过滤器添加到 Continuous deployment trigger减少不需要的发布排队。

最佳答案

我们已经确定目前没有针对此问题的“最佳解决方案”,以下是一些替代方案。

简单的解决方法

  • 将您当前的 PR 策略构建定义与发布定义取消链接并创建新的构建定义(或克隆退出)。将此新构建定义链接到您的版本并手动运行它。
  • 从您的发布定义中删除持续部署,并从您完成的构建中手动创建您的发布。
  • 使用继续部署并将其设置为某个分支。那么你的部署只会在 PR 完成后触发(如果你为你的build设置了 CI)。

  • enter image description here

    发布变量和自定义条件(单个工件)

    如果您的版本中只有一个工件,您可以使用 Build.SourceBranchName 跳过作业级别的任务。 release variable :

    enter image description here

    当变量表达式解析时,如果 Build.SourceBranchName变量等于 merge它跳过以下所有任务:

    enter image description here

    发布变量和自定义条件(多个工件)

    最后,如果您在发布中使用多个工件,您仍然可以完成上述行为,尽管您需要使用 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 中也可见。

    enter image description here

    enter image description here

    最终我们想看看触发工件的源分支名称变量是否设置为 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/

    相关文章:

    git - 如何解决与 Github API merge 的冲突

    git - .gitignore 的限制深度

    json - 在 Azure JSON 模板中创建 CustomScript 的正确方法

    git - 如何镜像Github和VS Online?

    git - 在 Git 中,如何 rebase + 压缩历史记录中具有多个 merge 提交的分支,而不选择一个全新的分支

    git - 在 git 中转义在文件名中添加前导 "-"?

    powershell - 将 Cmdlet 输出与字符串连接起来

    powershell - 为什么 Write-Host "$PSCommandPath"没有输出我当前的路径?

    azure-devops - 如何将 git lfs 与 Visual Studio Team Services 托管的构建代理一起使用

    azure - 设置命令不适用于 Azure Kubernetes 群集中的部署更新