azure-devops - 在 Azure DevOps 发布管道中是否可以有条件地请求批准?
问题描述
我们使用 Azure DevOps Server 2019(本地)。即没有统一的管道,没有 YAML 发布管道。
场景是这样的:
- 阶段 A 调用
terraform plan
以生成计划文件 - 阶段 B 获取计划文件(不知何故,请参阅在 Azure DevOps Server 2019 (on-prem) 发布管道中,一个阶段如何将文件传递到另一个阶段?)并运行
terraform apply
。 - 在 A 阶段(和/或 B 阶段的预部署)有部署后批准,让人们在应用计划之前对其进行检查。
现在,总是请求人工批准是没有意义的。只有当计划包含有状态资源的破坏时,我们才能自动检查计划并请求批准。脚本代码不是问题,但如何有条件地请求批准?
解决方案
如另一个答案中所述,没有一流的方法可以做到这一点,但我可以建议一种使用 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'))
现在手动干预步骤将仅在满足条件时运行。
其他几点注意事项:
推荐阅读
- php - admin”或“1”=“1”是什么意思?
- android - 有什么方法可以在 Firebase AuthUI 中自定义徽标的大小/位置?
- r - R-将具有字符串值(包含2个数字并用逗号分隔)的数据框列拆分为2列
- angular - 如何从角度 2+ 的服务中获取屏幕调整大小尺寸?
- html - 下拉元素是否支持“required=true”属性?
- c - 创建具有多种元素类型的链表
- java - 即使没有抛出异常,程序也会要求 2 双打
- reactjs - react-native AJAX&API - 渲染 JSON 数据
- c# - 在 IIS 中托管 RestAPI
- python - 如何创建python游戏板