【问题标题】:In an Azure DevOps release pipeline how do you deploy to multiple VMs a deployment group with different target folders在 Azure DevOps 发布管道中,如何将具有不同目标文件夹的部署组部署到多个 VM
【发布时间】:2020-08-24 12:45:43
【问题描述】:

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

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

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

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

【问题讨论】:

  • 在部署组中只能设置标签,其实用处不大。但是,在功能选项卡中有很多信息。也许您可以在目标机器上设置一个可以以某种方式读取的环境变量?

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


【解决方案1】:

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

环境变量是识别部署文件夹的关键,因此我在每个虚拟机上设置了一个名为 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 被目标机器的正确文件夹替换,一切都变绿了!

【讨论】:

  • 您好 Twisted,您可以接受您的回答。在这种情况下,其他人可以直接找到有用的解决方案。谢谢。
【解决方案2】:

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

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

【讨论】:

    【解决方案3】:

    同意托马斯。

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

    详情请咨询this answer

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

    一个。打开发布管道并添加一个新变量 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 "=========================================================="
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2022-12-05
      • 1970-01-01
      • 2021-02-27
      • 2020-07-04
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多