Cursus
Als je CI/CD-pipeline steeds stukloopt of traag en stroperig aanvoelt, ben je niet de enige. Ik heb te maken gehad met mislukte builds, niet-overeenkomende omgevingen en teamgenoten die per ongeluk mijn werk overschreven. Azure Pipelines haalt deze frustraties weg met een cloud-hosted service die bijna elk project op elk platform kan bouwen, testen en deployen.
Daarom laat ik je in deze tutorial zien hoe je:
- Je eerste Azure Pipeline maakt
- Je project in de cloud bouwt
- Geautomatiseerde tests toevoegt om fouten vroeg te vangen
- Met één push naar staging of productie deployt
- Je pipeline monitort en optimaliseert voor snelheid en betrouwbaarheid
- Best practices volgt die zich in echte projecten hebben bewezen
Laten we beginnen!
Wat is Azure Pipelines?
Azure Pipelines is een cloudgebaseerde oplossing die het ontwikkelen, testen en deployen van applicaties vereenvoudigt.
Het is een onderdeel van de Azure DevOps-toolkit, die de volledige softwareontwikkelingscyclus ondersteunt. Het is ook een flexibele optie voor teams van elke grootte, omdat het verschillende platforms en programmeertalen ondersteunt. Het is geïntegreerd met GitHub, Azure Repos en andere bekende versiesystemen.
De kernfuncties van Azure Pipelines zijn:
|
Service |
Doel |
|
Ondersteuning voor meerdere platforms |
Azure Pipelines automatiseert het bouwen en deployen van applicaties voor diverse besturingssystemen, zoals Linux, macOS en Windows. |
|
Integratie met versiebeheer |
Azure Pipelines maakt verbinding met je coderepositories zoals Azure Repos, GitHub en andere bekende versiesystemen. |
|
YAML-gebaseerde pipelineconfiguratie |
Azure Pipelines laat ons onze build- en deploymentprocessen als code definiëren, wat versiebeheer mogelijk maakt. |
|
Continue integratie en continue deployment (CI/CD) |
Azure Pipelines faciliteert het end-to-end proces van het integreren van codewijzigingen en het deployen van applicaties. |
Uit mijn ervaring is Azure Pipelines nuttig voor iedereen die binnen zijn team proper CI/CD wil realiseren. Het is flexibel, schaalbaar en integreert goed met andere Azure services.

Azure Pipelines-architectuur (Bron: Microsoft).
Als je een bredere kijk op Azure DevOps zoekt dan alleen pipelines, dan Azure DevOps-tutorial loopt het volledige CI/CD-traject van begin tot eind door.
Je eerste Azure Pipeline opzetten
Om met de Azure Pipelines-omgeving te werken, moeten we eerst alles inrichten om een end-to-end build-, test- en deploymentproces te ondersteunen.
Vereisten
Voordat je je eerste pipeline gaat maken, zorg dat je het volgende hebt:
- Azure DevOps-account en organisatie ingesteld: Meld je aan voor een Azure DevOps-account als je er nog geen hebt. Maak een organisatie om je projecten te beheren.
- Repository: Je hebt een coderepository met een voorbeeldproject nodig. Dit kan gehost worden in Azure Repos of GitHub. Voor deze tutorial gebruiken we een eenvoudig Node.js-project.
- Toegang tot Azure-portal: Je hebt ook toegang nodig tot de Azure-portal wanneer je wilt deployen naar Azure-services zoals Azure Kubernetes Service (AKS) en nog veel meer.
Als je je kennis van het bredere Azure-ecosysteem wilt opfrissen, raad ik de cursus Understanding Microsoft Azure aan.
Een nieuw project en repository aanmaken
Nu je Azure DevOps-account en -organisatie klaar zijn, gaan we ons eerste project en repository maken.
- Maak een nieuw project:
- Log in op je Azure DevOps-account.
- Klik op New Project, geef het een naam (bijv. "AzureDevOps-DataCamp-Tutorial"), en kies de zichtbaarheid (public of private).
- Klik op Create Project.

- Een repository instellen:
- Als je Azure Repos gebruikt, ga dan naar de sectie Repos en initialiseer een nieuwe repository.
- Je kunt ook een bestaande GitHub-repository koppelen door Import Repository te selecteren.
- Geef je repository een naam, kies je Repository type (Git of TFVC), plak je gekloonde repository-URL en klik op Import.

- Als je GitHub gebruikt, kun je je GitHub-account koppelen aan Azure DevOps door linksonder in je projectinterface te gaan naar Project Settings > GitHub Connections > Connect your GitHub account te selecteren.



