{"id":25599,"date":"2022-07-21T10:12:50","date_gmt":"2022-07-21T08:12:50","guid":{"rendered":"https:\/\/staging.digatus.com\/advanced-ci-cd-with-azure-devops\/"},"modified":"2025-11-27T11:42:16","modified_gmt":"2025-11-27T10:42:16","slug":"advanced-ci-cd-with-azure-devops","status":"publish","type":"post","link":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/","title":{"rendered":"Advanced CI\/CD with Azure DevOps"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"25599\" class=\"elementor elementor-25599 elementor-13299\" data-elementor-post-type=\"post\">\n\t\t\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a014c68 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a014c68\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d36618b\" data-id=\"d36618b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-59dfede elementor-widget elementor-widget-text-editor\" data-id=\"59dfede\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><strong>Part 1: Go, Docker and Self-hosted Build Agents<\/strong><\/p><h5>What is Azure DevOps?<\/h5><p>Azure DevOps is a web platform from Microsoft that provides tools for various areas in the IT project environment:<\/p><ul><li><em>Azure Boards<\/em> for project management<\/li><li><em>Azure Pipelines<\/em> for CI\/CD<\/li><li><em>Azure Repos<\/em> for source code management<\/li><li><em>Azure Test Plans<\/em> for manual testing<\/li><li><em>Azure Artifacts<\/em> for artifact management<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d7b47e5 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d7b47e5\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8d59e06\" data-id=\"8d59e06\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-6c82f5f elementor-widget elementor-widget-image\" data-id=\"6c82f5f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img fetchpriority=\"high\" decoding=\"async\" width=\"768\" height=\"512\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Azure-DevOps-768x512.png\" class=\"attachment-medium_large size-medium_large wp-image-25171\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Azure-DevOps-768x512.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Azure-DevOps-300x200.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Azure-DevOps.png 788w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f53c9b9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f53c9b9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ef99a8e\" data-id=\"ef99a8e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c35c145 elementor-widget elementor-widget-text-editor\" data-id=\"c35c145\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The tools interact with each other, for example, work items from Azure Boards can be linked to pull requests in Azure Repos. Before a pull request is allowed to be merged, a pipeline in Azure Pipelines must confirm the correctness of the code and finally upload an artifact to Azure Artifacts.<br>In this article series, we will only make use of Azure Repos and Azure Pipelines. <\/p><h5>The First CI Pipeline &#8211; Go and Docker<\/h5><p>Our first use case is a microservice in Go, which should be installed using Docker. We will create a CI pipeline that should do the following: <\/p><ul><li>Build and test the Go microservice<\/li><li>Build a Docker image<\/li><li>Upload the Docker image to a Docker registry<\/li><\/ul><p>Azure DevOps offers two ways to create pipelines: via a graphical interface or via YAML files that are checked in with the Git repo. Usually, this file is committed to the root directory of the Git repo under the name azure-pipelines.yaml (but the name is freely selectable). Since we want to develop our pipelines in a team, document them, track changes, and reuse sections, we decide on the advanced variant with the YAML files.  <\/p><p>The microservice is very simply structured: it just starts an HTTP server with a REST endpoint:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7d6d2df elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7d6d2df\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b529bed\" data-id=\"b529bed\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3bf8f60 elementor-widget elementor-widget-image\" data-id=\"3bf8f60\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"180\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/go.mod_-768x180.png\" class=\"attachment-medium_large size-medium_large wp-image-25172\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/go.mod_-768x180.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/go.mod_-300x70.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/go.mod_.png 912w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-e979bf1 elementor-widget elementor-widget-image\" data-id=\"e979bf1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" width=\"768\" height=\"410\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go_-768x410.png\" class=\"attachment-medium_large size-medium_large wp-image-25173\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go_-768x410.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go_-300x160.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go_.png 912w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-93ad43a elementor-widget elementor-widget-image\" data-id=\"93ad43a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"314\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Dockerfile-768x314.png\" class=\"attachment-medium_large size-medium_large wp-image-25174\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Dockerfile-768x314.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Dockerfile-300x123.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Dockerfile.png 911w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-26c1dcc elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"26c1dcc\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a6bf6af\" data-id=\"a6bf6af\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-43521e8 elementor-widget elementor-widget-text-editor\" data-id=\"43521e8\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Now for the exciting part: the CI pipeline. In Azure DevOps, the executable part of a pipeline consists of Stages, a Stage consists of Jobs, and a Job consists of Steps. For our simple case, one Stage with one Job is completely sufficient. The functionality of a Step is described using a Task, for example, there is a <em>Go Task<\/em>, a <em>Docker Task<\/em>, and a <em>Git Checkout Task<\/em>. With the <em>Bash<\/em> or <em>PowerShell Task<\/em>, there is the possibility to execute custom scripts. For more complex use cases, there is also the option to develop custom tasks in TypeScript. Since the build process is already completely defined in the Dockerfile, we only need <em>docker build<\/em> and <em>docker push<\/em> as build steps. We use the Docker Task for this.       <\/p><p>In addition to the actual build process, we can define in the pipeline<\/p><ul><li>which events should automatically trigger the pipeline.<\/li><li>which variables and variable groups should be used.<\/li><li>whether the pipeline should be parameterized.<\/li><li>whether additional Git repositories should be checked out.<\/li><\/ul><p>All these settings can also be omitted, then the pipeline is automatically triggered for every Git push, has no variables and parameters, and only the own Git repository is checked out. This is also the behavior we want for our pipeline. <\/p><p>Within the pipeline, we have access to some predefined variables that give us information about the name, organization, and checked-out commit of the Git repo, among other things. A list of all predefined variables can be found <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/build\/variables?view=azure-devops&amp;tabs=yaml\">here<\/a>. Of course, custom variables can also be defined at runtime to pass data between steps. We use   <\/p><ul><li><span style=\"color: #59bb2f;\">$(Build.SourcesDirectory)<\/span>, the path on the build agent where the Git repo is checked out as a path prefix for accessing files.<\/li><li><span style=\"color: #59bb2f;\">$(Build.Repository.Name)<\/span>, the name of the Git repository as the name for the Docker image.<\/li><li><span style=\"color: #59bb2f;\">$(Build.SourceVersion)<\/span>, the commit hash as a tag for the Docker image<\/li><\/ul><p>The complete pipeline definition therefore looks as follows:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-4c2cc61 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"4c2cc61\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-613b5d6\" data-id=\"613b5d6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-e6c547a elementor-widget elementor-widget-image\" data-id=\"e6c547a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"468\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines-yaml-768x468.png\" class=\"attachment-medium_large size-medium_large wp-image-25175\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines-yaml-768x468.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines-yaml-300x183.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines-yaml.png 913w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c0a9211 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c0a9211\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-67516c6\" data-id=\"67516c6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4c5f82a elementor-widget elementor-widget-text-editor\" data-id=\"4c5f82a\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>As the target ContainerRegistry, we have specified &#8216;docker-hub&#8217; here. This is a reference to a so-called Service Connection, which generally describes a connection to an external service in Azure DevOps. This allows the pipeline to use it without having to store any credentials directly in the pipeline. To create a new Service Connection, we go to &#8216;Project Settings&#8217; and then under &#8216;Pipelines&#8217; &#8211;&gt; &#8216;Service Connections&#8217;. We create a connection to a Docker registry in Docker Hub. A prerequisite for this is a (free) Docker account. Of course, we could also use any other Docker registry.      <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7889591 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7889591\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8821294\" data-id=\"8821294\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-21b43ed elementor-widget elementor-widget-image\" data-id=\"21b43ed\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"450\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker-Registry-768x450.png\" class=\"attachment-medium_large size-medium_large wp-image-25176\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker-Registry-768x450.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker-Registry-300x176.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker-Registry-1024x600.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker-Registry.png 1328w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-a28546a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"a28546a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-23eea8a\" data-id=\"23eea8a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a4d99c0 elementor-widget elementor-widget-text-editor\" data-id=\"a4d99c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Next, we need to enter our credentials for the Docker Hub account. Important: an Access Token must be created in Docker Hub beforehand as the password. <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-495160b elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"495160b\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-80d8f69\" data-id=\"80d8f69\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-38f9930 elementor-widget elementor-widget-image\" data-id=\"38f9930\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"488\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker_ID-768x488.png\" class=\"attachment-medium_large size-medium_large wp-image-25177\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker_ID-768x488.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker_ID-300x191.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker_ID-1024x650.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Docker_ID.png 1332w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-11b0511 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"11b0511\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3d27b3e\" data-id=\"3d27b3e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-d58c368 elementor-widget elementor-widget-text-editor\" data-id=\"d58c368\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>After we have committed all files, we only need to create the pipeline in the Azure DevOps interface and reference our azure-pipelines.yaml. To do this, we click on &#8216;Create Pipeline&#8217; under &#8216;Pipelines&#8217;: <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9a7dae9 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9a7dae9\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f8c068b\" data-id=\"f8c068b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9ef7a3e elementor-widget elementor-widget-image\" data-id=\"9ef7a3e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"499\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Create_Pipeline-768x499.png\" class=\"attachment-medium_large size-medium_large wp-image-25178\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Create_Pipeline-768x499.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Create_Pipeline-300x195.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Create_Pipeline-1024x666.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Create_Pipeline.png 1055w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8b88cc6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8b88cc6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2e56b4f\" data-id=\"2e56b4f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2619d5b elementor-widget elementor-widget-text-editor\" data-id=\"2619d5b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tOur azure-pipelines.yaml is located in Azure Repos:\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-11f664f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"11f664f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-c7861f5\" data-id=\"c7861f5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ad5ca5b elementor-widget elementor-widget-image\" data-id=\"ad5ca5b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"525\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure_pipeline-768x525.png\" class=\"attachment-medium_large size-medium_large wp-image-25179\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure_pipeline-768x525.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure_pipeline-300x205.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure_pipeline-1024x700.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure_pipeline.png 1065w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-7f74973 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"7f74973\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b6bfce3\" data-id=\"b6bfce3\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b9e2c83 elementor-widget elementor-widget-text-editor\" data-id=\"b9e2c83\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tAfter selecting the correct Git repo (in our case &#8216;example-go-project&#8217;), Azure DevOps automatically recognizes our azure-pipelines.yaml because it&#8217;s the only YAML file.\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-58ccbbb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"58ccbbb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-76126f6\" data-id=\"76126f6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-55869c6 elementor-widget elementor-widget-image\" data-id=\"55869c6\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"504\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/data_storage-1-768x504.png\" class=\"attachment-medium_large size-medium_large wp-image-25180\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/data_storage-1-768x504.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/data_storage-1-300x197.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/data_storage-1-1024x672.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/data_storage-1-1536x1008.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/data_storage-1.png 1591w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-b79b3b8 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"b79b3b8\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ce07633\" data-id=\"ce07633\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-cfdcef5 elementor-widget elementor-widget-text-editor\" data-id=\"cfdcef5\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tA well-considered click on &#8216;Run&#8217; and we can finally see the fruits of our labor:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8471cc0 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8471cc0\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-9e9bb34\" data-id=\"9e9bb34\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-149142e elementor-widget elementor-widget-image\" data-id=\"149142e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"398\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/build-768x398.png\" class=\"attachment-medium_large size-medium_large wp-image-25181\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/build-768x398.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/build-300x155.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/build-1024x531.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/build.png 1401w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-feec094 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"feec094\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-38f1e8f\" data-id=\"38f1e8f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-c6f846c elementor-widget elementor-widget-text-editor\" data-id=\"c6f846c\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tAs we can see, the Docker image was built and automatically uploaded to Docker Hub:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5b212fd elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5b212fd\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7d651fc\" data-id=\"7d651fc\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-5328517 elementor-widget elementor-widget-image\" data-id=\"5328517\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"765\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/docker_hub-768x765.png\" class=\"attachment-medium_large size-medium_large wp-image-25182\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/docker_hub-768x765.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/docker_hub-300x300.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/docker_hub-1024x1020.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/docker_hub-150x150.png 150w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/docker_hub.png 1150w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-ca578ad elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"ca578ad\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8c921be\" data-id=\"8c921be\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b1e1914 elementor-widget elementor-widget-text-editor\" data-id=\"b1e1914\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tA quick test in a local shell confirms that everything worked flawlessly and the Docker image can now be used anywhere:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-791bb4a elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"791bb4a\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-0210835\" data-id=\"0210835\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ed92285 elementor-widget elementor-widget-image\" data-id=\"ed92285\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"69\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test-768x69.png\" class=\"attachment-medium_large size-medium_large wp-image-25184\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test-768x69.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test-300x27.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test-1024x92.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test-1536x137.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test.png 1800w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-8c0c31e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"8c0c31e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-8759023\" data-id=\"8759023\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-04e24be elementor-widget elementor-widget-text-editor\" data-id=\"04e24be\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Unit Tests and Code Coverage<\/h5><p>Every good pipeline includes automated testing. Therefore, we now expand our Go project with a unit test and add a step to the pipeline that executes the tests. If tests fail, the pipeline should abort and neither build nor push the Docker image.  <\/p><p>Our first test initiates an HTTP request to the standalone server and checks the response:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fb8c6a4 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fb8c6a4\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-e723c65\" data-id=\"e723c65\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7c2e1e1 elementor-widget elementor-widget-image\" data-id=\"7c2e1e1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"468\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main_test.go_-768x468.png\" class=\"attachment-medium_large size-medium_large wp-image-25183\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main_test.go_-768x468.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main_test.go_-300x183.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main_test.go_.png 912w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-43b57b6 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"43b57b6\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-bc4a2bd\" data-id=\"bc4a2bd\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-9797d9d elementor-widget elementor-widget-text-editor\" data-id=\"9797d9d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>The test runs locally for now:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-aa09d70 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"aa09d70\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-11ea49f\" data-id=\"11ea49f\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-ff24ea4 elementor-widget elementor-widget-image\" data-id=\"ff24ea4\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"187\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_run-768x187.png\" class=\"attachment-medium_large size-medium_large wp-image-25185\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_run-768x187.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_run-300x73.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_run-1024x250.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_run-1536x375.png 1536w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_run.png 1877w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-6eebefb elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"6eebefb\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-6fdfa8b\" data-id=\"6fdfa8b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-f1be3db elementor-widget elementor-widget-text-editor\" data-id=\"f1be3db\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Then we add the tests to the pipeline. Azure DevOps offers two predefined tasks for Go projects: <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/tool\/go-tool?view=azure-devops\">GoTool <\/a>and <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/build\/go?view=azure-devops\">Go<\/a>. With GoTool we select the Go version for the pipeline, with Go we can then execute any Go commands. Before running the tests, we build our Go project. Even if this isn&#8217;t strictly necessary, it helps with troubleshooting whether an error occurs during building (syntactic error) or only when executing the tests (semantic error). Two steps are necessary for building: go mod download to download the libraries and go build to compile. The tests are then executed with go test. So we extend the pipeline as follows:       <\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fbcc75e elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fbcc75e\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-5c3f0ee\" data-id=\"5c3f0ee\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-a5cebce elementor-widget elementor-widget-image\" data-id=\"a5cebce\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"907\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-2-768x907.png\" class=\"attachment-medium_large size-medium_large wp-image-25186\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-2-768x907.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-2-254x300.png 254w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-2.png 792w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-84ec043 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"84ec043\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-3e79aef\" data-id=\"3e79aef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-067bb68 elementor-widget elementor-widget-text-editor\" data-id=\"067bb68\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tAfter committing and pushing, the pipeline should start automatically, build the application, and run the test:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-fc3a113 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"fc3a113\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-841e86b\" data-id=\"841e86b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7c585f0 elementor-widget elementor-widget-image\" data-id=\"7c585f0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"461\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_successfull-768x461.png\" class=\"attachment-medium_large size-medium_large wp-image-25187\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_successfull-768x461.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_successfull-300x180.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_successfull-1024x615.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_successfull.png 1164w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-126cd75 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"126cd75\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-beadcf5\" data-id=\"beadcf5\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-df077ff elementor-widget elementor-widget-text-editor\" data-id=\"df077ff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tWe&#8217;re slowly getting a feel for CI and its implementation in Azure DevOps. To make sure that the negative case also works, we now change the code so that the test fails: \t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c06edc7 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c06edc7\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-a1e904b\" data-id=\"a1e904b\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-1ee824b elementor-widget elementor-widget-image\" data-id=\"1ee824b\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"144\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go-2-768x144.png\" class=\"attachment-medium_large size-medium_large wp-image-25189\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go-2-768x144.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go-2-300x56.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/main.go-2.png 794w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-623ec50 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"623ec50\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-d4d688e\" data-id=\"d4d688e\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-0e6e0da elementor-widget elementor-widget-text-editor\" data-id=\"0e6e0da\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tAs expected, the pipeline fails and aborts before the Docker image is built:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-5bfc617 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"5bfc617\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-24ff154\" data-id=\"24ff154\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-2631911 elementor-widget elementor-widget-image\" data-id=\"2631911\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"464\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_failed-768x464.png\" class=\"attachment-medium_large size-medium_large wp-image-25188\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_failed-768x464.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_failed-300x181.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_failed-1024x618.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_failed.png 1153w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-c636742 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"c636742\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-ed15861\" data-id=\"ed15861\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b1db171 elementor-widget elementor-widget-text-editor\" data-id=\"b1db171\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>To specifically check which test failed and why, we have to look in the log. With a single test, this isn&#8217;t a problem, but if we have hundreds of tests, we don&#8217;t have the time to scroll through thousands of lines to find the tests that failed. Also, we don&#8217;t immediately see what percentage of tests failed. Fortunately, Azure DevOps offers an interface here for providing test results in JUnit XML format. To be able to use this, however, we need to convert the output of <em>go test<\/em> into this format.    <\/p><p>Fortunately, someone else has already done this work for us and written a corresponding Go tool: <a href=\"https:\/\/github.com\/jstemmer\/go-junit-report.\">https:\/\/github.com\/jstemmer\/go-junit-report.<\/a> We&#8217;re also interested in test coverage. Here too, there&#8217;s an interface from Azure DevOps and ready-made tools for conversion into the right format. <\/p><p>For this entire complex process, we create a Bash task that will do the following: First, it downloads the necessary tools, then runs the tests, keeping the return code for later. We want to use the return code of <em>go test<\/em> as the return code for the entire step so that Azure DevOps knows whether the step failed or not. But before that, we still need to prepare the report and coverage, both in case of success and failure. Then we add the two tasks <em>PublishTestResults<\/em> and <em>PublishCodeCoverageResults<\/em>. It&#8217;s important to add the <em>condition: succeededOrFailed()<\/em> here. Normally, subsequent steps are not executed if a step fails (i.e., the default value is <em>condition: succeeded()<\/em>), but with <em>condition: succeededOrFailed()<\/em> they are executed even if previous steps failed, unlike <em>condition: always()<\/em>, but not if the pipeline was manually aborted.     <\/p><p>Side note, in case the builds should run on a self-hosted build agent: the <em>PublishCodeCoverageResults<\/em> task expects a .NET Runtime to be installed on the build agent.<\/p><p>Here is the completed pipeline:<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f39d221 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f39d221\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-7c6a463\" data-id=\"7c6a463\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4561c7e elementor-widget elementor-widget-image\" data-id=\"4561c7e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"1077\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-3-1-768x1077.png\" class=\"attachment-medium_large size-medium_large wp-image-25196\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-3-1-768x1077.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-3-1-214x300.png 214w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-3-1-730x1024.png 730w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-3-1-1095x1536.png 1095w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/azure-pipelines.yaml-3-1.png 1127w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-f15d925 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"f15d925\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-caa7956\" data-id=\"caa7956\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-3d7ed36 elementor-widget elementor-widget-text-editor\" data-id=\"3d7ed36\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tAfter the successful completion of the build, we now see the test results and coverage graphically prepared in two new tabs:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-2965c15 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"2965c15\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-86505ef\" data-id=\"86505ef\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4906fa2 elementor-widget elementor-widget-image\" data-id=\"4906fa2\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"447\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Test_report-768x447.png\" class=\"attachment-medium_large size-medium_large wp-image-25191\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Test_report-768x447.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Test_report-300x175.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Test_report-1024x596.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/Test_report.png 1320w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-0e15433 elementor-widget elementor-widget-image\" data-id=\"0e15433\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"537\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/success-768x537.png\" class=\"attachment-medium_large size-medium_large wp-image-25192\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/success-768x537.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/success-300x210.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/success-1024x716.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/success.png 1319w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-f89d651 elementor-widget elementor-widget-image\" data-id=\"f89d651\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"537\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_report_2-768x537.png\" class=\"attachment-medium_large size-medium_large wp-image-25193\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_report_2-768x537.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_report_2-300x210.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_report_2-1024x716.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_report_2.png 1322w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-d39ee8f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"d39ee8f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-2aa26d6\" data-id=\"2aa26d6\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-7bd5b84 elementor-widget elementor-widget-text-editor\" data-id=\"7bd5b84\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\tSimilarly, in case of a failed test, we see a precise error message:\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-9de3a4f elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"9de3a4f\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-b3bbe36\" data-id=\"b3bbe36\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-b62ea2f elementor-widget elementor-widget-image\" data-id=\"b62ea2f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<img loading=\"lazy\" decoding=\"async\" width=\"768\" height=\"538\" src=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_fail-768x538.png\" class=\"attachment-medium_large size-medium_large wp-image-25194\" alt=\"\" srcset=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_fail-768x538.png 768w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_fail-300x210.png 300w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_fail-1024x717.png 1024w, https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/test_fail.png 1318w\" sizes=\"(max-width: 768px) 100vw, 768px\" \/>\t\t\t\t\t\t\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<section class=\"elementor-section elementor-top-section elementor-element elementor-element-014c826 elementor-section-boxed elementor-section-height-default elementor-section-height-default\" data-id=\"014c826\" data-element_type=\"section\" data-e-type=\"section\">\n\t\t\t\t\t\t<div class=\"elementor-container elementor-column-gap-default\">\n\t\t\t\t\t<div class=\"elementor-column elementor-col-100 elementor-top-column elementor-element elementor-element-f138d1a\" data-id=\"f138d1a\" data-element_type=\"column\" data-e-type=\"column\">\n\t\t\t<div class=\"elementor-widget-wrap elementor-element-populated\">\n\t\t\t\t\t\t<div class=\"elementor-element elementor-element-4e0cf9d elementor-widget elementor-widget-text-editor\" data-id=\"4e0cf9d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h5>Conclusion<\/h5><p>Azure DevOps offers a good opportunity to create pipelines quickly and comfortably. The graphical interface is simple and easy to understand, and is particularly recommended for beginners in DevOps. For this, creating pipelines through the graphical drop interface is suitable. The connection to external services is also simple and quick. Nevertheless, by switching to YAML syntax for pipelines, it is also suitable for more complex use cases. This allows for the definition of almost arbitrarily complex pipelines. In this article, we have only looked at a fraction of the features of Azure DevOps so far.      <\/p><p>In Part 2, we will:<\/p><ul><li>Integrate another Go project including pipeline as a dependency into our first Go project.<\/li><li> Create a pipeline template for reuse in future pipelines.<\/li><li>Incorporate an intelligent versioning algorithm following Semantic Versioning into the pipeline.<\/li><\/ul>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t<\/section>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>The idea for this article series arose from a situation with a client where we introduced CI\/CD because the manual workload was no longer manageable. The following instructions are therefore fresh from practice. For simplicity, we have shortened the long process of trial and error and present only the final result here. The code snippets are exemplary but sufficient to demonstrate the functionality.   <\/p>\n","protected":false},"author":2,"featured_media":25170,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[122],"tags":[138,132],"class_list":["post-25599","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-article","tag-cloud-en","tag-software-development"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Advanced CI\/CD with Azure DevOps - digatus<\/title>\n<meta name=\"description\" content=\"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide for Your Own Development with Azure DevOps.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Advanced CI\/CD with Azure DevOps\" \/>\n<meta property=\"og:description\" content=\"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/\" \/>\n<meta property=\"og:site_name\" content=\"digatus\" \/>\n<meta property=\"article:published_time\" content=\"2022-07-21T08:12:50+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2025-11-27T10:42:16+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/de.digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps-1024x535.png\" \/>\n<meta name=\"author\" content=\"Annabell Renner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"Advanced CI\/CD with Azure DevOps\" \/>\n<meta name=\"twitter:description\" content=\"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/de.digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps-1024x535.png\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Annabell Renner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"8 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/\"},\"author\":{\"name\":\"Annabell Renner\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#\\\/schema\\\/person\\\/4902929f286856c9caf9575e10acd69e\"},\"headline\":\"Advanced CI\\\/CD with Azure DevOps\",\"datePublished\":\"2022-07-21T08:12:50+00:00\",\"dateModified\":\"2025-11-27T10:42:16+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/\"},\"wordCount\":1550,\"publisher\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"keywords\":[\"Cloud\",\"Software Development\"],\"articleSection\":[\"Article\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/\",\"url\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/\",\"name\":\"Advanced CI\\\/CD with Azure DevOps - digatus\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"datePublished\":\"2022-07-21T08:12:50+00:00\",\"dateModified\":\"2025-11-27T10:42:16+00:00\",\"description\":\"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide for Your Own Development with Azure DevOps.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#primaryimage\",\"url\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"contentUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"width\":950,\"height\":633},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/advanced-ci-cd-with-azure-devops\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/digatus.com\\\/en\\\/home\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Advanced CI\\\/CD with Azure DevOps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#website\",\"url\":\"https:\\\/\\\/digatus.com\\\/en\\\/\",\"name\":\"digatus\",\"description\":\"Transforming IT, Empowering Business.\",\"publisher\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/digatus.com\\\/en\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#organization\",\"name\":\"digatus\",\"url\":\"https:\\\/\\\/digatus.com\\\/en\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Logo_digatus_green_web_rgb.png\",\"contentUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2025\\\/01\\\/Logo_digatus_green_web_rgb.png\",\"width\":1200,\"height\":312,\"caption\":\"digatus\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/digatus.com\\\/en\\\/#\\\/schema\\\/person\\\/4902929f286856c9caf9575e10acd69e\",\"name\":\"Annabell Renner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g\",\"url\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g\",\"contentUrl\":\"https:\\\/\\\/secure.gravatar.com\\\/avatar\\\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g\",\"caption\":\"Annabell Renner\"},\"url\":\"https:\\\/\\\/digatus.com\\\/en\\\/author\\\/annabell\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Advanced CI\/CD with Azure DevOps - digatus","description":"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide for Your Own Development with Azure DevOps.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/","og_locale":"en_US","og_type":"article","og_title":"Advanced CI\/CD with Azure DevOps","og_description":"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide.","og_url":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/","og_site_name":"digatus","article_published_time":"2022-07-21T08:12:50+00:00","article_modified_time":"2025-11-27T10:42:16+00:00","og_image":[{"url":"https:\/\/de.digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps-1024x535.png","type":"","width":"","height":""}],"author":"Annabell Renner","twitter_card":"summary_large_image","twitter_title":"Advanced CI\/CD with Azure DevOps","twitter_description":"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide.","twitter_image":"https:\/\/de.digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps-1024x535.png","twitter_misc":{"Written by":"Annabell Renner","Est. reading time":"8 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#article","isPartOf":{"@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/"},"author":{"name":"Annabell Renner","@id":"https:\/\/digatus.com\/en\/#\/schema\/person\/4902929f286856c9caf9575e10acd69e"},"headline":"Advanced CI\/CD with Azure DevOps","datePublished":"2022-07-21T08:12:50+00:00","dateModified":"2025-11-27T10:42:16+00:00","mainEntityOfPage":{"@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/"},"wordCount":1550,"publisher":{"@id":"https:\/\/digatus.com\/en\/#organization"},"image":{"@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","keywords":["Cloud","Software Development"],"articleSection":["Article"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/","url":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/","name":"Advanced CI\/CD with Azure DevOps - digatus","isPartOf":{"@id":"https:\/\/digatus.com\/en\/#website"},"primaryImageOfPage":{"@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#primaryimage"},"image":{"@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","datePublished":"2022-07-21T08:12:50+00:00","dateModified":"2025-11-27T10:42:16+00:00","description":"Part 1: Go, Docker and Self-hosted Build Agents. A Practical Guide for Your Own Development with Azure DevOps.","breadcrumb":{"@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#primaryimage","url":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","contentUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","width":950,"height":633},{"@type":"BreadcrumbList","@id":"https:\/\/digatus.com\/en\/advanced-ci-cd-with-azure-devops\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/digatus.com\/en\/home\/"},{"@type":"ListItem","position":2,"name":"Advanced CI\/CD with Azure DevOps"}]},{"@type":"WebSite","@id":"https:\/\/digatus.com\/en\/#website","url":"https:\/\/digatus.com\/en\/","name":"digatus","description":"Transforming IT, Empowering Business.","publisher":{"@id":"https:\/\/digatus.com\/en\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/digatus.com\/en\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/digatus.com\/en\/#organization","name":"digatus","url":"https:\/\/digatus.com\/en\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/digatus.com\/en\/#\/schema\/logo\/image\/","url":"https:\/\/digatus.com\/wp-content\/uploads\/2025\/01\/Logo_digatus_green_web_rgb.png","contentUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2025\/01\/Logo_digatus_green_web_rgb.png","width":1200,"height":312,"caption":"digatus"},"image":{"@id":"https:\/\/digatus.com\/en\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/digatus.com\/en\/#\/schema\/person\/4902929f286856c9caf9575e10acd69e","name":"Annabell Renner","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/secure.gravatar.com\/avatar\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g","url":"https:\/\/secure.gravatar.com\/avatar\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g","contentUrl":"https:\/\/secure.gravatar.com\/avatar\/f260d8c39a817b4f01ed758cefc9933458252cc43e8c4c292328cc6009d4fea2?s=96&d=mm&r=g","caption":"Annabell Renner"},"url":"https:\/\/digatus.com\/en\/author\/annabell\/"}]}},"_links":{"self":[{"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/posts\/25599","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/comments?post=25599"}],"version-history":[{"count":1,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/posts\/25599\/revisions"}],"predecessor-version":[{"id":29007,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/posts\/25599\/revisions\/29007"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/media\/25170"}],"wp:attachment":[{"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/media?parent=25599"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/categories?post=25599"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digatus.com\/en\/wp-json\/wp\/v2\/tags?post=25599"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}