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.nameVMis not empty, set the pool name and vmImage fromparameters.config.namePoolandparameters.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.nameVMis 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
coalescewhich 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:
- AI Assisted Development – Taming Azure Pipeline YAML
- AI Assisted Development – Taming Azure Pipeline YAML (Part2)
Changes:
For more insight and an in-depth journal of our open-source v2 blueprint adventure, see Continuous Integration and Delivery Pipelines Cookbook.

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

