【问题标题】:How to simplify Azure pipeline and avoid to much repeating如何简化 Azure 管道并避免大量重复
【发布时间】:2020-12-27 18:32:09
【问题描述】:

我有这个管道(不相关的部分被删除):

stages:
  - stage: 'PreSteps'
    displayName: 'Preparation Steps'
    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"

  - stage: 'S_Build'
    dependsOn: 'PreSteps'
    condition: gt(dependencies.PreSteps.outputs['Check_changes.bash_script1.Changes'], 0)
    displayName: 'Build and Publish Changed Projects'
    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'] ]
    jobs:
    - template: build.yml
      parameters:
        Projects:
        - $(Project_1)
        - $(Project_2)
        - $(Project_3)
        - $(Project_4)

  - stage: 'D_Release'
    dependsOn:
      - 'S_Build'
      - 'PreSteps'
    condition: eq(stageDependencies.S_Build.result, 'Succeeded')
    displayName: 'Release Changed Projects to DEV'
    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'] ]
    jobs:
    - template: release.yml
      parameters:
        Projects:
        - $(Project_1)
        - $(Project_2)
        - $(Project_3)
        - $(Project_4)

  - stage: 'P_Release'
    dependsOn:
      - 'D_Release'
      - 'PreSteps'
    condition: eq(stageDependencies.D_Release.result, 'Succeeded')
    displayName: 'Release Changed Projects to PROD'
    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'] ]
    jobs:
    - template: release.yml
      parameters:
        Projects:
        - $(Project_1)
        - $(Project_2)
        - $(Project_3)
        - $(Project_4)

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

【问题讨论】:

    标签: yaml azure-pipelines dry azure-pipelines-yaml


    【解决方案1】:

    您可以使用runtime parameters 来简化上述 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)
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-06-14
      • 1970-01-01
      • 1970-01-01
      • 2021-08-03
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多