将变量传递给天蓝色管道中的yaml模板(如参数)

时间:2020-08-20 10:04:10

标签: yaml azure-pipelines

为了尽量减少重复的构建脚本,我们在管道中使用了模板。这些模板具有参数。但是,我现在遇到了一个问题,因为我需要将数据传递到管道启动时尚不可用的模板。 (数据是在管道过程中的某些步骤中生成的)。由于管道启动时会扩展参数,因此我无法通过参数将数据传递给模板。

我知道我可以引用管道中不同任务,作业和阶段的输出变量,但是我正在使用的模板不知道要在其中执行的周围管道。因此,模板不知道如何引用模板之外其他作业的输出变量,仅仅是因为模板不知道之前执行过哪些作业。

有什么方法可以在模板中映射变量?理想情况下,我想做这样的事情:

stages:
- stage: Stage1
  jobs:
  - some job that creates output variables
- stage: Stage2
  jobs:
  - template: 'myTemplate.yaml'
    variables:
      data1: $[ stageDependencies.Stage1.some_job.outputs['taskname.data1']]

,并在模板中提供data1变量。

因此,我试图避免必须使用:$[ stageDependencies.Stage1.some_job.outputs['taskname.data1']] 在模板中,因为Stage1甚至可能不在使用该模板的所有管道中都存在。

如果模板仅包含步骤而不是多个作业,我实际上可以这样做:

- stage: Stage2
  jobs:
  - job: Job1
    variables:
      data1: $[ stageDependencies.Stage1.some_job.outputs['taskName.data1']]

    steps:
    - template: templates/Azure/CreateTenant.yaml

不幸的是,我的模板包含多个作业

更新: 我已输入功能请求以更好地支持这种情况: https://developercommunity.visualstudio.com/idea/1207453/yaml-template-variablesparameters-that-are-expande.html

1 个答案:

答案 0 :(得分:1)

如果模板仅包含步骤而不是多个作业,我实际上可以执行此操作。不幸的是,我的模板包含多个作业

要解决此问题,您可以在阶段级别而不是作业级别定义变量:

  - stage: Stage2
    variables:
      data1: $[ stageDependencies.Stage1.some_job.outputs['taskName.data1']]

    jobs:
      - template: templates/Azure/CreateTenant.yaml

然后,我们可以避免在模板中使用$[ stageDependencies.Stage1.some_job.outputs['taskname.data1']]

您可以查看文档Variable scopes了解更多详细信息。