Voor deze tutorial gebruiken we Azure Repos als onze coderepository. Als je net begint of geen specifieke reden hebt om TFVC te kiezen, raad ik je aan om voor Git te gaan.
Je eerste pipeline maken
Het is tijd om onze eerste pipeline te maken. Volg de onderstaande stappen:
- Klik in je Pipelines-sectie op Create Pipeline.


- Selecteer Azure Repos Git als bron en kies je repository.

- Je kunt je pipeline configureren met de YAML- of Classic-editor. We kiezen voor YAML, een codegebaseerde manier om de pipeline te definiëren.
- Sla de pipeline op en voer hem uit om te zien of alles correct werkt.
Kiezen tussen YAML en Classic Editor
Azure Pipelines biedt twee manieren om je pipelines te definiëren:
- YAML-pipelines: Een codegebaseerde manier om je pipeline te beschrijven. Ze worden gedefinieerd in een
.yaml- of.yml-bestand in je bronrepository, wat versiebeheer en betere samenwerking mogelijk maakt. - Classic Editor: Classic Editor is een gebruiksvriendelijke, visuele drag-and-drop-interface die minder flexibel is voor complexe scenario's.
|
Aspect |
YAML-pipelines |
Classic Editor |
|
Versiebeheer |
YAML-pipelines ondersteunen versiebeheer en worden opgeslagen in de broncode-repository. |
Classic Editor ondersteunt geen versiebeheer. Het is gebaseerd op een grafische interface (GUI). |
|
Flexibiliteit |
YAML-pipelines hebben hoge flexibiliteit. |
Classic Editor heeft beperkte flexibiliteit. |
|
Beste voor |
YAML-pipelines zijn het best voor langetermijn-, complexe workflows en automatisering. |
Classic Editor is het meest geschikt voor snelle setups. |
Uit mijn ervaring bieden YAML-pipelines meer flexibiliteit en zijn ze beter voor teams die Infrastructure as Code (IaC) toepassen. Maar de Classic Editor is perfect voor nieuwkomers die liever visueel werken.
Voor schaalbaarheid op de lange termijn worden YAML-pipelines echter aanbevolen boven Classic Editor.
Bouwen met Azure Pipelines
Laten we nu bekijken hoe we kunnen bouwen met Azure Pipelines.
In deze sectie specificeren we de stappen die Azure Pipelines neemt om je code te bouwen, zoals afhankelijkheden installeren, compileren en tests uitvoeren. We drukken deze stappen uit in een configuratiebestand in onze broncode-repo met YAML, een eenvoudige, goed leesbare manier om stappen in een recept te beschrijven.
YAML-pipelinesyntaxis
Hier is een eenvoudig voorbeeld van een YAML-pipeline:
# This section defines the trigger(s) for the pipeline.
# 'main' specifies that the pipeline will run whenever changes are pushed to the 'main' branch.
trigger:
- main # automatically triggers this pipeline when changes are made to the 'main' branch.
# This defines the pool where the pipeline will run.
# 'ubuntu-latest' specifies the virtual machine image for executing tasks.
pool:
vmImage: 'ubuntu-latest' # This uses the latest Ubuntu image provided by Azure DevOps.
# Steps contain the individual tasks or actions that the pipeline will execute.
steps:
- script: echo Hello, world! # A script task to run shell commands. This one prints "Hello, world!".
displayName: 'Run my first pipeline script' # A friendly name for this step, making it easier to identify in the pipeline logs.
Laten we de code stap voor stap doornemen:
trigger: Geeft de branch aan die de pipeline triggert (bijv.main).pool: Definieert de buildagent (bijv.ubuntu-latest).steps: Lijst met taken die worden uitgevoerd, zoals afhankelijkheden installeren en een buildscript draaien.
Buildstappen configureren
Om buildstappen toe te voegen aan je YAML-pipeline, definieer je het ‘script’ onder de sectie ‘steps’.
Voor een eenvoudige Node.js-applicatie bevat ons azure-pipelines.yml-bestand hieronder bijvoorbeeld code die Azure DevOps automatisch heeft aangemaakt.
# Node.js
# Build a general Node.js project with npm.
# Add steps that analyze code, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/languages/javascript
trigger:
- main
pool:
vmImage: 'ubuntu-latest'
steps:
- task: NodeTool@0
inputs:
versionSpec: '20.x'
displayName: 'Install Node.js'
- script: |
npm install
npm run build
displayName: 'npm install and build'
Laten we naar de build-steps in de YAML-pipeline hierboven kijken:
- Node.js installeren: Gebruik de taak
NodeTool@0om de Node.js-versie te specificeren. - Afhankelijkheden installeren: Voer
npm installuit om projectafhankelijkheden te installeren. - Code compileren (project builden): Voer
npm run builduit om de code te compileren.
De pipeline uitvoeren
Onze pipeline kan handmatig worden getriggerd of automatisch draaien wanneer er gebeurtenissen zoals pushes naar een branch plaatsvinden.
- Handmatige trigger: Klik op Run Pipeline in de Azure DevOps-interface om de pipeline handmatig te starten.

- Automatische trigger: Stel triggers in op basis van repository-evenementen zodat pushes naar de
main-branch de pipeline automatisch starten. Hier is een voorbeeld:
trigger:
- main
Na het uitvoeren van je pipeline kun je logs bekijken en problemen oplossen.
Ga om logs te openen naar de samenvatting van je pipeline-run en selecteer de specifieke job of taak. Hierdoor worden de logs voor die stap weergegeven; net als op de afbeelding hieronder kun je elke job (Build, Push of Update) kiezen om de ruwe logs te bekijken.


Voor het oplossen van veelvoorkomende problemen kun je je pipeline controleren op zaken als time-outs, resourcebeperkingen of misconfiguraties.
Tests toevoegen aan je pipeline
Je voegt tests toe aan je pipeline om de codekwaliteit te waarborgen en problemen vroeg in de ontwikkeling te ontdekken. In Azure Pipelines kun je unit-, integratie- of andere tests integreren door stappen in je pipelineconfiguratie toe te voegen.
Teststappen configureren
Neem teststappen op in je pipeline om de codekwaliteit te garanderen. Je kunt populaire frameworks gebruiken zoals Jest, Mocha of NUnit. Hieronder staat bijvoorbeeld hoe je unit-tests met Jest toevoegt:
- script: |
npm test
displayName: 'Run unit tests with Jest'
Testresultaten bekijken
Azure Pipelines heeft ingebouwde testrapportage. Je kunt het publiceren van testresultaten instellen voor eenvoudiger bijhouden en testresultaten bekijken in de pipelinelogs. Zo doe je dat:
- Navigeer eerst naar Builds > Test Results.
- Gebruik om testresultaten te publiceren de taak
PublishTestResults@2om resultaten weer te geven. Dit maakt het algemene bijhouden eenvoudiger. Bijvoorbeeld:
- task: PublishTestResults@2
inputs:
testResultsFiles: '**/test-results.xml'
testRunTitle: 'Unit Tests'
Deployen met Azure Pipelines
In de deploymentstappen in je Azure-pipeline-YAML-bestand kun je je applicatie automatisch naar verschillende omgevingen deployen, zoals testing, staging en productie. In deze sectie bekijken we een paar manieren om te deployen met Azure Pipelines.
Deployen naar Azure Web Apps
Azure Web Apps is een service in de Azure-portal waarmee je webapplicaties op schaal kunt ontwikkelen, deployen en beheren.
Om naar Azure Web Apps te deployen, moet je de twee services koppelen. Zo doe je dat:
- Ga linksonder in je project naar Project Settings en klik op Service Connections onder de Pipelines sectie.


- Klik op New Service Connection en kies Azure Resource Manager.


- Authenticeer met je Azure-account.
- Deploy naar Azure App Service:
- Ga terug naar je Pipelines en configureer je pipeline.
- Voeg in je pipeline een taak toe om naar Azure te deployen.
- Specificeer de resourcegroep en servicedetails.
Hier is een voorbeeld van een YAML-deploymentpipeline voor een simpele Node.js-app naar Azure App Service:
# Define the task for deploying to an Azure Web App
- task: AzureWebApp@1
inputs:
# This specifies your Azure subscription service connection
azureSubscription: 'your-azure-subscription'
# This specifies the name of your web app
appName: 'your-app-name'
# This specifies the location of the app package or files to be deployed
package: '$(Build.ArtifactStagingDirectory)'
Laten we de code hierboven opsplitsen, zodat je hem kunt aanpassen aan jouw use-case:
- Vervang
your-azure-subscriptiondoor de naam van de serviceverbinding die toegang geeft tot je Azure-subscriptie. - Vervang
your-app-namedoor de daadwerkelijke naam van je webapp in Azure. - Vervang
$(Build.ArtifactStagingDirectory)door de directory waar het webapppakket of de bestanden voor deployment staan.$(Build.ArtifactStagingDirectory)— Deze variabele verwijst naar de map waar je buildartefacten (je appbestanden) staan nadat ze zijn gebouwd.
Continue deployment (CD) instellen
Zodra alles in onze code alle tests en checks doorstaat, is de volgende stap het instellen van continue deployment. Volg de onderstaande stappen.

