AZ-400: Designing and Implementing Microsoft DevOps Solutions

Design and Implement Pipelines

Exploring YAML Pipelines

In this article, we dive into YAML Pipelines in Azure Pipelines and explore how they revolutionize continuous integration and continuous delivery. YAML, which stands for "YAML Ain't Markup Language," is a human-readable data serialization format favored in DevOps practices and platforms like Kubernetes.

The image is a diagram illustrating the use of YAML in Azure Pipelines, highlighting YAML as a human-readable data serialization language.

This article covers the fundamentals of YAML Pipelines, explains their role in CI/CD, and compares them with Classic Pipelines. This comprehensive discussion is ideal for developers and DevOps professionals aiming to optimize their development workflows.

YAML’s primary design goal is simplicity and readability. Introduced in 2001, YAML has become a popular choice for configuration files in diverse environments, ensuring that even complex configurations remain accessible and manageable.

Below is a typical YAML pipeline configuration:

trigger:
- main
pool:
  vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
  inputs:
    versionSpec: '14.x'
    displayName: 'Install Node.js'
- script: |
    npm install
    npm run build
  displayName: 'Install dependencies and build'

YAML’s versatility extends beyond pipelines, making it a foundational tool in many DevOps scenarios. Its key advantages include:

  • Version Control: Track and roll back pipeline configurations as you would with source code.
  • Reusability: Share and reuse sections of pipeline code across projects to save time and reduce errors.
  • Flexibility: Tailor configurations with precision to meet your project’s unique requirements.
  • Transparency: Maintain open access to pipeline code for improved team collaboration.

Note

Familiarity with YAML syntax is essential before diving deeper into pipeline configurations.

The image is a presentation slide titled "The Shift to YAML Pipeline," highlighting four benefits of YAML: version control, easier code reuse, precise configurations, and transparency.

YAML Syntax Basics

YAML is built to be both human-readable and machine-processable. Here are some fundamental concepts:

  • Indentation: Structure is indicated by spaces only; never use tabs.
  • Key-Value Pairs: Represented as a key followed by a colon and its associated value.
  • Lists: Denoted by a hyphen followed by a space before the list item.
  • Dictionaries: Collections of key-value pairs which can be nested.
  • Multiline Strings: Use the pipe symbol (|) for literal blocks or the greater-than symbol (>) for folded text where newlines are converted to spaces.

Below is an example demonstration of these concepts in an Azure Pipeline:

stages:
  - stage: Build
    displayName: "Build Stage"
    jobs:
      - job: BuildJob
        displayName: "Build Job"
        pool:
          vmImage: "ubuntu-latest"
        steps:
          - script: |
              echo "Building the project..."
              echo "Environment: ${{ variables.environment }}"
              echo "Database Server: ${{ variables.database.server }}"
              echo "Database Username: ${{ variables.database.username }}"
              echo "Database Password: ${{ variables.database.password }}"
              echo "Packages:"
              for package in "${{ variables.packages }}"; do
                echo "- Name: $package.name, Version: $package.version"
              done
          displayName: "Build Project"

Key Concepts for YAML Pipelines

  • Stages: Define the sequence of segments (e.g., build, test, deploy) that are executed.
  • Jobs: Typically run in parallel and may depend on outputs from previous jobs.
  • Steps: The smallest functional units in jobs, which can be tasks or scripts.
  • Tasks and Scripts: Use tasks for predefined actions like artifact publishing, while scripts run custom shell commands.

The following diagram illustrates the overall structure of a YAML pipeline:

The image is a diagram illustrating the structure of a YAML pipeline, showing the flow from a trigger through stages, jobs, and steps, with tasks like publishing build artifacts and deploying Azure App Services.

Below is a basic YAML pipeline example that implements stages, jobs, and steps:

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

stages:
- stage: Build
  jobs:
  - job: BuildJob
    steps:
    - script: echo "Hello, world!"
      displayName: "Run a simple script"
    - task: PublishBuildArtifacts@1
      displayName: "Publish Build Artifacts"

Creating Your First YAML Pipeline

Getting started with your first YAML pipeline in Azure DevOps is straightforward. Follow these steps:

  1. Select a Source: Determine where your code is stored.
  2. Choose a Repository: Pick the repository to build your pipeline upon.
  3. Configure Your Pipeline: Set the required pipeline settings.

Azure DevOps provides step-by-step guidance during the pipeline setup process:

The image is a guide for creating a YAML pipeline, showing steps to select a repository from a list. It includes a sidebar with steps and a repository selection interface.

After the initial configuration, review and save your YAML file to create your pipeline.

Automating Pipeline Triggers

Automation is central to modern DevOps practices. YAML Pipelines support various trigger mechanisms, including:

  • CI Triggers: Automatically start builds when code is committed.
  • PR Triggers: Initiate builds during the code review process.
  • Scheduled Triggers: Start builds at predefined times.

Consider the following YAML example that configures a pipeline trigger:

trigger:
  - main
resources:
  - repo: self
variables:
  tag: '${Build.BuildId}'
stages:
  - stage: Build
    displayName: "Build Image"
    jobs:
      - job: Build
        displayName: "Build"

Understanding these trigger options will help you streamline your build processes effectively.

Continuous Deployment with YAML Pipelines

Building the code is only the beginning—continuous deployment ensures that successfully built code is automatically released to various environments such as testing or production. This integration effectively closes the loop between development and deployment.

As your projects evolve, leverage advanced pipeline features such as:

  • Multi-stage Pipelines: Separate distinct phases like build, test, and deploy.
  • Templates: Reuse common configuration blocks to simplify pipeline management.
  • Conditional Insertions and Dependencies: Create more dynamic and adaptable pipelines.

The image shows a diagram of advanced YAML pipeline features with stages labeled as Development, Stage, and Production, along with highlights of multi-stage pipelines, using templates for reuse, and conditional insertions and dependencies.

Best Practices for YAML Pipelines

To maintain efficient and reliable YAML pipelines, follow these best practices:

  • Maintain Readability: Ensure configurations are clear and well-documented.
  • Secure Sensitive Data: Use environment variables and secrets to handle sensitive information.
  • Test Regularly: Rigorously test pipelines to prevent and quickly resolve issues.

The image outlines best practices for YAML pipelines, focusing on readability, securing sensitive data, and testing strategies.

By adhering to these guidelines, you'll be well-positioned to master YAML Pipelines in Azure DevOps, streamlining your build and deployment processes efficiently.

Additional Resources

For further reading, check out the Azure DevOps Documentation and explore more about Continuous Integration and Continuous Delivery.

Watch Video

Watch video content

Previous
Exploring Classic Pipelines