Search code examples
yamlazure-pipelinesdry

How to use DRY-Principle in yaml files in Azure pipelines?


I keep catching myself mindlessly copying and reusing parts of yaml files. Now I have several files with partially identical sections, such as the following, which is found in more than 15 files in a project, and copy pasted.

parameters:
  - name: stage
    type: string
    default: 'dev'
    values:
      - 'dev'
      - 'prelive'
      - 'live'
  - name: environment
    type: string
    default: ‘eu’
    values:
      - ‘na’
      - ‘eu’
      - ‘me’
variables:
  - name: Subscription
    ${{ if and(eq(parameters.stage, 'dev') , eq(parameters.environment, ‘eu’)) }}:
      value: APP EU-Dev
    ${{ if and(eq(parameters.stage, 'prelive') , eq(parameters.environment, ‘eu’)) }}:
      value: APP EU-Qa
    ${{ if and(eq(parameters.stage, 'live') , eq(parameters.environment, ‘eu’)) }}:
      value: APP EU-Live
    ${{ if and(eq(parameters.stage, 'prelive') , eq(parameters.environment, ‘na’)) }}:
      value: APP NA-Preprod
    ${{ if and(eq(parameters.stage, 'live') , eq(parameters.environment, ‘na’)) }}:
      value: APP NA-Prod

The above section is found unchanged in several files. Is there a way to avoid this and somehow centralize it?


Solution

  • You should be able to do something like:

    reusable-template-param.yml:

    parameters:
      - name: stage
        type: string
        default: 'dev'
        values:
          - 'dev'
          - 'prelive'
          - 'live'
      - name: environment
        type: string
        default: ‘eu’
        values:
          - ‘na’
          - ‘eu’
          - ‘me’
    variables:
      - name: Subscription
        ${{ if and(eq(parameters.stage, 'dev') , eq(parameters.environment, ‘eu’)) }}:
          value: APP EU-Dev
        ${{ if and(eq(parameters.stage, 'prelive') , eq(parameters.environment, ‘eu’)) }}:
          value: APP EU-Qa
        ${{ if and(eq(parameters.stage, 'live') , eq(parameters.environment, ‘eu’)) }}:
          value: APP EU-Live
        ${{ if and(eq(parameters.stage, 'prelive') , eq(parameters.environment, ‘na’)) }}:
          value: APP NA-Preprod
        ${{ if and(eq(parameters.stage, 'live') , eq(parameters.environment, ‘na’)) }}:
          value: APP NA-Prod
    

    concrete-azure-pipeline:

    trigger: 
    - main
    
    extends:
      template:  reusable-template-param.yml
      
    

    You can refer to the documentation on this feature for more detail here.