Deploymentmodel voor Azure-releasepipeline (Bron: Microsoft)
- Maak een releasepipeline:
- Ga naar Pipelines > Releases en klik op New Pipeline.


- Selecteer de template Azure App Service Deployment.

- Omgevingen configureren:
- Voeg de omgevingen Dev, Staging, QA en Production toe en configureer ze, waar je applicatie moet worden gedeployed.

- Koppel het artefact van je buildpipeline als bron voor de releasepipeline door Add an artifact te selecteren.

- Approvals en gates configureren:
- Het instellen van pre-deployment approvals voor gevoelige omgevingen, zoals productie, is noodzakelijk. Bijvoorbeeld: een teamleider moet de release goedkeuren. Je kunt ook gates toevoegen, zoals geautomatiseerde tests of monitoringchecks, om te garanderen dat de deployment aan kwaliteitsnormen voldoet.
Uit mijn ervaring is deze fase cruciaal om stabiliteit te behouden in veeleisende ontwikkelomgevingen. Approvals en gates bieden controle en zorgen dat alleen hoogwaardige code productie bereikt.
Deployen naar Kubernetes
Kubernetes maakt het eenvoudig om betrouwbare en schaalbare gecontaineriseerde applicaties te draaien. Met Azure Kubernetes Service (AKS) krijg je een beheerde omgeving die deployment en operatie vereenvoudigt. In deze sectie laat ik zien hoe je met Azure Pipelines naar AKS kunt deployen.
Je AKS-cluster voorbereiden
Je kunt een AKS-cluster maken via de Azure-portal of CLI. Hier is een basis Bash-CLI-opdracht om een cluster te provisionen:
az aks create \
--resource-group <ResourceGroupName> \
--name <AKSClusterName> \
--node-count 3 \
--enable-addons monitoring \
--generate-ssh-keys
Laten we de opdracht hierboven doornemen:
--resource-group: Dit geeft de Azure-resourcegroep aan waarin het AKS-cluster wordt gemaakt.--name: Dit is de naam van je AKS-cluster.--node-count: Hiermee stel je het aantal nodes in het cluster in (bijv. 3 in dit voorbeeld).--enable-addons monitoring: Hiermee worden monitoring en analytics mogelijk met Azure Monitor for Containers.--generate-ssh-keys: Hiermee worden automatisch SSH-sleutels gegenereerd voor veilige node-toegang als ze niet zijn opgegeven.
Vergeet niet <ResourceGroupName> en <AKSClusterName> te vervangen door je daadwerkelijke resourcegroep- en clusternamen.
Na het opzetten van je AKS-cluster moet kubectl worden geconfigureerd. Dit zorgt ervoor dat je pipelineagent of lokale computer met kubectl met het cluster kan communiceren.
Je kunt je Azure-taken versnellen met commandline-tools—deze Azure CLI-cheat sheet is een handige referentie.
Maak een deployment-YAML-bestand
Laten we als voorbeeld een basis deployment-YAML-bestand nemen voor het deployen van een Docker-image naar Kubernetes:
# This defines the API version and the kind of Kubernetes resource we are creating.
# 'apps/v1' is the API version, and 'Deployment' is the resource type.
apiVersion: apps/v1
kind: Deployment
# Metadata contains information to identify the resource uniquely.
# 'name' specifies the name of the Deployment.
metadata:
name: my-app # Name of the Deployment, used for identification.
# "spec" specifies the intended deployment state.
spec:
# Number of replicas/pods we want for this Deployment.
replicas: 3 # Ensures high availability by running three app replicas.
# Selector is used to define the labels that this Deployment will manage.
selector:
matchLabels:
app: my-app # This ensures that only Pods with the label 'app: my-app' are managed by this Deployment.
# Template specifies the blueprint for the pods created by the Deployment.
template:
metadata:
labels:
app: my-app # Labels for the Pods, matching the selector above.
# A specification for the containers of the Pods.
spec:
containers:
- name: my-app # Name of the container. This is useful for linking to the container in logs, etc.
image: mycontainerregistry.azurecr.io/my-app:latest # Pull the container image you will call from your container registry.
ports:
- containerPort: 80 # The container listens on port 80.
Deployen met Azure Pipelines
Neem in je YAML-pipeline een taak op om naar AKS te deployen.
# This defines a task for deploying Kubernetes manifests within an Azure DevOps pipeline.
- task: KubernetesManifest@0 # Task type for working with Kubernetes manifest files.
inputs:
# This configures what to do with the Kubernetes manifest files.
action: 'deploy' # 'deploy' action ensures the Kubernetes manifests are applied to the cluster.
# This defines the namespace where the Kubernetes resources will be deployed.
namespace: 'default' # 'default' is the namespace for deploying resources. Change if needed.
# All this does is point to the manifest files that define the desired state of your Kubernetes resources.
manifests: '$(Build.ArtifactStagingDirectory)/manifests/*.yaml'
# The 'manifests' variable points to the location of all the YAML files (e.g., Deployment, Service, etc.) that will be applied during the deployment.
# To access private container registry images, use the image pull secret.
imagePullSecrets: 'my-registry-secret'
# This instructs Kubernetes on which secret to use when pulling images from a private container registry.
# Ensure that 'my-registry-secret' exists in the namespace before the deploy
Commit en push het YAML-bestand om de deployment te triggeren.
AKS vereenvoudigt containerorkestratie, waardoor schalen, updates en rollbacks makkelijker te beheren zijn. Uit mijn ervaring is het onmisbaar voor moderne cloud-native applicaties.
Je pipelines optimaliseren en monitoren
Vroeger in mijn carrière was het bouwen van pipelines niet de grootste uitdaging—een snelle en betrouwbare pipeline hebben wél. Een goed geoptimaliseerde pipeline maakt niet alleen builds sneller; het vermindert ook frustratie in het team, verlaagt deployrisico’s en versnelt de oplevering.
Ik deel een paar tips en strategieën die je kunt gebruiken om je Azure DevOps-pipelines snel, georganiseerd en betrouwbaar te houden.
Pipeline-caching
Het installeren van afhankelijkheden is nog zo’n veelvoorkomende bottleneck. Of je nu met npm, .NET of andere pakketmanagers werkt, steeds weer dezelfde afhankelijkheden downloaden kan veel tijd verspillen. Caching van afhankelijkheden en artefacten tussen runs vermindert de uitvoeringstijd drastisch.
Zo cache je afhankelijkheden in Azure Pipelines.
Bepaal eerst de pakketmanagers, zoals:
- Node.js (
node_modules) - NuGet-pakketten
- Python (
pip-pakketten) - Maven/Gradle-afhankelijkheden
Azure Pipelines ondersteunt cachingmechanismen, zoals de taak Cache@2, waarmee je afhankelijkheden tussen pipeline-runs kunt cachen.
Laten we een eenvoudig cachevoorbeeld voor Node.js nemen:
# This task is used to cache files to speed up your pipeline.
- task: Cache@2 # This is the task name for caching files in Azure Pipelines.
inputs:
# Key is used to identify the cache. It combines npm (package manager), operating system (OS), and package-lock.json files.
key: 'npm | "$(Agent.OS)" | package-lock.json'
# RestoreKeys is an optional value used when the specific cache key is not found. It helps to find a fallback cache.
restoreKeys: |
npm | "$(Agent.OS)"
# Path defines the location of files or folders to be cached.
# Here, we are caching the 'node_modules' directory to avoid reinstalling dependencies.
path: '$(Build.SourcesDirectory)/node_modules'
# CacheHitVar is a variable that stores whether the cache was successfully used (restored).
# This can be checked later in the pipeline to decide if tasks need to run.
cacheHitVar: 'NPM_CACHE_RESTORED'
Je kunt vervolgens conditioneel de installatie overslaan als er een cache is. Dit is een slimme check vóór het afronden van de installatie van npm. Het is efficiënte voorwaardelijke logica.
Hieronder een eenvoudig voorbeeld:
# This step runs the command to install Node.js dependencies using npm.
- script: npm install # Installs packages listed in the package.json file.
# The condition checks whether the cache was restored successfully.
# This step will run if the cache is not restored ('NPM_CACHE_RESTORED' is not true).
condition: ne(variables.NPM_CACHE_RESTORED, 'true') # Run only if the cache is not restored.
Dit voorbeeld van eenvoudige caching voor een Node.js-applicatie slaat de npm-cachedirectory op met package-lock.json als sleutel. Wanneer je afhankelijkheden niet veranderen, worden ze hersteld, wat minuten per build bespaart.
Ik heb gezien dat caching de buildtijd drastisch reduceert, vooral in grote projecten, maar alleen als cachesleutels doordacht zijn gekozen. In een van mijn eerdere projecten verminderde dit de buildtijd van een Node.js-app met 55%.
De gezondheid van je pipeline monitoren
Een succesvolle pipeline draait niet alleen om groene vinkjes, zichtbaarheid en snelle feedback. Als er iets stukgaat, wil je dat je team het meteen weet. Zo blijf je problemen voor.
Azure DevOps-dashboards instellen
Azure DevOps biedt ingebouwde widgets om de status van pipelines, recente runs, faalpercentages en gemiddelde doorlooptijden weer te geven.
- Navigeer eerst naar Dashboards onder je project.

