繁体   English   中英

在 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 中使用谷歌搜索和拖网搜索,但到目前为止我一无所获。 我想知道变量是否是正确的?

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

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

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

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

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

变量的屏幕截图

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

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

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

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

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

同意托马斯。

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

请参阅此答案以获取更多详细信息

此外,我们可以通过此 API 更新发布管道变量Update a release definition

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

打开管道,启用允许脚本访问 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 "=========================================================="

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM