Azure devops 通过嵌套模板传递参数(或在变量上声明IF条件)

Azure devops 通过嵌套模板传递参数(或在变量上声明IF条件),azure-devops,yaml,azure-pipelines,Azure Devops,Yaml,Azure Pipelines,我希望能够通过YAML管道传递管道参数,而不必在每个YAML文件中定义参数 本质上,我有一个主YAML文件,它调用一个stage YAML,它有多个嵌套作业YAML,而这些作业又调用嵌套步骤YAML;基本上使用模板构建我的管道: 这是一个树列表示例文件夹 E:. ├───01_stage (many files per folder) ├───02_jobs (many files per folder) ├───03_steps (many files per folder) └───...m

我希望能够通过YAML管道传递管道参数,而不必在每个YAML文件中定义参数

本质上,我有一个主YAML文件,它调用一个stage YAML,它有多个嵌套作业YAML,而这些作业又调用嵌套步骤YAML;基本上使用模板构建我的管道:

这是一个树列表示例文件夹

E:.
├───01_stage (many files per folder)
├───02_jobs (many files per folder)
├───03_steps (many files per folder)
└───...main pipeline files
理想情况下,我希望根据管道是PROD还是非PROD,在签出存储库时运行IF条件。我可以将其定义为一个参数,但也可以将其定义为一个变量据我所知;不能对变量使用IF条件。

这很好

- ${{ if eq(parameters.pester, true) }}:     # or even as variables['pester']
  - name: pester
    value: yes
这不好

- ${{ if eq(variables.pester, true) }}:     # or even as variables['pester']
  - name: pester
    value: yes
我希望它运行的条件是嵌套远远低于许多模板,并且必须对所有内容重新编码以确认每个文件中声明和传递的参数值是绝对痛苦的

这就是我想要的:

steps:

- ${{ if eq(parameters['masterTagged'], 'true') }}:   # here
  - checkout: masterTagged
    displayName: Repo Tagged

- ${{ if ne(parameters['masterTagged'], 'true') }}:   # here
  - checkout: self
    displayName: Repo Self

- template: /.pipelines/03_steps/ssh_install.yml

- template: /.pipelines/03_steps/tf_install.yml
  parameters:
    terraformVersion: ${{ parameters['terraformVersion'] }}

- ...many more templates
以下是我的主要YAML管道文件:

parameters:
- name: artifactory_base
  type: boolean
  default: true

# ...many more params

- name: pester
  type: boolean
  default: true

- name: planDeploy
  type: boolean
  default: true

- name: useBackupAgent
  type: boolean
  default: false

- name: masterTagged  # key param
  type: boolean
  default: true


name: Team2

pr: none
resources:
  repositories:
  - repository: masterTagged
    endpoint: nationwide-ccoe
    name: my-github-org/my-github-repo
    type: github
    ref: refs/tags/v2.0.3
trigger: none
variables:
- template: /.pipelines/config/sub-asdfasdf.config.yml
- template: /.pipelines/config/namingstd.config.yml
- ${{ if eq(parameters.artifactory_base, true) }}:
  - name: artifactory_base
    value: yes
# ...many more conditions
- ${{ if eq(parameters.pester, true) }}:
  - name: pester
    value: yes
- ${{ if eq(parameters.planDeploy, true) }}:
  - name: planDeploy
    value: yes

stages:
- template: /.pipelines/01_stage/lz_deploy.yml
  parameters:
    ${{ if eq(parameters.useBackupAgent, false) }}:
      pool:
        vmImage: Ubuntu 18.04
    ${{ if eq(parameters.useBackupAgent, true) }}:
      pool:
        name: backupAgents
    terraformVersion: $(TERRAFORM_VERSION)

是否可以设置此
mastertaged
参数,并使其在不必每次声明的情况下一直向下过滤?

还有,;是否有可能以这种方式使用变量而不是参数(我知道参数在变量之前展开):

…如果是的话,我这段时间都做错了吗

注:

我知道您可以在签出任务上使用标准任务条件(如下所示);但是,在两个任务上进行“切换”会破坏签出存储库的文件夹路径。即使我们只签出存储库,它也会将另一个文件夹级别添加到$SYSTEM\u DEFAULTWORKINGDIRECTORY。这样做需要对YAML管线的当前结构进行更多的重新编码

如果可以,但我知道这是不可能的(如其他人的请求所示),我将在存储库引用上启用一个参数或变量:


是否可以设置此masterTagged参数,并将其一直向下过滤,而无需每次声明它?

否,因为参数的“作用域”是定义它们的文件。这是因为它们在管道首次编译时被扩展。(见>)

可以对变量使用IF条件,但是不能对模板内的变量使用模板表达式(用{{}}包装),因为变量在模板扩展点不存在/尚未填充

一种选择是按照您的建议使用签出任务的条件,并处理默认工作目录的额外文件夹级别。不久前我也做过类似的事情,我们的解决方案是将repo文件夹的内容复制到默认的工作目录中

另一个选项是在顶级管道文件中执行签出。这将允许您使用参数为签出步骤设置模板,而无需将其全部传递到文件中。这是我建议的选项,因为您不必处理第一个选项的文件夹结构问题

这看起来像这样:

参数:
-姓名:masterTagged
默认值:true
类型:布尔型
资源:
存储库:
-存储库:mastertaged
终点:全国ccoe
名称:我的github组织/我的github回购
类型:github
参考:参考文件/标签/v2.0.3
步骤:
-${{如果eq(parameters.mastertaged,true)}}:
-结帐:主标签
-${{如果eq(parameters.mastertaged,false)}:
-结帐:self
-模板:./path/to/template.yml

我希望这能回答您的问题。

是否可以设置此masterTagged参数,并对其进行筛选,而无需每次声明它?

否,因为参数的“作用域”是定义它们的文件。这是因为它们在管道首次编译时被扩展。(见>)

可以对变量使用IF条件,但是不能对模板内的变量使用模板表达式(用{{}}包装),因为变量在模板扩展点不存在/尚未填充

一种选择是按照您的建议使用签出任务的条件,并处理默认工作目录的额外文件夹级别。不久前我也做过类似的事情,我们的解决方案是将repo文件夹的内容复制到默认的工作目录中

另一个选项是在顶级管道文件中执行签出。这将允许您使用参数为签出步骤设置模板,而无需将其全部传递到文件中。这是我建议的选项,因为您不必处理第一个选项的文件夹结构问题

这看起来像这样:

参数:
-姓名:masterTagged
默认值:true
类型:布尔型
资源:
存储库:
-存储库:mastertaged
终点:全国ccoe
名称:我的github组织/我的github回购
类型:github
参考:参考文件/标签/v2.0.3
步骤:
-${{如果eq(parameters.mastertaged,true)}}:
-结帐:主标签
-${{如果eq(parameters.mastertaged,false)}:
-结帐:self
-模板:./path/to/template.yml

我希望这能回答你的问题。

谢谢,多姆。我不认为当我有子阶段时,高级别的结帐将起作用。我在另一个论坛上收到了M$的回复,回答是它不起作用;但是,签出和处理子文件夹将非常有用。谢谢,多姆。我不认为当我有子阶段时,高级别的结帐将起作用。我在另一个论坛上收到了M$的回复,回答是它不起作用;但是,签出和处理子文件夹将非常有用。啊
- ${{ if eq(variables.pester, true) }}:     # or even as variables['pester']
  - name: pester
    value: yes
- checkout: masterTagged
  condition: eq(variables['masterTagged'], 'true')
  displayName: Repo Tagged

- checkout: self
  condition: ne(variables['masterTagged'], 'true')
  displayName: Repo Self
resources:
  repositories:
  - repository: masterTagged
    endpoint: nationwide-ccoe
    name: my-github-org/my-github-repo
    type: github
    ref: ${{ parameters.repoRef }}    # here