Azure DevOps Pipeline Blueprints - Open Source Software Sync 20251223


Posted by Willy-Peter Schaub on Tue 23 December 2025

v2.2.0 and a few Gems from our latest updates

We are excited to share more innovations and improvements from our latest release, v2.2.0. These updates reflect our continued commitment to excellence, resilience, and thoughtful innovation.

  • Consistency Enhancements: A consistent way of configuring and calling agent pools and their virtual machines.
  • AI Insights: Insight into using GitHub Copilot to help us with the innovations and alignment of all v2 blueprints.

Config Template Update Example Snippet

We are now configuring the stage of an Azure Pipeline to run on a specific agent pool and image, in this case the Azure Pipelines agent pool using the ubuntu-latest image.

- name:  developmentStagePool
  value: 'Azure Pipelines'
- name:  developmentStageVmImage
  value: 'ubuntu-latest'

Control Template Updates Example Snippet

In the `*-control.yml' template, we define the stage configurations reading values from variables and falling back to sane defaults.

development:
    config:
    active:                       ${{variables.developmentStageActive}}
    envName:                      ${{variables.developmentStageEnvName}}
    namePool:                     ${{coalesce(variables.developmentStagePool, 'Azure Pipelines')}}
    nameVM:                       ${{coalesce(variables.developmentStageVmImage, 'ubuntu-latest')}}

CD-Deploy Template Updates Example Snippet

In the `*-cd-deply.yml' template, we Conditionally configure the agent pool for a pipeline stage based on provided parameters:

  • If parameters.config.nameVM is not empty, set the pool name and vmImage from parameters.config.namePool and parameters.config.nameVM.
  • Otherwise, set only the pool name from parameters.config.namePool.
variables:
  ${{ if ne(parameters.config.nameVM, '') }}:
    pool:
      name:      ${{parameters.config.namePool}}
      vmImage:   ${{parameters.config.nameVM}}
  ${{ else }}:
    pool:
      name:      ${{parameters.config.namePool}}

Stage Template Updates Example Snippet

In the supporting stages, such as security review, pre-production, and qa automation, we set dependencies from parameters.dependsOn, and configure the agent pool:

  • If parameters.config.nameVM is provided, we use poolName (default Azure Pipelines) and set vmImage to the specified VM.
  • Otherwise, set the pool name from parameters.config.namePool.
  • Note the coalesce which ensures we do not break existing blueprint-based templates that are unaware of the agent pool and/or the image.
- stage:         ${{parameters.name}}
  displayName:   ${{parameters.displayName}}
  dependsOn:
  - ${{ each stage in parameters.dependsOn }}:
    - ${{stage}}
  ${{ if ne(coalesce(parameters.config.nameVM, ''), '') }}:
    pool:
      name:      ${{coalesce(parameters.config.poolName, 'Azure Pipelines')}}
      vmImage:   ${{parameters.config.nameVM}}
  ${{ else }}:
    pool:
      name:      ${{parameters.config.namePool}}

Goodbye Mundane — Hello AI!

We used GitHub Copilot to help us with the v2.2 update, validation, and alignment with other blueprints. Checkout these two blog posts for more insight:


Changes:

Templates

Click here to view the associated Pull Request


For more insight and an in-depth journal of our open-source v2 blueprint adventure, see Continuous Integration and Delivery Pipelines Cookbook.

Cover


What else can/should/must we consider as part of our blueprints? Thoughts?