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

时间:2020-08-24 12:45:43

标签: azure azure-devops azure-devops-self-hosted-agent

我首先在azure DevOps中设置了发布管道,以将Windows服务部署到只有一个VM并设置了代理的部署组。我在部署文件夹的管道中设置了一个变量。

我现在正在尝试将此扩展到2个服务器。我已将第二台服务器添加到部署组中,并且注册已成功进行。在此服务器上,部署需要转到其他驱动器。

似乎没有一种方法可以由代理为变量指定不同的值。

我已经尝试在ui中进行谷歌搜索和拖网捕捞,到目前为止,我什么都没发现。我想知道变量是否正确?

3 个答案:

答案 0 :(得分:2)

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

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

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

我发现不同任务之间对环境变量的支持非常不一致-它们似乎在脚本任务中运行良好,但在诸如CopyFiles之类的其他任务中却表现不佳。

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

Screen Shot of variables

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

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

在运行c:\ temp \ deploy时,将其替换为目标计算机的正确文件夹,并且一切变为绿色!

答案 1 :(得分:1)

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

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

答案 2 :(得分:1)

同意Tomasz。

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

有关更多详细信息,请参阅this answer

此外,我们可以通过此API Update 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 "=========================================================="