首页 > 解决方案 > 在 Azure DevOps 发布管道中是否可以有条件地请求批准?

问题描述

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

场景是这样的:

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

标签: azure-devopsazure-pipelinesazure-pipelines-release-pipeline

解决方案


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

因此,发布变量不能跨代理作业或阶段流动,但您可以做的是更新发布变量,方法是通过 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'))

有条件的人工干预

现在手动干预步骤将仅在满足条件时运行。

其他几点注意事项:

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

    在此处输入图像描述


推荐阅读