- Klik vervolgens op New Dashboard of gebruik een bestaand dashboard.

- Je kunt widgets toevoegen zoals: Build History, Release Pipeline Overview, Test Results Trend en meer.

Deze zijn essentieel om pass/fail-trends te volgen, te zien welke omgevingen problematisch zijn, en meer.
Alerts configureren voor mislukte pipelines
- Ga linksonder in je project naar Project Settings.

- Klik op Notifications.

- Klik vervolgens op New Subscription.

Laten we een scenario nemen: Selecteer in de sectie Category de optie Build; selecteer in de Template-sectie “A build fails”, en klik op Next.
Je krijgt een interface zoals hieronder:

- Klik ten slotte op Finish.
- In de sectie Notifications kun je de Build-beschrijving controleren voor de “A build fails” die we eerder hebben aangemaakt.

Ik miste ooit een kritieke deploymentfout omdat er geen alerts waren ingesteld. Sindsdien stel ik altijd teamalerts in en configureer ik ze voor elke productie-deployment. Zo mis ik nooit een kapotte build of vertraging in mijn releasecyclus.
Pipelineprestaties analyseren
We weten dat zelfs als je pipeline werkt, hij traag kan zijn, en trage pipelines doden productiviteit. Bottlenecks vroeg identificeren bespaart later gedoe.
Pipelinemetrics geven inzicht in de prestaties van builds en deployments. Zo kom je erbij.
Je moet eerst Analytics Views inschakelen onder de projectinstellingen en verbinden met Power BI of verkennen via ingebouwde grafieken.
Pipelinegezondheid monitoren
- Ga onder de sectie Pipelines naar Analytics.
- Bekijk metrics zoals pipeline pass rate, test pass rate en pipelineduur.

Let’s verder verkennen wat kernmetrics we in analytics kunnen monitoren en waarom ze ertoe doen:
|
Metric |
Waarom het ertoe doet |
|
Trends in buildduur |
Hiermee spot je eenvoudig vertragingen in de tijd. |
|
Faalpercentage per branch |
Helpt onstabiele features te identificeren. |
|
Wachttijd in queue |
Helpt tekorten aan agents te detecteren. |
Een paar maanden geleden werkte ik aan de pipeline van een klant, en wat me het meest opviel was de Wachttijd in queue. Ik ontdekte dat mijn team en ik een self-hosted agentpool overbelast hadden en dat 40% van onze pipelinetijd werd besteed aan wachten op een beschikbare runner. Niemand zag het aankomen totdat de analytics het duidelijk maakten.
We konden dat oplossen door twee extra self-hosted agents toe te voegen en de load te verdelen per taaktype. De resultaten waren direct: de gemiddelde buildtijd voor de pipeline daalde met ongeveer 35%.
Monitoren met logs
Naast metrics zijn timeline-logs goud waard, zeker voor langlopende taken. Door de jaren heen heb ik de gewoonte ontwikkeld om binnen kritieke scriptstappen eigen logmarkeringen toe te voegen om exacte vertragingen te pinpointen.
Hier een eenvoudig voorbeeld:
# This step prints a message to the console in the pipeline logs.
# It helps to mark the start of the dependency installation process.
echo "=== START: Dependency Install ===" # Display a message indicating the beginning of dependency installation.Best practices voor Azure Pipelines
Nu we de kernservices van Azure Pipelines en nog veel meer hebben behandeld, kijken we hoe je er het meeste uithaalt door deze best practices te volgen.
Laten we van performance naar structuur schakelen, want een snelle pipeline die lastig te onderhouden is, schaadt elk team alsnog.
Pipelines organiseren voor teams
Wanneer meerdere teams of omgevingen pipelines delen, wordt het al snel rommelig. Je hebt structuur nodig. Eén gigantische pipeline voor development-, staging- en productieomgevingen leidt tot chaos.
Om je pipeline te organiseren, moet je hem opdelen per omgeving. Hieronder een eenvoudige structuur.
|
Omgeving |
Naam pipeline |
Trigger |
|
Development |
|
Featurebranches (Draait bij elke commit) |
|
Staging |
|
Pull requests → Staging (Handmatige trigger) |
|
Production |
|
Handmatig of releasepipelines (Goedkeuring vereist) |
Belangrijke zaken om te begrijpen van deze eenvoudige structuur:
- Elk bestand haalt stappen uit gedeelde templates.
- Elk bestand gebruikt omgeving-specifieke variabelen.
- Elk bestand regelt toegang via pipeline-permissies.
Uit ervaring maakt deze scheiding debuggen makkelijker en stelt het junior developers in staat om naar de Dev-omgeving te deployen zonder risico voor de Production-omgeving.
Templates en herbruikbare code gebruiken
DevOps draait om het verminderen van handmatig werk en het verbeteren van automatisering in het hele softwareontwikkelingsproces.
YAML-code is foutgevoelig wanneer die tussen projecten wordt gekopieerd en geplakt. Azure DevOps heeft pipelinetemplates voor een DRY (Don’t Repeat Yourself) setup via YAML-pipelines. Je kunt YAML-pipelinetemplates hergebruiken over meerdere projecten, je pipelines consistent vormgeven en zelfs de pipeline verwerkingstijd verminderen.
Laten we een eenvoudige herbruikbare buildtemplate als voorbeeld nemen.
Definieer eerst je buildtemplate, build-template.yml:
# Here we configure the platform and the build configuration.
parameters:
buildPlatform: 'Any CPU' # This specifies the build platform (e.g., Any CPU, x86, x64).
buildConfiguration: 'Release' # This specifies the build configuration (Release) to avoid warning.
# A pipeline is composed of steps (a series of tasks that will be executed)
steps:
- task: DotNetCoreCLI@2 # Task for running .NET Core commands in the pipeline.
inputs:
command: 'build' # This runs the 'build' command to compile the project(s).
projects: '**/*.csproj' # This specifies to build all .csproj files in the repository.
arguments: '--configuration ${{ parameters.buildConfiguration }}'
# This passes the build configuration parameter (e.g., Release or Debug) to the command.
Gebruik je buildtemplate in je hoofd-pipeline:
# A pipeline job is a group of tasks. Here, the job is named 'Build'.
jobs:
- job: Build # The job name where the build process occurs.
# Steps define the tasks or actions the pipeline will perform.
steps:
- template: templates/build-template.yml # Reference an external YAML template for reusable steps.
Secrets en variabelen beheren
Bij projecten, vooral in samenwerking, gebruik je vaak gevoelige informatie zoals database-connectionstrings, API-sleutels, wachtwoorden of tokens. Als deze secrets hardcoded in je codebase staan of zichtbaar zijn in logs, kunnen ze eenvoudig worden gecompromitteerd.
Laten we kijken hoe we onze secrets en variabelen veilig beheren met Azure Pipelines-secrets en variabelengroepen.
Stap 1: Een variabelengroep maken
- Klik op het tabblad Pipelines in de linkerzijbalk.
- Klik in de sectie Pipelines op Library.

