Azure DevOps: Azure Pipeline Using GitHub
À la fin de ce tutoriel, vous saurez ce qu’est Azure Pipelines, comment fonctionne le build process sur un agent éphémère (pool Microsoft-hosted), créer un premier pipeline YAML (hello bash), un pipeline multi-jobs, puis un build ASP.NET Core (.NET Framework) produisant
WebApp.zip— sans secrets ni PAT en clair.Niveau : Débutant · Temps estimé : 50–70 min · Versions testées : Azure DevOps Services (portail 2026), YAML Pipelines, agents Microsoft-hosted · Dernière vérification : 2026-09-12
Prérequis
- Démarrer avec Azure DevOps : organisation, projet
ado-lab(Private) - Repo Git dans Azure Repos (ou GitHub / Bitbucket — connecteur possible) avec branche
main(ex-mastersur anciens labs) - Droits Build Administrator ou Project Administrator (lab) pour Create Pipeline
- Compte MFA ; navigateur récent
- Pour l’exemple ASP.NET : solution
.slnciblant le .NET Framework (template portail « ASP.NET Core (.NET Framework) ») — sinon suivez les exemples 1 et 2 seulement - Budget : minutes Microsoft-hosted du Free tier ADO (quelques runs consomment quelques minutes)
Coût estimé : 0 € hors quota Free (souvent 1 800 min/mois Microsoft-hosted pour org Free — chiffres indicatifs 2026, vérifiez le portail). Aucune ressource Azure canadacentral créée ici.
Ce que nous allons construire
Hub Azure Pipelines (vue d’ensemble + 3 labs)
├── Concepts : CI/CD, agent VM éphémère, agent pool, types d’agents
├── Example-1 : Create Pipeline → Azure Repo → ubuntu-latest + bash echo
├── Example-2 : multi-jobs Firstjob / Secondjob (YAML corrigé)
└── ASP.NET Core (.NET Framework) : windows-latest + NuGet + VSBuild → WebApp.zip
Trigger
└── Push sur la branche suivie → run automatique
(Schéma à remplacer par une image locale Excalidraw / draw.io, alt : « Azure Pipelines : agent pool Microsoft-hosted, jobs YAML et build ASP.NET vers WebApp.zip ».)
Ce chapitre est la vue d’ensemble du hub mega-menu Azure Pipelines. Le YAML détaillé continue dans azure-pipelines-yaml-intro ; les agents dans Microsoft-hosted et self-hosted ; le CI build dans ci-build ; la release dans azure-release-pipeline ; le cas GitHub dans azure-devops-azure-pipeline-2.
Étape 1 — Azure Pipeline = automation CI/CD
Azure Pipelines est le service Azure DevOps qui fournit l’automation CI/CD : compiler, tester, empaqueter, puis déployer vers des environnements. Historiquement « Build & Release » (VSTS), le produit unifié s’appelle aujourd’hui Azure Pipelines.
Deux façons de définir un pipeline :
| Approche | Idée | Usage lab |
|---|---|---|
| YAML (recommandé) | Fichier versionné dans le repo (azure-pipelines.yml) |
Reproductible, reviewable en PR |
| Classic (éditeur UI) | Définition stockée côté projet | Legacy / migration progressive |
Ce tutoriel (et le hub) privilégie le YAML avec agent Microsoft-hosted, comme le live historique — modernisé pour main, indentation correcte et tâches documentées.
Concepts à ancrer dès maintenant :
| Concept | Rôle |
|---|---|
| Pipeline | Définition CI/CD (YAML ou classic) |
| Run | Une exécution concrète |
| Agent | Machine (VM) qui exécute les jobs |
| Agent pool | Collection d’agents (ex. pool « Azure Pipelines ») |
| Job / steps | Unité de travail + tâches séquentielles |
| Trigger | Événement qui démarre un run (push, PR, manuel) |
Étape 2 — Build process : VM éphémère, repos, pools
Ce que fait un run de build
- Azure Pipelines alloue une machine virtuelle (que vous ne voyez pas dans le portail Azure VMs de votre abonnement).
- L’agent clone / récupère le code depuis Azure Repos (aussi GitHub, Bitbucket, etc. selon la connexion).
- Les jobs et steps s’exécutent sur cette VM (Windows, Linux ou macOS selon l’image).
- Une fois le build terminé (succès ou échec), la VM est jetée : environnement intermédiaire, pas une machine permanente à administrer.
Cette VM est un agent, membre d’un agent pool. Le type d’agent dépend de l’image / du pool choisi dans le YAML (vmImage) ou dans la définition classic.
Types d’agents (aperçu hub)
| Type | Qui gère | Lab typique |
|---|---|---|
| Microsoft-hosted | Microsoft (images ubuntu-latest, windows-latest, macOS-latest) |
Exemples 1–2 et ASP.NET de ce chapitre |
| Self-hosted | Vous (VM, PC, scale set) | Quand minutes Free insuffisantes ou outils custom — voir agents self-hosted |
Détail des pools et images : agents Microsoft-hosted. Pour la CI réelle (tests, artefacts) : ci-build.
Rappel région : toute ressource Azure (App Service, RG, ACR…) des labs suivants doit être en canadacentral. Ce chapitre ne crée aucune ressource Azure — seulement des runs d’agents hosted.
Étape 3 — Example-1 : premier pipeline YAML (hello)
Objectif : créer un pipeline minimal avec pool ubuntu-latest et un step bash qui affiche un message — équivalent modernisé du live « Azure Basic Pipeline Code ».
- Projet
ado-lab→ Pipelines → Pipelines → Create Pipeline (ou New pipeline). - Where is your code? → Azure Repos Git (si le code est dans Azure Repos ; sinon GitHub / Bitbucket).
- Sélectionnez le repository où se trouve le code.
- Configure : choisissez un starter ou Existing Azure Pipelines YAML file si le fichier existe déjà. Pour ce lab, remplacez l’aperçu par le YAML ci-dessous.
- Save and run → branche
main(oumastersur un repo legacy) → Run.
# azure-pipelines.yml — Example-1 hello — PAS de secrets / PAT
# Agent pool = collection de VMs ; ici image Microsoft-hosted Ubuntu
trigger:
- main
pool:
vmImage: ubuntu-latest
# Steps = partie d’un job (job implicite si non déclaré)
steps:
- bash: echo "Azure Basic Pipeline Code"
displayName: "Hello Azure Pipelines"
Points à retenir (fond live enrichi) :
pool.vmImage: ubuntu-latest: l’agent Linux Microsoft-hosted du pool Azure Pipelines.steps/bash: tâche exécutée sur la VM ; un job implicite encapsule les steps si vous ne déclarez pasjobs:.- Save and Run enregistre souvent le YAML dans le repo et lance le premier run.
- Branche cible : préférez
mainen 2026 ; si votre lab est encore surmaster, aligneztriggeret la branche du run. - Aucun PAT, connection string ou mot de passe dans le fichier.
Après le run : ouvrez le job → logs → message Azure Basic Pipeline Code. Statut attendu : Succeeded.
Suite YAML structurée (artefacts, PublishPipelineArtifact, checklist) : azure-pipelines-yaml-intro.
Étape 4 — Example-2 : multi-jobs Firstjob / Secondjob
Même parcours Create Pipeline → Azure Repo, mais avec plusieurs jobs. Le YAML live historique était cassé (indentation / clé pool absente / second job sans steps correctement rattachés). Voici la version corrigée et exécutable :
# azure-pipelines.yml — Example-2 multi-jobs — PAS de secrets
trigger:
- main
# Agent pool : collection de VMs ; ubuntu-latest pour les deux jobs
pool:
vmImage: ubuntu-latest
jobs:
- job: Firstjob
timeoutInMinutes: 10
steps:
- bash: echo "The First job"
displayName: "Echo Firstjob"
- job: Secondjob
timeoutInMinutes: 10
steps:
- bash: echo "Our Second Pipeline"
displayName: "Echo Secondjob"
Comportement :
- Chaque job obtient typiquement sa propre VM Microsoft-hosted (éphémère), sauf stratégie de dépendances avancée.
timeoutInMinutes: 10limite la durée du premier job (bonne hygiène Free tier).- Les jobs parallèles consomment des parallel jobs du Free tier : en lab, enchaînez ou acceptez l’attente si le quota est saturé.
displayNamerend les logs lisibles dans le portail.
Vérification : un run avec deux jobs verts, messages The First job et Our Second Pipeline.
Étape 5 — ASP.NET Core (.NET Framework) : NuGet + VSBuild → WebApp.zip
Scénario live modernisé : build d’une app ASP.NET Core ciblant le .NET Framework sur agent Windows, avec variables, restore NuGet et packaging IIS (WebApp.zip).
- Pipelines → New Pipeline.
- Sélectionnez l’Azure Repo qui contient le code ASP.NET Core (.NET Framework).
- Choisissez le template / plateforme ASP.NET Core (.NET Framework) si proposé, puis alignez le YAML sur l’exemple ci-dessous (corrigé :
trigger,pool,variables,inputsdes tâches). - Save and run.
# ASP.NET Core (.NET Framework) — lab hub Azure Pipelines
# Build + package WebApp.zip — PAS de secrets / PAT
# Doc : https://learn.microsoft.com/azure/devops/pipelines/languages/dotnet-core
# Trigger : tout changement sur main lance le pipeline automatiquement
trigger:
- main
pool:
vmImage: windows-latest
variables:
solution: "**/*.sln"
buildPlatform: "Any CPU"
buildConfiguration: "Release"
steps:
# NuGetToolInstaller@1 : installe / prépare l’outil NuGet sur la VM
- task: NuGetToolInstaller@1
displayName: "Install NuGet tool"
# NuGetCommand@2 : restore des packages pour la solution ($(solution))
- task: NuGetCommand@2
displayName: "NuGet restore"
inputs:
restoreSolution: "$(solution)"
# VSBuild@1 : MSBuild + package WebDeploy unique WebApp.zip
- task: VSBuild@1
displayName: "Build + WebApp.zip"
inputs:
solution: "$(solution)"
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:DesktopBuildPackageLocation="$(build.artifactStagingDirectory)WebApp.zip" /p:DeployIisAppPath="Default Web Site"'
platform: "$(buildPlatform)"
configuration: "$(buildConfiguration)"
Lecture des tâches (fond live clarifié) :
| Tâche | Rôle |
|---|---|
| NuGetToolInstaller@1 | Tâche intégrée : télécharger / préparer NuGet sur la VM Windows |
| NuGetCommand@2 | Restore NuGet de la solution ($(solution)) |
| VSBuild@1 | Build MSBuild ; args WebPublish → WebApp.zip dans $(build.artifactStagingDirectory) |
Notes lab :
- Image
windows-latest: nécessaire pour MSBuild / scénario .NET Framework classique de cet exemple. - Variables
solution,buildPlatform,buildConfiguration: réutilisées dans lesinputs— pas de secrets. - Le zip est un artefact de staging ; pour le publier durablement, ajoutez ensuite
PublishBuildArtifacts/PublishPipelineArtifact(voir ci-build). - Déploiement App Service / gates : azure-release-pipeline. Connexion GitHub au lieu d’Azure Repos : azure-devops-azure-pipeline-2.
Étape 6 — Note trigger : changement de branche → run auto
Note (live préservé) : dès que le pipeline est créé avec un trigger sur main (ou master), tout changement poussé sur cette branche relance automatiquement le pipeline. C’est le cœur de la CI : plus besoin de cliquer Save and Run à chaque commit.
Bonnes pratiques hub :
- Limitez le trigger aux branches utiles (
main) pour économiser les minutes Free. - Pour valider une PR avant merge : ajoutez
pr:+ Build validation (détail dans yaml-intro). - Run manuel : Run pipeline dans le portail — utile sans nouveau commit.
- Ne mettez jamais de PAT dans un
echoou une variable non secrète.
Étape 7 — Checklist qualité (hub)
- [ ] Vous savez expliquer : CI/CD, VM agent éphémère, pool, types d’agents
- [ ] Example-1 : run Succeeded avec
echo "Azure Basic Pipeline Code" - [ ] Example-2 : deux jobs
Firstjob/Secondjobverts (YAML corrigé) - [ ] (Option) ASP.NET : restore NuGet + VSBuild + présence de
WebApp.zipen staging - [ ] Trigger auto vérifié par un push sur
main(sans secret dans le YAML) - [ ] Branche alignée
main(oumasterdocumenté) - [ ] Aucun PAT / secret versionné
Étape 8 — Vérification de fin de parcours
- Au moins un pipeline YAML lié au repo Azure Repos (ou GitHub via le chapitre 2).
- Un run hello Succeeded sur
ubuntu-latest. - Un run multi-jobs avec les deux messages d’echo.
- (Si code ASP.NET présent) build Windows avec NuGet + VSBuild.
- Un push sur la branche trigger a bien démarré un run automatique.
- Historique Git du YAML sans secrets.
Nettoyage
- Gardez les pipelines hello / multi-jobs comme socle pédagogique du hub.
- Supprimez les runs ratés en masse seulement si le bruit gêne (l’historique aide à apprendre).
- Si un PAT a été collé par erreur : révoquez immédiatement ; retirez la ligne ; considérez l’historique Git compromis.
- Économisez le Free tier : évitez
triggertrop large et les jobs Windows inutiles. - Aucune ressource
canadacentralà supprimer dans ce chapitre.
Lab bonus (8–12 min) — comparer ubuntu vs windows (info agent)
- Sur une branche feature, dupliquez Example-1 avec un second job
windows-latestqui exécutepwsh: Write-Host "Hello from Windows". - Observez dans les logs
Agent.OS/ nom d’image (introspection détaillée : agents Microsoft-hosted). - Annulez le job Windows si vous voulez préserver les minutes Free.
- Remettez un seul job
ubuntu-latestpour la suite du parcours hub.
Toujours canadacentral pour les ressources Azure des chapitres déploiement — ce lab bonus n’en crée aucune.
Scénario terrain (débutant)
« L’équipe découvre Azure Pipelines dans le mega-menu : ils veulent une vue d’ensemble (agent jetable, pool), un hello YAML, un multi-job, puis un build ASP.NET qui produit WebApp.zip, avec trigger auto sur main. » → suivez les exemples 1–2, puis l’exemple Windows si le repo a une .sln Framework. Ensuite YAML approfondi, agents, CI build, release — sans coller de PAT.
Erreurs fréquentes
| Symptôme | Cause | Correction |
|---|---|---|
| YAML mapping / indent error (Example-2) | pool / jobs mal indentés (live cassé) |
Utiliser le YAML corrigé de l’étape 4 |
/bin/bash sur Windows |
bash + windows-latest |
ubuntu-latest pour bash ; pwsh/script sur Windows |
| Pipeline ne démarre pas au push | Trigger ≠ branche poussée / pipeline non créé | Aligner trigger: - main + créer le pipeline |
| NuGet / VSBuild fail | Pas de .sln / mauvais $(solution) |
Vérifier le glob ; template ASP.NET Framework |
WebApp.zip introuvable |
Args MSBuild incomplets / mauvais staging | Garder DesktopBuildPackageLocation + $(build.artifactStagingDirectory) |
| Parallel job / queue | Free tier saturé (multi-jobs) | Attendre, cancel runs inutiles, ou self-hosted |
| Secret / PAT dans les logs | echo d’un secret |
Révoquer ; Variable groups / Key Vault — jamais en clair |
| Image 404 dans un article | Asset distant mort | Couverture locale WebP uniquement (pas d’img 404) |
Quiz (5 questions)
1. Que fait principalement Azure Pipelines ?
– A. Remplacer Azure Boards par Excel
– B. Fournir l’automation CI/CD (build, test, déploiement)
– C. Créer automatiquement un Resource Group canadacentral sans YAML
2. Après un build Microsoft-hosted, que devient la VM agent ?
– A. Elle reste facturée comme VM Azure permanente dans votre abonnement
– B. Elle est jetée (environnement éphémère)
– C. Elle est convertie en App Service
3. Dans Example-2, pourquoi le YAML live d’origine échouait souvent ?
– A. Parce que ubuntu-latest est interdit
– B. Structure jobs/steps/pool incorrecte (YAML cassé)
– C. Parce que bash est réservé à macOS
4. Quelle image convient au lab ASP.NET Framework + VSBuild de ce chapitre ?
– A. windows-latest
– B. Uniquement macOS-latest
– C. Aucune image — classic editor obligatoire
5. Que se passe-t-il si vous poussez un commit sur la branche listée dans trigger ?
– A. Rien — il faut toujours cliquer Save and Run
– B. Le pipeline est exécuté automatiquement
– C. Azure Repos est supprimé
Réponses : 1‑B · 2‑B · 3‑B · 4‑A · 5‑B
Pour aller plus loin
- Doc officielle : Azure Pipelines, YAML schema, .NET Core / Framework, Microsoft-hosted agents
- Suite hub : YAML intro → agents hosted / self-hosted → CI build → release → pipeline GitHub
Maillage hub Azure Pipelines
| ← Hub / démarrage | Démarrer avec Azure DevOps |
| → YAML approfondi | Azure Pipelines YAML : introduction |
| Agents | Microsoft-hosted · Self-hosted |
| CI / CD | CI build · Azure Release Pipeline |
| Aussi | Azure pipeline using GitHub |
Retour parcours Azure DevOps — hub de la série et leçons sœurs.



