0

我有以下场景,为简洁起见进行了简化,但概述了我的问题。

我有一个 2 Job 管道。

BreakMatrix作业:在 an 上运行AdminPool并输出 2 个具有以下名称的变量ENV1ENV2. 这些名称很重要,因为它们中的每一个都与在单独的MachinePoolVM 部署池中运行的环境的名称相匹配。

Upgrade作业:依赖于BreakMatrix作业并在 VM MachinePool上运行的部署作业,带有将选择ENV1ENV2环境的标签。

我正在尝试将其中一个变量传递给每个相应的环境:

    - job: BreakMatrix
      pool: AdminPool
      steps:
      - checkout: none
      - powershell: |
          $result1 = @{"Hostname" = "Env1Value"}
          $result2 = @{"Hostname" = "Env2Value"}
          Write-Host "##vso[task.setvariable variable=ENV1;isOutput=true;]$result1"
          Write-Host "##vso[task.setvariable variable=ENV2;isOutput=true;]$result2"
        name: outputter

    - deployment: Upgrade
      dependsOn: BreakMatrix
      variables:
        agentName: $(Environment.ResourceName)
        agentName2: $(Agent.Name)
        formatted: $[ format('outputter.{0}', variables['agentName']) ]
        result1: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['agentName'])] ]
        result2: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['agentName2'])] ]
        result3: $[ dependencies.BreakMatrix.outputs[format('outputter.{0}', variables['Agent.Name'])] ]
        hardcode: $[ dependencies.BreakMatrix.outputs['outputter.ENV2'] ]
        json: $[ convertToJson(dependencies.BreakMatrix.outputs) ]
      environment:
        name: MachinePool
        resourceType: VirtualMachine
        tags: deploy-dynamic
      strategy:
        rolling:
          preDeploy:
            steps:
              - powershell: |
                  echo 'Predeploy'
                  echo "agentName: $(agentName)"
                  echo "agentName2: $(agentName2)"
                  echo "env: $(Environment.ResourceName)"
                  echo "formatted: $(formatted)"
                  echo "harcode: $(harcode)"
                  echo "result1: $(result1)"
                  echo "result2: $(result2)"
                  echo "result3: $(result3)"
                  echo "json: $(json)"
          deploy:
            steps:
              - powershell: |
                  echo 'Deploy'

ENV2预部署步骤的输出:

Predeploy
agentName: ENV2
agentName2: ENV2
env: ENV2
formatted: outputter.ENV2
hardcode: {
Hostname:Env2Value}
result1: 
result2: 
result3: 
json: {
  
outputter.ENV2: 
\"Hostname\":\"Env2Value\"

}

如果我尝试在依赖表达式中使用预定义变量,它们似乎无法正确解析,但如果我只是将它们映射到变量/格式化它们,它们就可以工作。注意:环境名称实际上是在这些作业运行之前动态计算的,因此我不能使用参数或静态/编译时变量。

关于如何仅将相关变量传递给每个环境的任何建议?

4

1 回答 1

0

我得到了开发者社区的确认,这是不可能的。

相关部分:

但恐怕达不到要求。

原因是 dependencies.xx.outputs 表达式无法读取 YAML 管道中定义的 variable(variables['Agent.Name']) 和格式表达式值。

现在只支持硬编码变量名来获取对应的作业变量值。

于 2021-10-25T07:30:52.783 回答