- Maak een variabelengroep:
- Klik op het tabblad Variable groups.

- Klik op de knop Add variable group.
- Voer een naam in voor je variabelengroep (bijv.
MyAppSecrets).

Stap 2: Secrets toevoegen aan de variabelengroep
- Variabelen toevoegen:
- Klik in de variabelengroep op Add om een nieuwe variabele te maken.

- Voer de naam van de variabele in (bijv.
DB_CONNECTION_STRING). - Vink het vakje aan met het label Keep this value secret om het als secret te behandelen.
- Voer de waarde van de variabele in (bijv. mijn database-connectionstring).

- Klik op Save om de variabele op te slaan.

Stap 3: Secrets gebruiken in je pipeline
Nu je een variabelengroep met secrets hebt gemaakt, kun je deze variabelen gebruiken in je pipeline-YAML-bestand.
- Verwijs naar de variabelengroep: Voeg de variabelengroep toe aan je pipeline-YAML-bestand:
variables:
- group: MyAppSecrets
- Gebruik de secrets in je stappen: Je kunt de secrets in je pipelinestappen refereren met de syntaxis
$(VariableName). Hier is een voorbeeld van hoe je deDB_CONNECTION_STRINGgebruikt in een scriptstap:
# This defines the trigger for the pipeline.
# The pipeline runs automatically whenever changes are pushed to the 'main' branch.
trigger:
- main # Trigger the pipeline on changes to the 'main' branch.
# The pool specifies the environment where the pipeline will run.
# 'ubuntu-latest' means the pipeline will use the latest Ubuntu operating system image.
pool:
vmImage: 'ubuntu-latest' # Use the latest Ubuntu image provided by Azure Pipelines.
# Variables section defines reusable values for the pipeline.
# 'group: MyAppSecrets' links to a variable group that stores sensitive information like secrets.
variables:
- group: MyAppSecrets # Load secrets, such as database credentials, from a variable group.
# Steps define the tasks that the pipeline will execute one by one.
steps:
- script: |
echo "Connecting to the database..." # Print a message indicating the start of database connection.
echo "Connection String: $(DB_CONNECTION_STRING)" # Display the database connection string from the variable group.
displayName: 'Connect to Database' # A simple name for this step that appears in the pipeline logs.
Stap 4: De pipeline draaien
- Zodra je je YAML-bestand hebt opgeslagen, ga je naar de sectie Pipelines en klik je op Run Pipeline.
- Na het draaien van de pipeline kun je je logs controleren. Je zult zien dat de secretwaarde verborgen is, waardoor je gevoelige informatie veilig blijft.
Conclusie
In deze tutorial hebben we de volledige reis met Azure Pipelines doorlopen—van het opzetten van je eerste pipeline tot het bouwen, testen, deployen, monitoren en optimaliseren ervan.
De deploymentfase vergt oefening. Begin simpel, blijf verbeteren, en na verloop van tijd zul je vertrouwen en vloeiendheid krijgen in het beheren van CI/CD-workflows. Azure Pipelines geeft je de tools, jij brengt de iteratie en het leren.
Met consistente inspanning kun je je ontwikkelproces stroomlijnen en vol vertrouwen software van hoge kwaliteit op schaal leveren.
Om dieper in Azure DevOps en Microsoft Azure te duiken, bekijk de volgende bronnen:
- Azure DevOps-tutorial - Deze tutorial leidt je door Azure DevOps en maakt CI/CD makkelijker dan ooit.
- Understanding Microsoft Azure – Bouw een sterke basis in Microsoft Azure en ontgrendel de kracht van cloud computing.
- Microsoft Azure Fundamentals (AZ-900) – Word examen-klaar met dit beginnersvriendelijke traject dat alle belangrijke Azure-fundamentals dekt.
- Understanding Microsoft Azure Architecture and Services – Leer hoe Azure's architectuur en services samenwerken om cloudoplossingen aan te sturen.
FAQs
Kan ik Azure Pipelines gebruiken voor niet-Azure-projecten?
Ja, dat kan. Azure Pipelines ondersteunt deployments naar on-premise en diverse cloudomgevingen zoals AWS, GCP en vele andere.
Welke programmeertalen ondersteunt Azure Pipelines?
Azure Pipelines ondersteunt vele programmeertalen, waaronder Node.js, Python, Java, .NET en nog veel meer.
Wat is het verschil tussen Azure Pipelines en GitHub Actions?
Azure Pipelines biedt diepere integratie met het Azure-ecosysteem en robuuste deploymenttools, terwijl GitHub Actions een eenvoudigere, GitHub-native CI/CD-ervaring biedt. Beide ondersteunen YAML-workflows en gecontaineriseerde deployments.
Kan ik Azure Pipelines gebruiken met niet-Microsoft-technologieën zoals Python of Java?
Ja, Azure Pipelines ondersteunt alle grote platforms en talen, waaronder Python, Java, Node.js en meer. Je kunt builds en deployments voor elke tech-stack configureren met YAML.
Is Azure Pipelines gratis te gebruiken?
Azure Pipelines biedt een gratis laag met 1.800 minuten/maand voor publieke projecten en beperkte buildtijd voor privéprojecten. Voor extra gebruik is een betaald abonnement of self-hosted agents vereist.
Wat zijn Azure DevOps Service Connections en waarom zijn ze belangrijk?
Service Connections koppelen Azure Pipelines veilig aan externe services zoals Azure Web Apps of Kubernetes-clusters. Ze zijn essentieel voor geautomatiseerde deployments en infrastructuurbeheer.
Hoe verhoudt Azure Pipelines zich tot Jenkins of CircleCI?
Azure Pipelines biedt een meer geïntegreerde ervaring voor Azure-gebruikers en betere ondersteuning voor Microsoft-services. Jenkins is beter aanpasbaar maar vereist meer setup; CircleCI blinkt uit in snelheid en parallellisme.
Emmanuel Akor is een Cloud- & DevOps-engineer die cloudtechnologieën en DevOps-tools inzet om impactvolle projecten te realiseren. Als Computerkunde-afgestudeerde met eervolle vermelding aan Babcock University en voormalig Cloud Co-Lead voor GDSC, combineert Emmanuel academische excellentie met praktische ervaring. Als technisch contentschrijver blinkt hij uit in kennis delen en samenwerken met teams.
