【问题标题】:In Azure DevOps release pipeline is it possible to request approval conditionally?在 Azure DevOps 发布管道中是否可以有条件地请求批准?
【发布时间】:2020-05-31 15:47:05
【问题描述】:

我们使用 Azure DevOps Server 2019(本地)。 IE。没有统一的管道,没有 YAML 发布管道。

场景是这样的:

现在,总是请求人工批准是没有意义的。只有当计划包含有状态资源的破坏时,我们才能自动检查计划并请求批准。脚本代码不是问题,但是如何有条件地请求批准?

【问题讨论】:

    标签: azure-devops azure-pipelines azure-pipelines-release-pipeline


    【解决方案1】:

    正如另一个答案中所述,没有一流的方法可以做到这一点,但我可以建议一种使用 Rest API 和 powerShell 完成它的方法。它涉及一个带有手动干预步骤的无代理作业的条件集。

    所以发布变量不能跨代理作业或Stages 流动,但您可以做的是更新发布变量,方法是通过 Rest API 调用更新发布本身的实例。然后您可以在后续的作业或阶段中使用该变量。

    在您获取 Terraform 计划输出的作业中,假设您正在捕获有添加、更改或销毁操作时,您可以将该输出编组回发布版,并在以后使用它。

    所以这个例子借用了Stefan Stranger的这篇文章。另请参阅Donavan Brown 的这篇文章。

    假设以下 powerShell 脚本在第一个代理阶段运行并且可以访问您的计划结果。 我在发布定义中预定义了一个名为 TerraformPlanResult 的变量。

    $releaseurl = ('{0}{1}/_apis/release/releases/{2}?api-version=5.0' -f $($env:SYSTEM_TEAMFOUNDATIONSERVERURI), $($env:SYSTEM_TEAMPROJECTID), $($env:RELEASE_RELEASEID)  )
    
    Write-Host "URL: $releaseurl"
    $Release = Invoke-RestMethod -Uri $releaseurl -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}
    
    #update the predefined $TerraformPlanResult variable
    $Release.variables.TerraformPlanResult.value = $YourPlanResult
    
    
    Write-Output ('Updating Release Definition Instance')
    $json = @($Release) | ConvertTo-Json -Depth 99
    Invoke-RestMethod -Uri $releaseurl -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN" }
    

    现在$TerraformPlanResult 变量在发布级别可用,您可以使用此条件定义无代理作业。

    and(succeeded(), in(variables['TerraformPlanResult'], 'Add', 'Change','Destroy'))

    现在manual intervention 步骤将仅在满足条件时运行。

    其他几点说明:

    • 您还需要确保您的Project Collection Build Service 有权更新版本定义。
    • 您要确保第一个代理作业能够访问 OAuth 令牌,以便您可以进行其余的调用。

    【讨论】:

    • 这是一个非常有趣的想法。那么,输出变量可以从一个阶段流向另一个阶段,但不能从一个工作流到另一个工作?真可惜。
    • 酷我希望它有所帮助!对于 YAML 管道,您可以选择跨作业或阶段来确定任何变量的范围。对于经典定义,变量仅限于作业的范围。如果你在那个领域,Rest API 就是你要走的路。这是文档的输出变量部分的链接。 docs.microsoft.com/en-us/azure/devops/pipelines/process/… 建议阅读整个变量主题。它是基于 Classic\YAML 的所有不同用途的最综合信息。
    【解决方案2】:

    目前没有这样的功能来有条件地批准阶段。我认为基于当前的功能我们无法实现。

    这里已经提交了一个建议票:Conditional deployment approvals,您可以去投票以帮助在未来的版本中实现这一目标。

    但是我们可以通过using approvals and gates to control your deployments 扩展条件,请检查一下。 希望对您有所帮助。

    【讨论】:

    • gate 方法建议我自己模仿部署前/后的逻辑,例如从某个地方获取批准者的电子邮件地址、发送电子邮件、呈现批准 GUI 等......这不是一个现实的方法,除非我错过了一些东西。请详细说明该选项。
    • 是的,我的意思是我们可以将审批和门结合起来,但是对于您的要求我们无法实现,不支持有条件地请求审批。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-06-01
    • 1970-01-01
    相关资源
    最近更新 更多