{"id":13299,"date":"2022-07-21T10:12:50","date_gmt":"2022-07-21T08:12:50","guid":{"rendered":"https:\/\/digatus.com\/?p=13299"},"modified":"2025-11-27T11:42:01","modified_gmt":"2025-11-27T10:42:01","slug":"ci-cd-fuer-fortgeschrittene-mit-azure-devops","status":"publish","type":"post","link":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/","title":{"rendered":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"13299\" class=\"elementor 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>Teil 1: Go, Docker und Self-hosted Build agents<\/strong><\/p><h5>Was ist Azure DevOps?<\/h5><p>Azure DevOps ist eine Web-Plattform von Microsoft, die Tools f\u00fcr verschiedene Bereich im Umfeld von IT-Projekten bereitstellt:<\/p><ul><li><em>Azure Boards<\/em> f\u00fcr Projektmanagement<\/li><li><em>Azure Pipelines<\/em> f\u00fcr CI\/CD<\/li><li><em>Azure Repos<\/em> f\u00fcr Source-Code-Management<\/li><li><em>Azure Test Plans<\/em> f\u00fcr manuelles Testen<\/li><li><em>Azure Artifacts<\/em> f\u00fcr Artefakt-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-13331\" 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>Die Tools greifen ineinander, so lassen sich zum Beispiel Work Items aus Azure Boards verkn\u00fcpfen mit Pull Requests in Azure Repos. Bevor ein Pull Request gemergt werden darf, muss eine Pipeline in Azure Pipelines die Korrektheit des Codes best\u00e4tigen und schlussendlich l\u00e4dt sie ein Artefakt nach Azure Artifacts.<br \/>Wir werden in dieser Artikelserie nur von Azure Repos und Azure Pipelines Gebrauch machen.<\/p><h5>Die erste CI Pipeline &#8211; Go und Docker<\/h5><p>Unser erster Anwendungsfall ist ein Microservice in Go, die mittels Docker installiert werden soll. Wir werden eine CI-Pipeline erstellen, die folgendes tun soll:<\/p><ul><li>Bauen und Testen des Go-Microservice<\/li><li>Bauen eines Docker-Images<\/li><li>Hochladen des Docker-Images in eine Docker Registry<\/li><\/ul><p>Azure DevOps bietet zwei M\u00f6glichkeiten, Pipelines zu erstellen: \u00fcber eine grafische Oberfl\u00e4che oder \u00fcber YAML-Dateien, die im Git-Repo mit eingecheckt werden. \u00dcblicherweise wird diese Datei in das Wurzelverzeichnis des Git-Repos unter dem Name azure-pipelines.yaml committet (der Name ist aber frei w\u00e4hlbar). Da wir unsere Pipelines im Team entwickeln, dokumentieren, \u00c4nderungen verfolgen und Abschnitte wiederverwenden wollen, entscheiden wir uns f\u00fcr die fortgeschrittene Variante mit den YAML-Dateien.<\/p><p>Der Microservice ist sehr einfach aufgebaut: er startet lediglich einen HTTP-Server mit einem REST-Endpunkt:<\/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-13333\" alt=\"go.mod_\" 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-13335\" alt=\"main.go\" 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-13337\" alt=\"Dockerfile\" 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>Jetzt zum spannenden Teil: der CI-Pipeline. In Azure DevOps besteht der ausf\u00fchrbare Teil einer Pipeline aus Stages, eine Stage aus Jobs und ein Job aus Steps. F\u00fcr unseren einfachen Fall reicht eine Stage mit einem Job v\u00f6llig aus. Die Funktionalit\u00e4t eines Steps wird mittels eines Tasks beschrieben, zum Beispiel gibt es einen <em>Go-Task<\/em>, einen <em>Docker-Task<\/em> und einen <em>Git-Checkout-Task<\/em>. Mit dem <em>Bash-<\/em> oder <em>Powershell-Task<\/em> gibt es die M\u00f6glichkeit eigene Skripte auszuf\u00fchren. F\u00fcr komplexere Anwendungsf\u00e4lle gibt es dann noch die M\u00f6glichkeit eigene Tasks in TypeScript zu entwickeln. Da der Build-Prozess schon komplett im Dockerfile definiert ist, ben\u00f6tigen wir als Build-Steps nur noch <em>docker build<\/em> und <em>docker push<\/em>. Daf\u00fcr nutzen wir den Docker-Task.<\/p><p>Neben dem eigentlichen Build-Prozess k\u00f6nnen wir in der Pipeline definieren<\/p><ul><li>bei welchen Events die Pipeline automatisch getriggert werden soll.<\/li><li>welche Variablen und Variablen-Gruppen verwendet werden sollen.<\/li><li>ob die Pipeline parametrisiert sein soll.<\/li><li>ob weitere Git-Repositories ausgecheckt werden sollen.<\/li><\/ul><p>Alle diese Einstellungen k\u00f6nnen auch weggelassen werden, dann wird die Pipeline automatisch f\u00fcr jeden Git Push getriggert, hat keine Variablen und Parameter und es wird nur das eigene Git-Repository ausgecheckt. Das ist auch das Verhalten, das wir f\u00fcr unsere Pipeline wollen.<\/p><p>Innerhalb der Pipeline haben wir Zugriff auf einige vordefinierte Variablen, die uns u.a. Auskunft geben \u00fcber den Namen, die Organisation und den ausgecheckten Commit des Git-Repos. Eine Liste aller vordefinierten Variablen gibt es <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/build\/variables?view=azure-devops&amp;tabs=yaml\">hier<\/a>. Nat\u00fcrlich lassen sich auch zur Laufzeit eigene Variablen definieren und so Daten zwischen den Steps weiterreichen. Wir nutzen<\/p><ul><li><span style=\"color: #59bb2f;\">$(Build.SourcesDirectory)<\/span>, den Pfad auf dem Build-Agent, in dem das Git-Repo ausgecheckt ist als Pfad-Pr\u00e4fix f\u00fcr den Zugriff auf Dateien.<\/li><li><span style=\"color: #59bb2f;\">$(Build.Repository.Name)<\/span>, den Name des Git-Repositories als Name f\u00fcr das Docker-Image.<\/li><li><span style=\"color: #59bb2f;\">$(Build.SourceVersion)<\/span>, den Commit-Hash als Tag f\u00fcr das Docker-Image<\/li><\/ul><p>Die fertige Pipeline-Definition sieht demnach wie folgt aus:<\/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-13339\" alt=\"azure_pipeline_yaml\" 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>Als Ziel-ContainerRegistry haben wir hier &#8218;docker-hub&#8216; angegeben. Das ist ein Verweis auf eine sogenannte Service Connection, die in Azure DevOps ganz allgemein eine Verbindung zu einem externen Dienst beschreibt. So kann die Pipeline diese nutzen, ohne dass irgendwelche Anmeldedaten direkt in der Pipeline gespeichert werden m\u00fcssen. Zum Erstellen einer neuen Service Connection gehen wir auf die \u201eProjekt-Settings\u201c und dort unter \u201ePipelines\u201c &#8211;&gt; \u201eService Connections\u201c. Wir erstellen eine Connection zu einer Docker Registry in Docker Hub. Voraussetzung daf\u00fcr ist ein (kostenloser) Docker-Account. Nat\u00fcrlich k\u00f6nnten wir auch eine beliebige andere Docker-Registry verwenden.<\/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-13341\" alt=\"docker_registry\" 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>Als n\u00e4chstes m\u00fcssen wir unsere Zugangsdaten f\u00fcr den Docker-Hub Account eingeben. Wichtig: als Passwort muss vorher ein Access Token in Docker Hub erstellt werden.<\/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-13343\" alt=\"Docker-ID\" 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>Nachdem wir alle Dateien committet haben, m\u00fcssen wir nur noch die Pipeline in der Oberfl\u00e4che von Azure DevOps anlegen und dabei auf unsere azure-pipelines.yaml verweisen. Dazu klicken wir unter \u201ePipelines\u201c auf \u201eCreate Pipeline\u201c:<\/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-13345\" 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\tUnsere azure-pipelines.yaml liegt 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-13347\" alt=\"azure_pipeline\" 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\tNach dem Ausw\u00e4hlen des korrekten Git-Repos (in unserem Fall \u201eexample-go-project\u201c) erkennt Azure DevOps automatisch unsere azure-pipelines.yaml, weil sie die einzige YAML-Datei ist.\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-13351\" 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\tEin wohl\u00fcberlegter Klick auf \u201eRun\u201c und wir k\u00f6nnen endlich die Fr\u00fcchte unserer Arbeit sehen:\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-13353\" 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\tWie wir erkennen k\u00f6nnen wurde das Docker-Image gebaut und automatisch ins Docker Hub hochgeladen:\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-13355\" alt=\"docker_hub\" 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\tEin schneller Test in einer lokalen Shell best\u00e4tigt, dass alles einwandfrei funktioniert hat und das Docker-Image jetzt \u00fcberall verwendet werden kann:\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-13359\" 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 und Code Coverage<\/h5><p>Zu jeder guten Pipeline geh\u00f6rt auch automatisiertes Testen. Darum erweitern wir unser Go-Projekt nun um einen Unit-Test und bauen in der Pipeline einen Step ein, der die Tests ausf\u00fchrt. Falls Tests fehlschlagen, soll die Pipeline abbrechen und das Docker-Image weder gebaut noch gepusht werden.<\/p><p>Unser erster Test startet einen HTTP-Request an den Standalone-Server und pr\u00fcft die Antwort:<\/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-13357\" alt=\"main_test.go\" 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>Lokal l\u00e4uft der Test schonmal:<\/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-13361\" 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>Dann f\u00fcgen wir die Tests jetzt zur Pipeline hinzu. Azure DevOps bietet zwei vordefinierte Tasks f\u00fcr Go-Projekte an: <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/tool\/go-tool?view=azure-devops\">GoTool <\/a>und <a href=\"https:\/\/docs.microsoft.com\/en-us\/azure\/devops\/pipelines\/tasks\/build\/go?view=azure-devops\">Go<\/a>. Mit GoTool w\u00e4hlen wir die Go-Version f\u00fcr die Pipeline aus, mit Go k\u00f6nnen wir dann beliebige Go-Commands ausf\u00fchren. Vor dem Ausf\u00fchren der Tests bauen wir unser Go-Projekt. Auch wenn das nicht unbedingt n\u00f6tig w\u00e4re, hilft es doch bei der Fehlersuche, ob ein Fehler schon beim Bauen (syntaktischer Fehler) oder erst beim Ausf\u00fchren der Tests (semantischer Fehler) auftritt. Zum Bauen sind zwei Schritte n\u00f6tig: go mod download zum Herunterladen der Bibliotheken und go build zum Kompilieren. Die Tests werden danach mit go test ausgef\u00fchrt. Wir erweitern also in die Pipeline wie folgt:<\/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-13363\" 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\tNach dem Committen und Pushen sollte die Pipeline automatisch gestartet werden, die Anwendung bauen und den Test ausf\u00fchren:\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-13365\" alt=\"test_successfull\" 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\tSo langsam bekommen wir ein Gesp\u00fcr f\u00fcr CI und die Umsetzung in Azure DevOps. Um sicherzugehen, dass auch der Negativ-Fall funktioniert, \u00e4ndern wir jetzt den Code, sodass der Test fehlschl\u00e4gt:\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-13369\" alt=\"main.go\" 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\tWie erwartet schl\u00e4gt die Pipeline fehl und bricht ab bevor das Docker-Image gebaut wird:\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-13367\" alt=\"test_failed\" 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>Um konkret nachzuschauen welcher Test warum fehlgeschlagen, m\u00fcssen wir aber im Log nachschauen. Bei einem einzigen Test ist das kein Problem, aber wenn wir hunderte Tests haben, haben wir nicht die Zeit, hier durch tausende Zeilen durchzuscrollen, um die Tests zu finden, die fehlgeschlagen sind. Au\u00dferdem sehen wir auch nicht sofort wieviel Prozent der Tests fehlgeschlagen sind. Zum Gl\u00fcck bietet Azure DevOps hier eine Schnittstelle zur Bereitstellung von Test-Ergebnissen im JUnit-XML-Format. Um diese nutzen zu k\u00f6nnen, m\u00fcssen wir aber die Ausgabe von <em>go test<\/em> in dieses Format umwandeln.<\/p><p>Erfreulicherweise hat diese Arbeit schon ein anderer f\u00fcr uns erledigt und ein entsprechendes Go-Tool geschrieben: <a href=\"https:\/\/github.com\/jstemmer\/go-junit-report.\">https:\/\/github.com\/jstemmer\/go-junit-report.<\/a> Ebenfalls interessiert uns die Test-Coverage. Hier gibt es ebenfalls eine Schnittstelle von Azure DevOps und fertige Tools f\u00fcr die Konvertierung ins richtige Format.<\/p><p>F\u00fcr diesen ganzen komplexen Ablauf erstellen wir einen Bash-Task, der folgendes tun wird: Erst l\u00e4dt er die n\u00f6tigen Tools herunter, dann f\u00fchrt er die Tests aus, wobei er sich den Return-Code f\u00fcr sp\u00e4ter merkt. Wir wollen n\u00e4mlich den Return-Code von <em>go test<\/em> als Return-Code des ganzen Steps verwenden, damit Azure DevOps wei\u00df, ob der Step fehlgeschlagen ist oder nicht. Vorher m\u00fcssen wir aber noch den Report und die Coverage aufbereiten, sowohl im Erfolgsfall als auch im Fehlerfall. Anschlie\u00dfend f\u00fcgen wir noch die zwei Tasks <em>PublishTestResults<\/em> und <em>PublishCodeCoverageResults<\/em> ein. Hier ist wichtig, die <em>condition: succeededOrFailed()<\/em> hinzuzuf\u00fcgen. Normalerweise werden nachfolgende Steps nicht ausgef\u00fchrt, wenn ein Step fehlschl\u00e4gt (d.h. der Standard-Wert ist <em>condition: succeeded()<\/em>) aber mit c<em>ondition: succeededOrFailed()<\/em> werden sie auch ausgef\u00fchrt, wenn vorherige Schritte fehlgeschlagen sind, im Gegensatz zu <em>condition: always()<\/em> aber nicht, wenn die Pipeline manuell abgebrochen wurde.<\/p><p>Notiz am Rande, falls die Builds auf einem Self-hosted Build-Agent laufen sollen: der Task <em>PublishCodeCoverageResults<\/em> erwartet, dass auf dem Build-Agent eine .NET Runtime installiert ist.<\/p><p>Hier nun die fertige 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-13418\" alt=\"azure-pipelines.yaml\" 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\tNach dem erfolgreichen Durchlauf des Builds sehen wir nun die Test-Ergebnisse und die Coverage grafisch aufbereitet in zwei neuen 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-13373\" alt=\"test_report\" 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-13375\" alt=\"success\" 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-13377\" alt=\"test_report\" 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\tEbenso sehen wir im Falle eines fehlgeschlagenen Tests eine genaue Meldung \u00fcber den Fehler:\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-13379\" alt=\"test_fail_report\" 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>Fazit<\/h5><p>Azure DevOps bietet eine gute M\u00f6glichkeit, schnell und komfortabel Pipelines zu erstellen. Die grafische Oberfl\u00e4che ist schlicht und leicht verst\u00e4ndlich und gerade f\u00fcr Einsteiger ins Thema DevOps empfehlenswert. Hierf\u00fcr bietet sich das Erstellen von Pipelines \u00fcber die grafische Oberfl\u00e4che Drop an. Die Anbindung an externe Services ist ebenfalls einfach und schnell erledigt. Nichtsdestotrotz ist es durch den Wechsel zur YAML-Syntax f\u00fcr Pipelines auch f\u00fcr komplexere Anwendungsf\u00e4lle geeignet. So lassen sich nahezu beliebig komplexe Pipelines definieren. In diesem Artikel haben wir uns bisher nur einen Bruchteil der Features von Azure DevOps angeschaut.<\/p><p>In Teil 2 werden wir:<\/p><ul><li>ein weiteres Go-Projekt inklusive Pipeline als Abh\u00e4ngigkeit in unser erstes Go-Projekt einbinden.<\/li><li>\u00a0eine Pipeline-Template zur Wiederverwendung f\u00fcr weitere zuk\u00fcnftige Pipelines erstellen.<\/li><li>einen intelligenten Versionierungs-Algorithmus nach Semantic Versioning in die Pipeline einbauen.<\/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>Die Idee f\u00fcr diese Artikelserie entstand aus der Situation bei einem Kunden, bei dem wir CI\/CD einf\u00fchrten, weil der manuelle Arbeitsaufwand nicht mehr zu bewerkstelligen war. Die nachfolgenden Anleitungen sind also frisch aus der Praxis entstanden. Der Einfachheit halber haben wir den langen Weg des Ausprobierens und der Fehlersuche gek\u00fcrzt und pr\u00e4sentieren hier nur das Endergebnis. Die Code-Ausschnitte sind beispielhaft, aber ausreichend, um die Funktionalit\u00e4t zu pr\u00e4sentieren.<\/p>\n","protected":false},"author":2,"featured_media":13322,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[95],"tags":[73,75],"class_list":["post-13299","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-artikel","tag-cloud","tag-softwareentwicklung"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.3 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps - digatus<\/title>\n<meta name=\"description\" content=\"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis f\u00fcr die eigene Entwicklung mit 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\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/\" \/>\n<meta property=\"og:locale\" content=\"de_DE\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps\" \/>\n<meta property=\"og:description\" content=\"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-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:01+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1200\" \/>\n\t<meta property=\"og:image:height\" content=\"627\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Annabell Renner\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:title\" content=\"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps\" \/>\n<meta name=\"twitter:description\" content=\"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis.\" \/>\n<meta name=\"twitter:image\" content=\"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps.png\" \/>\n<meta name=\"twitter:label1\" content=\"Verfasst von\" \/>\n\t<meta name=\"twitter:data1\" content=\"Annabell Renner\" \/>\n\t<meta name=\"twitter:label2\" content=\"Gesch\u00e4tzte Lesezeit\" \/>\n\t<meta name=\"twitter:data2\" content=\"13\u00a0Minuten\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/\"},\"author\":{\"name\":\"Annabell Renner\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#\\\/schema\\\/person\\\/4902929f286856c9caf9575e10acd69e\"},\"headline\":\"CI\\\/CD f\u00fcr Fortgeschrittene mit Azure DevOps\",\"datePublished\":\"2022-07-21T08:12:50+00:00\",\"dateModified\":\"2025-11-27T10:42:01+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/\"},\"wordCount\":1569,\"publisher\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/digatus.com\\\/wp-content\\\/uploads\\\/2022\\\/07\\\/CI_CD_DevOps_Azure.png\",\"keywords\":[\"Cloud\",\"Softwareentwicklung\"],\"articleSection\":[\"Artikel\"],\"inLanguage\":\"de\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/\",\"url\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/\",\"name\":\"CI\\\/CD f\u00fcr Fortgeschrittene mit Azure DevOps - digatus\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-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:01+00:00\",\"description\":\"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis f\u00fcr die eigene Entwicklung mit Azure DevOps.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/#breadcrumb\"},\"inLanguage\":\"de\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-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,\"caption\":\"ci_cd_devops_azure\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Startseite\",\"item\":\"https:\\\/\\\/digatus.com\\\/de\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"CI\\\/CD f\u00fcr Fortgeschrittene mit Azure DevOps\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#website\",\"url\":\"https:\\\/\\\/digatus.com\\\/de\\\/\",\"name\":\"digatus\",\"description\":\"Transforming IT, Empowering Business.\",\"publisher\":{\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/digatus.com\\\/de\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"de\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#organization\",\"name\":\"digatus\",\"url\":\"https:\\\/\\\/digatus.com\\\/de\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#\\\/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\\\/de\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/digatus.com\\\/de\\\/#\\\/schema\\\/person\\\/4902929f286856c9caf9575e10acd69e\",\"name\":\"Annabell Renner\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"de\",\"@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\\\/de\\\/author\\\/annabell\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps - digatus","description":"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis f\u00fcr die eigene Entwicklung mit 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\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/","og_locale":"de_DE","og_type":"article","og_title":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps","og_description":"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis.","og_url":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/","og_site_name":"digatus","article_published_time":"2022-07-21T08:12:50+00:00","article_modified_time":"2025-11-27T10:42:01+00:00","og_image":[{"width":1200,"height":627,"url":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps.png","type":"image\/png"}],"author":"Annabell Renner","twitter_card":"summary_large_image","twitter_title":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps","twitter_description":"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis.","twitter_image":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CICD-Azure-DevOps.png","twitter_misc":{"Verfasst von":"Annabell Renner","Gesch\u00e4tzte Lesezeit":"13\u00a0Minuten"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/#article","isPartOf":{"@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/"},"author":{"name":"Annabell Renner","@id":"https:\/\/digatus.com\/de\/#\/schema\/person\/4902929f286856c9caf9575e10acd69e"},"headline":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps","datePublished":"2022-07-21T08:12:50+00:00","dateModified":"2025-11-27T10:42:01+00:00","mainEntityOfPage":{"@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/"},"wordCount":1569,"publisher":{"@id":"https:\/\/digatus.com\/de\/#organization"},"image":{"@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/#primaryimage"},"thumbnailUrl":"https:\/\/digatus.com\/wp-content\/uploads\/2022\/07\/CI_CD_DevOps_Azure.png","keywords":["Cloud","Softwareentwicklung"],"articleSection":["Artikel"],"inLanguage":"de"},{"@type":"WebPage","@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/","url":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/","name":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps - digatus","isPartOf":{"@id":"https:\/\/digatus.com\/de\/#website"},"primaryImageOfPage":{"@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/#primaryimage"},"image":{"@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-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:01+00:00","description":"Teil 1: Go, Docker und Self-hosted Build agents. Eine Anleitung aus der Praxis f\u00fcr die eigene Entwicklung mit Azure DevOps.","breadcrumb":{"@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/#breadcrumb"},"inLanguage":"de","potentialAction":[{"@type":"ReadAction","target":["https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/"]}]},{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-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,"caption":"ci_cd_devops_azure"},{"@type":"BreadcrumbList","@id":"https:\/\/digatus.com\/de\/ci-cd-fuer-fortgeschrittene-mit-azure-devops\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Startseite","item":"https:\/\/digatus.com\/de\/"},{"@type":"ListItem","position":2,"name":"CI\/CD f\u00fcr Fortgeschrittene mit Azure DevOps"}]},{"@type":"WebSite","@id":"https:\/\/digatus.com\/de\/#website","url":"https:\/\/digatus.com\/de\/","name":"digatus","description":"Transforming IT, Empowering Business.","publisher":{"@id":"https:\/\/digatus.com\/de\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/digatus.com\/de\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"de"},{"@type":"Organization","@id":"https:\/\/digatus.com\/de\/#organization","name":"digatus","url":"https:\/\/digatus.com\/de\/","logo":{"@type":"ImageObject","inLanguage":"de","@id":"https:\/\/digatus.com\/de\/#\/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\/de\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/digatus.com\/de\/#\/schema\/person\/4902929f286856c9caf9575e10acd69e","name":"Annabell Renner","image":{"@type":"ImageObject","inLanguage":"de","@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\/de\/author\/annabell\/"}]}},"_links":{"self":[{"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/posts\/13299","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/comments?post=13299"}],"version-history":[{"count":1,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/posts\/13299\/revisions"}],"predecessor-version":[{"id":28989,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/posts\/13299\/revisions\/28989"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/media\/13322"}],"wp:attachment":[{"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/media?parent=13299"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/categories?post=13299"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/digatus.com\/de\/wp-json\/wp\/v2\/tags?post=13299"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}