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

vip*_*pes 6 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.skipsubsequent'], 'true'))
  dependsOn: A
  steps:
  - script: echo hello from B
Run Code Online (Sandbox Code Playgroud)

考虑到模板不支持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'])'
Run Code Online (Sandbox Code Playgroud)

我希望将两个模板分开的原因是第二个模板是部署模板,我希望在命名第二个模板中的环境时从第一个模板输入。即 node-app-deploy.yml(第二个模板)的初始部分是:

  jobs:
  - deployment: Deploy
    displayName: Deploy
    # Because we use the environmentSlice to name the environment, we have to have it passed in rather than 
    # extracting it from the config file in steps below
    environment: ${{ parameters.environmentPrefix }}${{ parameters.environmentSlice }}
Run Code Online (Sandbox Code Playgroud)

更新:

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

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

Mer*_*SFT 5

您可以将depend on和应用于dependency variable模板。

\n\n

请参阅下面的示例:

\n\n

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

\n\n

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

\n\n
parameters:\n\xc2\xa0\xc2\xa0environment:\xc2\xa0\'\'\njobs:\n-\xc2\xa0job:\xc2\xa0preDeploy\n\xc2\xa0\xc2\xa0variables:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0EnvironmentName:\xc2\xa0preDeploy-${{\xc2\xa0parameters.environment\xc2\xa0}}\n\xc2\xa0\xc2\xa0steps:\n\xc2\xa0\xc2\xa0-\xc2\xa0checkout:\xc2\xa0none\n\xc2\xa0\xc2\xa0-\xc2\xa0pwsh:\xc2\xa0|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0echo\xc2\xa0"##vso[task.setvariable\xc2\xa0variable=EnvironmentName;isOutput=true]$($env:ENVIRONMENTNAME)"\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0name:\xc2\xa0outputVars\n
Run Code Online (Sandbox Code Playgroud)\n\n

然后,在azure-pipeline-1-copy.yml中使用依赖项来获取此输出变量:

\n\n
jobs:\n-\xc2\xa0job:\xc2\xa0deployment\n\xc2\xa0\xc2\xa0dependsOn:\xc2\xa0preDeploy\n\xc2\xa0\xc2\xa0variables:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0EnvironmentNameCopy:\xc2\xa0$[dependencies.preDeploy.outputs[\'outputVars.EnvironmentName\']]\n\xc2\xa0\xc2\xa0steps:\n\xc2\xa0\xc2\xa0-\xc2\xa0checkout:\xc2\xa0none\n\xc2\xa0\xc2\xa0-\xc2\xa0pwsh:\xc2\xa0|\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0Write-Host\xc2\xa0"$(EnvironmentNameCopy)"\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0name:\xc2\xa0outputVars\n
Run Code Online (Sandbox Code Playgroud)\n\n

最后,在YAML pipeline中,只需要传递环境值

\n\n
stages:\n\xc2\xa0\xc2\xa0-\xc2\xa0stage:\xc2\xa0deployQA\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0jobs:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0-\xc2\xa0template:\xc2\xa0azure-pipelines-1.yml\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0parameters:\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0environment:\xc2\xa0FromTemplate1\n\xc2\xa0\xc2\xa0\xc2\xa0\xc2\xa0-\xc2\xa0template:\xc2\xa0azure-pipeline-1-copy.yml\n
Run Code Online (Sandbox Code Playgroud)\n\n

现在,您可以看到第二个模板作业中成功获取了值:

\n\n

在此输入图像描述

\n

  • 嗨梅林,感谢您将这些放在一起。我没有意识到您可以在不同模板中表达作业之间的依赖关系。缺点是模板之间存在隐藏的耦合。不幸的是,对我来说,这个解决方案不适用于我的用例。模板的环境部分只能使用模板参数命名,因为它是在作业启动时而不是运行时编译的。很遗憾,因为我想动态命名我的环境,但看起来缺少该功能。我会将您的答案标记为已接受并添加警告。 (7认同)