Skip to main content

Build and Deploy Pipelines with Microsoft Azure


Intro Video

Photo of Chad Crowell

Chad Crowell

DevOps Training Architect II in Content

Chad currently resides in Austin, Texas where he loves trying local food trucks with his wife and 3-year-old daughter. He was first introduced to the concept of personal development through Jim Rohn back in 2008. This entrepreneur’s unique outlook gave Chad a new perspective and the power to change the trajectory of his life forever. Chad continues to use these philosophies in his work at Linux Academy and hopes to spread his message of personal betterment to anyone that views his content.







Hands-on Labs


Course Details

This course uses Azure DevOps to demonstrate many different build and deployment scenarios using Pipeline as code. Familiarity with Azure cloud is expected prior to taking this course, as well as basic knowledge about application development. We'll get hands-on with building Web Apps, Azure Functions, and AKS clusters, all using the Azure Pipelines workflow.

Topics that we'll cover include:

Deploying an ASP.NET Application and Database to Azure App Services Deploying to AKS, Azure Functions, and Azure Container Registry Using Jenkins and Azure DevOps together Azure DevOps CLI Pipeline Build Templates Self-Hosted Build Agents Deployment Groups Using Terraform in the Pipeline to create infrastructure in Azure Build Artifacts



Course Overview


Lesson Description:

Get to know what this course is all about. Please send me a message:Linux Academy Slack Workspace Linux Academy Community Forum

About the Training Architect


Lesson Description:

Introducing your course instructor, Chad Crowell.

About the Interactive Diagram


Lesson Description:

The interactive diagram is going to be your study guide for this course. We will go over how to use it so you can follow along throughout the course!

DevOps Practices and Methodologies

Continuous Integration


Lesson Description:

Integrating your code is important for many reasons — the most important being that you can test if your application works as it should. The use of tools like Jenkins, Travis CI, Circle CI, or Bamboo CI has been growing rapidly in the last 10 years. The key is to identify problems with your code early on, so you can solve many small problems along the way versus waiting for an accumulation of problems that take weeks to fix. Helpful ResourcesLinux Academy Course: Implementing a Full CI/CD Pipeline

Continuous Deployment


Lesson Description:

Continuous Delivery is the act of getting the application in a deployable state, whereas Continuous Deployment is the automated process of publishing your application, reaching the end user. This process is accomplished by using a Deployment Pipeline, which we'll explore with Azure Pipelines later in this course. Helpful ResourcesContinuous Delivery Deployment Pipeline

Source Control Management


Lesson Description:

SCM is fundamental to working in teams, where many people are changing the same code. SCM can also be referred to as a version control system (VCS) and comes with many features. Some of those features include being able to manage permissions of files, add version to files, resolve merge conflicts, keep a history to revert back to, and automate which version or branch we'd like to test. This is important to Azure DevOps, as you can work these features into your Deployment Pipeline.



Lesson Description:

In this lesson, we talk about what branches are, and we demonstrate how they are useful in a pipeline scenario. You may want to perform many different actions before or during your build pipeline, and knowing this is key to utilizing a tool like Azure Pipelines properly.



Lesson Description:

Artifacts allow us to do testing within our deployment pipeline, because the artifact (in its executable form) is necessary to carry out the testing plan. This is called execution-based testing. We can use artifacts to perform testing to the application in its finished state, or we can conduct testing (which we'll talk about in the next lesson).

Code Testing


Lesson Description:

Whether it's testing the finite detail of a function within a system, or testing the broad black box, you can work code testing into your pipeline as a part of deploying your application. This comes in handy when you run into errors and need to identify, track, and fix that error as quickly as possible. You can bake this into your DevOps pipeline, and perform the tests with an additional build step, or you can wait for manual intervention before proceeding and publishing the application.

Distributed Builds


Lesson Description:

Distributing your builds is important to the build process because you don't want the CI server to reach its physical limitations and potentially delay your build process. Having different servers run different jobs in a distributed fashion is not only a fault-tolerant way of building your pipelines, but increases the efficiency of builds over time. As you increase the number of pipelines in your organization, this will become more important.

Introduction to Azure DevOps

What is Azure DevOps?


Lesson Description:

In this lesson, we talk about how the DevOps terms we talked about in the last section relate to Azure services in Azure DevOps. The way in which you group DevOps projects together is called an organization, and we go through the process of creating an organization.

DevOps Services and DevOps Server


Lesson Description:

Azure DevOps server comes in two main configurations: hosted and self-maintained. There are some positives and negatives to each. The main pro with DevOps Services is the ability to stay up to date with the latest features and automatically scale. The pros of DevOps Server include the control over your own security and integration with on-site Active Directory.

Azure Pipelines as Code


Lesson Description:

Pipelines as code refers to the build steps being saved in a YAML file within the version control system. In Azure DevOps, this YAML file can easily be created by the built-in templates or by building from scratch. If you are unfamiliar with YAML, Azure offers a way in which you can drag and drop your build steps into a graphical interface, and search for plugins in order to build your pipelines. Repository used in this lesson:

Azure Repos and GitHub Integration


Lesson Description:

Azure Repos is not your only option when choosing a version control system for Azure DevOps. There are many integrations with GitHub, which allow you to entirely replace Azure Repos if you wish. In this lesson, we go through the considerations for choosing Azure Repos or GitHub. We also cover how to connect your GitHub account to Azure Boards and Azure Pipelines.

Agile Tools in Azure DevOps


Lesson Description:

If you work for a company that embraces the DevOps culture, you are most likely using agile methods to accomplish your work. It has been proven to get more work done faster and is observable, so everyone gets an even distribution of work. Nonetheless, Azure Boards has incorporated all of these methods (Kanban, Scrum, sprints, etc.) into the CI/CD process — meaning you can now use Azure Boards as your one stop for work item tracking. Azure DevOps Demo Generator:

Build and Pipeline Steps

CI/CD Pipelines in Azure


Lesson Description:

In this lesson, we immediately dive right into creating a web app, which is built and deployed by Azure Pipelines. This lesson will pick up after the previous, in which we imported a DevOps project here. Change the pools section in the YAML:

name: Hosted VS2017
- msbuild
- visualstudio
- vstest
Separate the build and deploy steps:
- stage: Build
  - job: Build
Add the deploy step to the bottom of the YAML:
- stage: Deploy
  - job: Deploy
      name: Hosted VS2017
Full YAML used in this lesson: Build YAML

Types of Pipelines


Lesson Description:

In the last lesson, we built an ASP.NET pipeline, but there are many other types of pipelines, such as container, .NET Core, Node.js, Java, and Python, to name a few. We can also use pipelines to build infrastructure with Terraform or Ansible. In this lesson, we go through a number of pipeline examples, so you can see the similarities and differences. Helpful Resources.NET Core pipeline repository Containers pipeline repository Node.js pipeline repository Java pipeline repository Python pipeline repository

Create a Pipeline from the CLI


Lesson Description:

The Azure DevOps CLI Extension can be extremely useful for building pipelines programatically. In this lesson, we build a pipeline using the Azure DevOps CLI (prompt-based) and also learn how to script the creation so you can use it with existing automation tools. Helpful ResourcesDevOps Extension GitHub page Fork this Java app for pipeline creationTo create a new service connection:Project Settings > Service Connections > New Service Connectioin > GitHub

Pipeline Templates


Lesson Description:

Templates in Azure DevOps can mean two different things. In previous lessons, we've been using templates to initially build our pipelines. Templates can also be a reference to a build file from within the azure-pipelines.yml. You can store these de-coupled YAML files within a separate directory, and then call them however many times you wish within the main azure-pipelines.yml build file. Helpful ResourcesThe repository used in this lesson Templates documentation Parameters documentation

Stages and Tasks


Lesson Description:

Stages represent major operations between tasks in your pipeline YAML. Even though the stages keyword is not a requirement, there are two major benefits. The first benefit is the ability to stop the pipeline after the first stage if necessary (due to build failure). The second benefit is to create order and logical separation between the elements of the YAML for human readability. In this lesson, we look at how stages are used and how tasks are used within stages to perform commands (commands you may be familiar with in the scripts you are already using). Helpful ResourcesAzure Pipelines task to CLI command reference Stages documentation Tasks documentation



Lesson Description:

Conditions are basically if statements that allow the pipeline to continue or fail based on certain parameters. You can use the always() or failed() condition, or you can create your own custom conditions. In this lesson, we look at an example of a custom condition within a valid pipeline YAML. Helpful ResourcesConditions documentation YAML used in this lesson

From Build to Release


Lesson Description:

You may have noticed the releases feature in Azure DevOps. This allows you to deploy to various environments in an aesthetically pleasing way. The GUI walks you through choosing your artifact to deploy from, and then you can choose your dev, staging, uat, and prod environments to deploy to. Helpful ResourcesRelease pipelines Releases

CI Server

Pipeline Agents


Lesson Description:

Build agent and CI server are synonomous for the server you use to build and test your application. In this lesson, we go through what types of build servers you can use for free with Microsoft, and how you can opt for using your own CI server on-prem or with Jenkins. Helpful ResourcesMicrosoft-hosted build agents Free-tier services

Agent Pools


Lesson Description:

You can control which build agents to choose from within your YAML. This is not just limited to Windows servers — you can also choose from Linux, MacOS, or containers and additionally choosing demands for those pooled resources. In this lesson, we go through the many different kinds of Microsfot-hosted agents you can use, and how to insert them into your build pipeline. Helpful ResourcesMicrosoft-hosted agents Default agent pools Container pipeline jobs Using demands

Self-Hosted Agents


Lesson Description:

Build agents can be Microsoft-hosted or self-hosted. Furthermore, self-hosted agents can be on cloud servers or on-prem. You can even use your existing Jenkins CI server with Azure Pipelines. In this lesson, we go through installing the build agent on all three types of operating systems (Windows, Linux, and MacOS). We also use one of the self-hosted agents in our builds. Helpful ResourcesSelf-hosted Microsoft agents Self-hosted Linux agents Self-hosted MacOS agents Using demands in pipeline YAML Self-hosted parallel jobsYAML Used in This Lesson

- master

  name: Default
    - Agent.OS -equals Linux

  buildConfiguration: 'Release'

- script: dotnet build --configuration $(buildConfiguration)
  displayName: 'dotnet build $(buildConfiguration)'

Deployment Groups


Lesson Description:

After your build is complete, if you want to deploy to specific servers, Azure DevOps allows you to have deployment groups. Deployment groups can be Linux or Windows machines behind a firewall. Within your deployment group, you can control whether to deploy to a specific server by specifying tags. If you have many servers within the same deployment group, tags allow you to choose which specific ones to deploy to. Helpful ResourcesRepo used for this lesson Build pipeline YAML Deployment groups How to provision agents for deployment groups

Jenkins CI


Lesson Description:

With all the build agents and deployment groups we've discussed, we can also use our own Jenkins CI server. There is a Jenkins plugin for Azure DevOps that allows you to forward build artifacts to the release pipeline, so you can deploy to Azure or any other environment you choose. In this lesson, we go through the process of installing a Jenkins server, starting a build, and adding a post-build step to copy the artifact to our Azure DevOps project. Helpful ResourcesThe repo used for this lesson

Hands-on Labs are real live environments that put you in a real scenario to practice what you have learned without any other extra charge or account to manage.


Deployment Detail

Build and Release Variables


Lesson Description:

Variables (whether predefined or custom) can be valuable in a pipeline, in order to service deployments to different environments. Built-in variables are global across Azure DevOps and standardize on the location of artifacts and other build files needed, without having to explicitly locate those files or reference them in an isolated build. Those variables can be used across many deployment types and allow you the freedom to use similar pipeline templates across many environments. Helpful ResourcesComplete list of predefined variables Using arguments such as BuildConfiguration in your pipeline YAML Using release variables such as AgentReleaseDirectory

Variable Groups


Lesson Description:

In the Library section of your pipelines, you can set custom variables to use across many projects and pipelines within your organization. These can also be linked to secrets stored in Azure Key Vault. In this lesson, we go through how to add a variable group and how to use it within a YAML pipeline. Helpful ResourcesVariable groups Link secrets from Azure key vault Library security model Important notes about secrets



Lesson Description:

A grouping of deployment targets, an environment provides a single target variable for pipeline YAML. In this lesson, we add a Kubernetes namespace environment and enter that environment variable into our pipeline YAML. Helpful ResourcesEnvironment Kubernetes resource

Service Connections


Lesson Description:

The authorization we get to perform deployments to various environments comes from service connections. In this lesson, we discover two examples of projects with different service connection types and how they are included in our pipeline YAML. Helpful ResourcesService connections Custom service connections



Lesson Description:

There is a way in Azure Pipelines that we can push our packages from our pipeline to a custom package feed. We can use this custom feed to maintain a list of packages our team can use for our applications. This is useful to eliminate the dependency of downstream packages that could potentially break your application if managed by someone else. In this lesson, we take our existing pipeline for an ASP.NET application and push a package to a custom package feed, to be used by another solution in Visual Studio. Helpful ResourcesBuild pipeline YAML Restore NuGet packages from pipeline Using feeds with NuGet packages

Types of Deployments

Deploy to Azure Container Registry


Lesson Description:

In this lesson we'll go through a deployment of a container image to Azure Container Registry.Github Repository used in this lesson

Deploy to Azure Kubernetes Service (AKS)


Lesson Description:

In this lesson we'll go through deploying to an AKS cluster using Azure DevOpsGithub Repository used in this lesson

Deploy to Azure Web App


Lesson Description:

In this lesson we'll deploy a python flask app to Azure App Services Web AppGithub Repository used in this lesson

Deploy to Azure Function


Lesson Description:

In this lesson we'll deploy a Azure Functions app using Azure DevOpsGithub Repository used in this lesson

Deploy to Azure Web App for Containers


Lesson Description:

In this lesson we'll deploy a container web app using Azure PipelinesGithub Repository used in this lesson

Build Cloud Infrastructure with Terraform


Lesson Description:

Using Azure DevOps, you can create Azure resources (i.e. Web Apps and VMs) and then deploy to them using Azure Pipelines. This is done by incorporating Terraform into your pipeline.Azure DevOps Demo Generator

Team Tools

Creating a Board and Adding a Team


Lesson Description:

Azure Boards is a useful tool for working in teams. When you are creating builds and releases, you can track your progress using a work item. This work item can be automatically updated with the current release's success. In this lesson, we go over how to add team members to your organization and assign them a work item. Helpful ResourcesAzure Boards

Define a Sprint and Set Tasks


Lesson Description:

Sprints are used in many agile organizations to define an amount of work to complete in a set amount of time. Your existing sprint workflow can be incorporated into Azure Boards, and you can relate the work items to sprints in your overall DevOps process. Helpful ResourcesDemo-Tailwind Project Sprints

Establishing Git Flow


Lesson Description:

Git flow pertains to the management of the version control through processes such as creating branches, making a pull request, and merging into the master branch. In this lesson, we go through a sample workflow, to show what that process might look like in Azure DevOps and how any changes can be tracked in the work items on your board. Helpful ResourcesAzure Boards and GitHub integration

Track Build History


Lesson Description:

You can track build history using the dashboard in Azure DevOps. This gives you a quick view for your build success and/or failures. The dashboard also allows widgets from Visual Studio to be incorporated into the summary of events in Azure DevOps. Helpful ResourcesAzure DevOps dashboard

Add a Build Badge to Repo


Lesson Description:

A build badge represents the success or failure of your last build right within your GitHub repository. Azure Pipelines gives you the badge markdown that you can simply copy and paste into your markdown file in the base of your repository. Helpful ResourcesAdd a status badge to your repo

Hands-on Labs are real live environments that put you in a real scenario to practice what you have learned without any other extra charge or account to manage.


DevOps Security



Lesson Description:

In this lesson, we discover some of the main classifications of security vulnerabilities. You can find out more information at the following sites regarding common vulnerabilities you should be aware of:CWE CVE

Assessment Tools


Lesson Description:

In this lesson, we will discuss three assessment tools you can use with your .NET application, to integrate into your pipelines in Azure DevOps. These tools should be used for every one of your applications, to mitigate your code's security vulnerabilities. Helpful ResourcesDevOps Security Tools SonarCloud SonarAnalyzer FxCop

Scan from the Build Pipeline


Lesson Description:

In this lesson, we use the SonarCloud tool to scan our repository, while the build is running, to detect any security vulnerabilities. Helpful ResourcesGitHub repo used in this lesson Pipeline YAML used in this lesson

Testing Code

Automated and Manual Tests


Lesson Description:

To test the validity of your application, you must run tests so you can catch the bugs before your application is deployed to production users. In Azure DevOps, you can run automated or manual tests to ensure both unit tests and UI tests are covered. Helpful ResourcesGitHub repository used in this lesson YAML used for this lesson Manual tests Automated tests

Testing Tools


Lesson Description:

In this lesson, we cover two different .NET unit tests you can run on your application to ensure bugs get worked out before deploying your application to your production environment. Helpful ResourcesC# tests with NUnit Microsoft.NET.Test.SDK Unit tests in other languages

Tests from the Kanban Board


Lesson Description:

In this lesson, we go over how to run tests directly from the Kanban board. Those tests are automatically updated with your existing test cases. Helpful ResourcesInline tests from Azure Boards


You Did It! What's Next?


Lesson Description:

Great job finishing this course! I hope you learned a lot! Check out some of these other courses on Linux Academy to continue your learning:Other DevOps courses on Linux Academy

Take this course and learn a new skill today.

Transform your learning with our all access plan.

Start 7-Day Free Trial