正如另一个答案中所述,没有一流的方法可以做到这一点,但我可以建议一种使用 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 步骤将仅在满足条件时运行。
其他几点说明: