在 Azure DevOps 发布管道中,如何将具有不同目标文件夹的部署组部署到多个 VM

In an Azure DevOps release pipeline how do you deploy to multiple VMs a deployment group with different target folders

我开始在 azure DevOps 中设置发布管道,将 windows 服务部署到只有一个 VM 和代理设置的部署组。我在部署文件夹的管道中设置了一个变量。

我现在正在尝试扩展它以部署到 2 个服务器。我已经将第二台服务器添加到部署组中并且注册成功了。在此服务器上,部署需要转到不同的驱动器。

似乎没有办法通过代理为变量指定不同的值。

我尝试在 ui 中进行谷歌搜索和拖网搜索,但到目前为止我一无所获。我想知道变量是否正确?

您可以从脚本中设置变量:https://docs.microsoft.com/en-us/azure/devops/pipelines/process/variables?view=azure-devops&tabs=classic%2Cpowershell#set-variables-in-scripts

编写一个脚本,能够确定它在哪台机器上 运行 并为变量分配适当的值。

同意 Tomasz 的观点。

我们可以通过power script Write-Host "##vso[task.setvariable variable={variable name}]{variable value}"设置变量,然后我们可以在另一个任务中调用该变量。

详情请参考

另外,我们可以通过这个APIUpdate a release definition.

更新发布管道变量

a。打开发布管道并添加一个新变量 test 并授予 test Build Service (xxx) 帐户编辑​​发布管道权限。 (打开发布管道 --> ... --> 安全 --> 编辑发布管道设置为允许)。

b。打开管道,启用功能允许脚本访问 OAuth 令牌(单击代理作业名称=>其他选项)添加任务 powershell 并输入下面的脚本以更新发布变量测试值。

$url = "https://vsrm.dev.azure.com/{org name}/{project name}/_apis/release/definitions/{release definition ID}?api-version=6.0-preview.4"
Write-Host "URL: $url"
$pipeline = Invoke-RestMethod -Uri $url -Headers @{
    Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"
}
Write-Host "Pipeline = $($pipeline | ConvertTo-Json -Depth 100)"

# Update an existing variable named test to its new value 
$pipeline.variables.test.value= {new variable value}

####****************** update the modified object **************************
$json = @($pipeline) | ConvertTo-Json -Depth 99


$updatedef = Invoke-RestMethod -Uri $url -Method Put -Body $json -ContentType "application/json" -Headers @{Authorization = "Bearer $env:SYSTEM_ACCESSTOKEN"}

write-host "==========================================================" 
Write-host "The value of Varialbe 'test' is updated to" $updatedef.variables.test.value
write-host "=========================================================="

我要回答我自己的问题,因为解决方案实际上是@Martin A @Tomasz Kaniewski 和@Vito Liu-MSFT 提供的答案的组合,并进行了相当多的试验和错误。我希望这会对其他人有所帮助。

环境变量是识别部署文件夹的关键,因此我在每个 VM 上设置了一个名为 AutomationDeploymentRoot 的系统环境变量

您必须在每个 VM 上重新启动 Azure Pipelines Agent windows 服务,然后才能获取对环境变量的更改!

我发现不同任务对环境变量的支持非常不一致 - 它们似乎在脚本任务中运行良好,但在 CopyFiles 等其他任务中效果不佳。

最可靠的方法是将环境变量复制到我在变量选项卡上设置的管道变量 (deployment.root),就像这样

然后按照 Thomasz 和 Vito 的建议从脚本设置变量

steps:
- script: |
   @echo ##vso[task.setvariable variable=deployment.root]%AutomationDeploymentRoot%
   
  displayName: 'Set Deployment Folder'

运行时,c:\temp\deploy 被目标机器的正确文件夹替换,一切都变绿了!