Yaml 如何简化Azure管道并避免大量重复
我已将此管道(非相关部分移除): 基本上,我在bash_script1中生成了一些值,我需要在所有阶段中使用这些值。 有没有办法避免在每个阶段重复变量?我不能在参数中直接使用语法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
$[]
,因为它们不会在模板中展开。您可以使用它简化上述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)