Azure devops Azure Devops-在作业模板之间传递变量

Azure devops Azure Devops-在作业模板之间传递变量,azure-devops,azure-pipelines,Azure Devops,Azure Pipelines,Azure DevOps yaml中的正常(非模板)作业支持作业间变量传递,如下所示: jobs: - job: A steps: - script: "echo ##vso[task.setvariable variable=skipsubsequent;isOutput=true]false" name: printvar - job: B condition: and(succeeded(), ne(dependencies.A.outputs['printvar.s

Azure DevOps yaml中的正常(非模板)作业支持作业间变量传递,如下所示:

jobs:
- job: A
  steps:
  - script: "echo ##vso[task.setvariable variable=skipsubsequent;isOutput=true]false"
    name: printvar

- job: B
  condition: and(succeeded(), ne(dependencies.A.outputs['printvar.skipsubsequent'], 'true'))
  dependsOn: A
  steps:
  - script: echo hello from B
考虑到模板不支持
dependsOn
语法,我如何在下面做类似的事情?我需要从第一个模板获得一个输出,并将其作为“environmentSlice”传递给第二个模板

- stage: Deploy
  displayName: Deploy stage
  jobs:
  - template: build-templates/get-environment-slice.yml@templates
    parameters:
      configFileLocation: 'config/config.json'

  - template: build-templates/node-app-deploy.yml@templates
    parameters:
      # Build agent VM image name
      vmImageName: $(Common.BuildVmImage)
      environmentPrefix: 'Dev'
      environmentSlice: '-$(dependencies.GetEnvironmentSlice.outputs['getEnvironmentSlice.environmentSlice'])'
我希望将两个模板分开的原因是第二个模板是部署模板,我希望在第二个模板中命名环境时使用第一个模板的输入。即node-app-deploy.yml(第二个模板)的初始部分是:

更新:

接受的解决方案确实允许您在单独的模板之间传递变量,但不适用于我的特定用例。我希望能够动态命名第二个模板的“环境”部分,即
环境:${{parameters.environmentPrefix}}${{parameters.environmentSlice}
,但这只能静态命名,因为模板是在管道启动时编译的


该解决方案的缺点是在模板之间引入了隐藏的耦合。我更希望调用管道协调在模板之间传递的参数。

您可以将
依赖项
依赖项变量
应用到模板中

见以下示例:

为了让示例更清楚,这里有两个模板文件,一个是
azure-pipeline-1.yml
,另一个是
azure-pipeline-1-copy.yml

在azure-pipelines-1.yml中,将环境值指定为输出变量:

parameters:
  environment: ''
jobs:
- job: preDeploy
  variables:
    EnvironmentName: preDeploy-${{ parameters.environment }}
  steps:
  - checkout: none
  - pwsh: |
      echo "##vso[task.setvariable variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"
    name: outputVars
jobs:
- job: deployment
  dependsOn: preDeploy
  variables:
    EnvironmentNameCopy: $[dependencies.preDeploy.outputs['outputVars.EnvironmentName']]
  steps:
  - checkout: none
  - pwsh: |
      Write-Host "$(EnvironmentNameCopy)"
    name: outputVars
然后,在azure-pipeline-1-copy.yml中,使用依赖项获取此输出变量:

parameters:
  environment: ''
jobs:
- job: preDeploy
  variables:
    EnvironmentName: preDeploy-${{ parameters.environment }}
  steps:
  - checkout: none
  - pwsh: |
      echo "##vso[task.setvariable variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"
    name: outputVars
jobs:
- job: deployment
  dependsOn: preDeploy
  variables:
    EnvironmentNameCopy: $[dependencies.preDeploy.outputs['outputVars.EnvironmentName']]
  steps:
  - checkout: none
  - pwsh: |
      Write-Host "$(EnvironmentNameCopy)"
    name: outputVars
最后,在YAML管道中,只需传递环境值

stages:
  - stage: deployQA
    jobs:
    - template: azure-pipelines-1.yml
      parameters:
        environment: FromTemplate1
    - template: azure-pipeline-1-copy.yml
现在,您可以在第二个模板作业中看到值get successfully:

可以避免调用模板中的依赖关系。但是,正如OP所说,无法动态创建环境名称

下面是一个“调用”模板的示例,它首先调用另一个模板(devops variables.yml),该模板设置我们希望在以后的模板(devops callee.yml)中使用的一些环境变量:

在devops-variables.yml文件中,我有:

"##vso[task.setvariable variable=SomeParameter;isOutput=true;]Wibble"
然后,在“devops callee.yml”中,我只是这样使用它:

  parameters:
  - name: SomeParameter
    default: ''

  jobs:
  - deployment: 'Called_Job'
    condition: succeeded()
    displayName: 'Called Job'
    environment: "Development"
    pool:
      vmImage: 'windows-2019'
    dependsOn:
    - Variables_Job
    variables:
      SomeParameter: ${{parameters.SomeParameter}}
    strategy:
      runOnce:
        deploy:
          steps:
          - download: none
          - task: AzureCLI@2
            condition: succeeded()
            displayName: 'An Echo Task'
            inputs:
              azureSubscription: "$(TheServiceConnection)"
              scriptType: pscore
              scriptLocation: inlineScript
              inlineScript: |
                echo "Before"
                echo "$(SomeParameter)"
                echo "After"
输出:

2021-04-10T09:22:29.6188535Z Before
2021-04-10T09:22:29.6196620Z Wibble
2021-04-10T09:22:29.6197124Z After
这样,被调用方就不会引用调用方。不幸的是,在被调用方中设置环境如下:

environment: "$(SomeParameter)"

不起作用-您将得到一个带有文字字符“$(SomeParameter)”的环境。

嗨,Merlin,感谢您将这些放在一起。我没有意识到可以用不同的模板表达作业之间的依赖关系。缺点是模板之间存在隐藏的耦合。不幸的是,这个解决方案不适用于我的用例。模板的environment部分只能使用模板参数命名,因为它是在作业启动时而不是运行时编译的。很遗憾,因为我想动态命名我的环境,但似乎缺少该功能。我会将您的答案标记为已接受,并添加一条警告。我有类似的要求,在我的案例中是第一个模板规定环境,其中azure资源的名称是动态构造的。在稍后部署的模板应用程序中,需要传递动态构造的资源名称的输出。@Merlin提供的解决方案确实解决了这个问题,但是,它创建了一个隐藏的依赖项,最好避免这种依赖项。谢谢。将Azure文档链接到