Yaml 如何简化Azure管道并避免大量重复

Yaml 如何简化Azure管道并避免大量重复,yaml,azure-pipelines,dry,azure-pipelines-yaml,Yaml,Azure Pipelines,Dry,Azure Pipelines Yaml,我已将此管道(非相关部分移除): 基本上,我在bash_script1中生成了一些值,我需要在所有阶段中使用这些值。 有没有办法避免在每个阶段重复变量?我不能在参数中直接使用语法$[],因为它们不会在模板中展开。您可以使用它简化上述yaml管道。请查看以下步骤: 1、在运行时参数部分定义阶段名称和模板: parameters: - name: Stages type: object default: - StageName: S_Build Template: build.y

我已将此管道(非相关部分移除):

基本上,我在bash_script1中生成了一些值,我需要在所有阶段中使用这些值。 有没有办法避免在每个阶段重复变量?我不能在参数中直接使用语法
$[]
,因为它们不会在模板中展开。

您可以使用它简化上述yaml管道。请查看以下步骤:

1、在运行时参数部分定义阶段名称和模板:

parameters:
- name: Stages
  type: object
  default:
  - StageName: S_Build
    Template: build.yml 
    Depends: PreSteps
  - StageName: D_Release
    Template: release.yml
    Depends: S_Build
  - StageName: P_Release
    Template: release.yml
    Depends: D_Release
2,使用
${…}
表达式循环遍历Stages参数:请参见下面的完整示例:

parameters:
- name: Stages
  type: object
  default:
  - StageName: S_Build
    Template: build.yml 
    Depends: PreSteps
  - StageName: D_Release
    Template: release.yml
    Depends: S_Build
  - StageName: P_Release
    Template: release.yml
    Depends: D_Release

trigger: none
#
stages:
- stage: PreSteps
  jobs: 
  - job: Check_changes
    steps:
    - task: Bash@3
      name: 'bash_script1'
      inputs:
        targetType: 'inline'
        script: |
          # do some stuff
          
          echo "##vso[task.setvariable variable=SomeVariable_1;isOutput=True]SomeValue_1"
          echo "##vso[task.setvariable variable=SomeVariable_2;isOutput=True]SomeValue_2"
          echo "##vso[task.setvariable variable=SomeVariable_3;isOutput=True]SomeValue_3"
          echo "##vso[task.setvariable variable=SomeVariable_4;isOutput=True]SomeValue_4"
          echo "##vso[task.setvariable variable=Changes;isOutput=True]4"

- ${{each stage in parameters.Stages}}:    
  - stage: ${{stage.StageName}}
    variables:
      Project_1: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_1'] ]
      Project_2: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_2'] ]
      Project_3: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_3'] ]
      Project_4: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_4'] ]
    dependsOn: 
    - ${{stage.Depends}}
    ${{ if eq(stage.StageName, 'S_Build') }}: 
      condition: gt(dependencies.PreSteps.outputs['Check_changes.bash_script1.Changes'], 0)
    ${{ if ne(stage.StageName, 'S_Build') }}:
      condition: succeeded('${{stage.Depends}}')
    jobs:
    - template: ${{stage.Template}}
      parameters:
        Projects:
        - $(Project_1)
        - $(Project_2)
        - $(Project_3)
        - $(Project_4)
parameters:
- name: Stages
  type: object
  default:
  - StageName: S_Build
    Template: build.yml 
    Depends: PreSteps
  - StageName: D_Release
    Template: release.yml
    Depends: S_Build
  - StageName: P_Release
    Template: release.yml
    Depends: D_Release

trigger: none
#
stages:
- stage: PreSteps
  jobs: 
  - job: Check_changes
    steps:
    - task: Bash@3
      name: 'bash_script1'
      inputs:
        targetType: 'inline'
        script: |
          # do some stuff
          
          echo "##vso[task.setvariable variable=SomeVariable_1;isOutput=True]SomeValue_1"
          echo "##vso[task.setvariable variable=SomeVariable_2;isOutput=True]SomeValue_2"
          echo "##vso[task.setvariable variable=SomeVariable_3;isOutput=True]SomeValue_3"
          echo "##vso[task.setvariable variable=SomeVariable_4;isOutput=True]SomeValue_4"
          echo "##vso[task.setvariable variable=Changes;isOutput=True]4"

- ${{each stage in parameters.Stages}}:    
  - stage: ${{stage.StageName}}
    variables:
      Project_1: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_1'] ]
      Project_2: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_2'] ]
      Project_3: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_3'] ]
      Project_4: $[ stageDependencies.PreSteps.Check_changes.outputs['bash_script1.SomeVariable_4'] ]
    dependsOn: 
    - ${{stage.Depends}}
    ${{ if eq(stage.StageName, 'S_Build') }}: 
      condition: gt(dependencies.PreSteps.outputs['Check_changes.bash_script1.Changes'], 0)
    ${{ if ne(stage.StageName, 'S_Build') }}:
      condition: succeeded('${{stage.Depends}}')
    jobs:
    - template: ${{stage.Template}}
      parameters:
        Projects:
        - $(Project_1)
        - $(Project_2)
        - $(Project_3)
        - $(Project_4)