Date de la publication : 8 décembre 2025
Lecture : 17 min
Découvrez comment migrer d'Azure DevOps vers GitLab à l'aide des outils de migration des Services professionnels de GitLab, de la planification à l'exécution en passant par les tâches de suivi post-migration.

La migration d'Azure DevOps vers GitLab peut sembler complexe, mais avec la bonne approche et les bons outils, le processus sera fluide et efficace. Ce guide détaille toutes les étapes pour migrer avec succès vos projets, dépôts et pipelines d'Azure DevOps vers GitLab.
GitLab propose à la fois Congregate (maintenu par les Services professionnels de GitLab) et une importation intégrée des dépôts Git pour migrer des projets depuis Azure DevOps (ADO). Ces options prennent en charge la migration dépôt par dépôt ou de façon groupée et préservent l'historique des commits git, les branches et les tags. Elles prennent également en charge des éléments supplémentaires tels que les wikis, les éléments de travail, les variables CI/CD, les images de conteneurs, les paquets, les pipelines et bien plus encore (matrice de fonctionnalités). Utilisez ce guide pour planifier et exécuter votre migration, puis accomplir les tâches de suivi post-migration.
Les entreprises qui migrent d'Azure DevOps vers GitLab suivent généralement une approche en plusieurs étapes :
Phases de migration principales :
graph LR
subgraph Prérequis
direction TB
A["Configurer le fournisseur d'identité (IdP)<br/>et provisionner les utilisateurs"]
A --> B["Configurer les runners et<br/>les intégrations tierces"]
B --> I["Former les utilisateurs et<br/>gérer le changement"]
end
subgraph MigrationPhase["Phase de migration"]
direction TB
C["Migrer le code source"]
C --> D["Préserver les contributions et<br/>l'historique du format"]
D --> E["Migrer les éléments de travail,<br/>mapper vers <a href="https://docs.gitlab.com/topics/plan_and_track/">GitLab Plan<br/>et suivre le travail"]
end
subgraph PostMigration["Étapes post-migration"]
direction TB
F["Créer ou traduire les<br/>pipelines ADO vers GitLab CI"]
F --> G["Migrer les autres actifs,<br/>paquets et images de conteneurs"]
G --> H["Introduire des améliorations SDLC et de <a href="https://docs.gitlab.com/user/application_security/secure_your_application/">sécurité</a><br/>"]
end
Prérequis --> MigrationPhase
MigrationPhase --> PostMigration
style A fill:#FC6D26
style B fill:#FC6D26
style I fill:#FC6D26
style C fill:#8C929D
style D fill:#8C929D
style E fill:#8C929D
style F fill:#FFA500
style G fill:#FFA500
style H fill:#FFA500
Pour planifier votre migration, posez-vous ces questions :
Déterminez votre calendrier, car il dictera en grande partie votre approche de migration. Identifiez des spécialistes ou des groupes familiarisés avec les plateformes Azure DevOps et GitLab (comme les « Early adopters ») pour faciliter l'adoption et fournir des conseils.
Faites l'inventaire de ce que vous devez migrer :
Utilisez l'outil Evaluate des Services professionnels de GitLab pour produire un inventaire complet de toute votre organisation Azure DevOps avec les dépôts, le nombre de pull requests, les listes de contributeurs, le nombre de pipelines, les éléments de travail, les variables CI/CD et bien plus encore. Si vous travaillez avec l'équipe des Services professionnels de GitLab, partagez ce rapport avec votre responsable de mission ou votre architecte technique pour faciliter la planification de la migration.
Le calendrier de migration est principalement déterminé par le nombre de pull requests, la taille des dépôts et le volume de contributions (par exemple, les commentaires dans les pull requests, les éléments de travail, etc.). 1 000 petits dépôts avec un nombre limité de pull requests et de contributeurs peuvent migrer beaucoup plus rapidement qu'un ensemble plus restreint de dépôts contenant des dizaines de milliers de pull requests et des milliers de contributeurs. Utilisez vos données d'inventaire pour estimer l'effort et planifier des tests avant de procéder aux migrations de production.
Comparez l'inventaire avec le calendrier souhaité et décidez si vous allez migrer tous les dépôts à la fois ou par lots. Si les équipes ne peuvent pas migrer simultanément, organisez les migrations par lots et échelonnez-les pour vous aligner sur les calendriers des équipes. Par exemple, lors des missions des Services professionnels, nous organisons des migrations par vagues de 200 à 300 projets pour limiter la complexité et respecter les limites de débit des API, à la fois dans GitLab et ADO.
L'outil d'importation de dépôt intégré de GitLab migre les dépôts Git (commits, branches et tags) un par un. Congregate est conçu pour préserver les pull requests (appelées merge requests dans GitLab), les commentaires et les métadonnées associées lorsque cela est possible ; l'importation simple de dépôt intégrée se concentre uniquement sur les données Git (historique, branches et tags).
Éléments nécessitant généralement une migration distincte ou une recréation manuelle :
Examinez ce que chaque outil (Congregate vs importation intégrée) va migrer et choisissez celui qui correspond à vos besoins. Dressez une liste de toutes les données ou intégrations qui doivent être migrées ou recréées manuellement.
Qui exécutera la migration ?
Les migrations sont généralement exécutées par un propriétaire de groupe GitLab ou un administrateur d'instance, ou par une personne désignée ayant obtenu les permissions nécessaires relatives au groupe/projet de destination. Congregate et les API d'importation GitLab nécessitent des tokens d'authentification valides pour Azure DevOps et GitLab.
Remarque : Congregate exploite la fonctionnalité d'importation basée sur des fichiers pour les migrations ADO et nécessite des permissions d'administrateur d'instance pour s'exécuter (consultez notre documentation). Si vous migrez vers GitLab.com, envisagez de faire appel aux Services professionnels. Pour plus d'informations, consultez leur catalogue complet. Un compte non-administrateur ne peut pas préserver l'attribution des contributions !
Quelle structure organisationnelle souhaitons-nous dans GitLab ?
Bien qu'il soit possible de mapper directement la structure ADO vers la structure GitLab, il est recommandé de rationaliser et de simplifier la structure pendant la migration. Réfléchissez à la façon dont les équipes travailleront dans GitLab et concevez la structure de façon à faciliter la collaboration et la gestion des accès. Voici un exemple de mappage de la structure ADO vers la structure GitLab :
graph TD
subgraph GitLab
direction TB
A["Groupe principal"]
B["Sous-groupe (facultatif)"]
C["Projets"]
A --> B
A --> C
B --> C
end
subgraph AzureDevOps["Azure DevOps"]
direction TB
F["Organisations"]
G["Projets"]
H["Dépôts"]
F --> G
G --> H
end
style A fill:#FC6D26
style B fill:#FC6D26
style C fill:#FC6D26
style F fill:#8C929D
style G fill:#8C929D
style H fill:#8C929D
Approche recommandée :
Tableaux ADO et éléments de travail : état de la migration
Il est important de comprendre comment les éléments de travail migrent d'ADO vers GitLab Plan (tickets, epics et tableaux).
Exemple d'une migration d'un élément de travail individuel vers un ticket GitLab, avec conservation des champs et relations :

Conseils pour la migration par lots :
Migration des pipelines
Congregate a récemment introduit une conversion basée sur l'IA pour les pipelines YAML multi-étapes d'Azure DevOps vers GitLab CI/CD. Cette conversion automatisée fonctionne avant tout pour les pipelines simples avec un fichier unique et est conçue pour fournir un point de départ fonctionnel plutôt qu'un fichier .gitlab-ci.yml prêt pour la production. L'outil génère un pipeline GitLab équivalent sur le plan fonctionnel que vous pouvez ensuite affiner et optimiser selon vos besoins.
.gitlab-ci.ymlLes propriétaires de dépôts doivent consulter la documentation GitLab CI/CD pour optimiser et améliorer davantage leurs pipelines après la conversion initiale.
Exemple de pipelines convertis :
# azure-pipelines.yml
trigger:
- main
variables:
imageName: myapp
stages:
- stage: Build
jobs:
- job: Build
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: Docker@2
displayName: Build Docker image
inputs:
command: build
repository: $(imageName)
Dockerfile: '**/Dockerfile'
tags: |
$(Build.BuildId)
- stage: Test
jobs:
- job: Test
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
# Example: run tests inside the container
- script: |
docker run --rm $(imageName):$(Build.BuildId) npm test
displayName: Run tests
- stage: Push
jobs:
- job: Push
pool:
vmImage: 'ubuntu-latest'
steps:
- checkout: self
- task: Docker@2
displayName: Login to ACR
inputs:
command: login
containerRegistry: '<your-acr-service-connection>'
- task: Docker@2
displayName: Push image to ACR
inputs:
command: push
repository: $(imageName)
tags: |
$(Build.BuildId)
# .gitlab-ci.yml
variables:
imageName: myapp
stages:
- build
- test
- push
build:
stage: build
image: docker:latest
services:
- docker:dind
script:
- docker build -t $imageName:$CI_PIPELINE_ID -f $(find . -name Dockerfile) .
only:
- main
test:
stage: test
image: docker:latest
services:
- docker:dind
script:
- docker run --rm $imageName:$CI_PIPELINE_ID npm test
only:
- main
push:
stage: push
image: docker:latest
services:
- docker:dind
before_script:
- docker login -u $CI_REGISTRY_USER -p $CI_REGISTRY_PASSWORD $CI_REGISTRY
script:
- docker tag $imageName:$CI_PIPELINE_ID $CI_REGISTRY/$CI_PROJECT_PATH/$imageName:$CI_PIPELINE_ID
- docker push $CI_REGISTRY/$CI_PROJECT_PATH/$imageName:$CI_PIPELINE_ID
only:
- main
Liste de contrôle finale :
Une fois la planification terminée, exécutez les migrations par étapes, en commençant par des migrations d'essai, qui permettent de faire remonter les problèmes spécifiques à l'organisation tôt et de mesurer la durée, de valider les résultats et d'affiner votre approche avant la production.
Utilisez les migrations d'essai pour valider les éléments suivants :
Conseils concernant les temps d'arrêt :
Conseils pour la migration par lots :
Étapes recommandées :
.gitlab-ci.yml) ou les pipelines convertis le cas échéant.| GitLab | Azure DevOps | Similitudes et différences clés |
|---|---|---|
| Groupe | Organisation | Espace de nommage principal, adhésion, politiques. Une organisation ADO contient des projets ; un groupe GitLab contient des sous-groupes et des projets. |
| Groupe ou sous-groupe | Projet | Conteneur logique, limite de permissions. Un projet ADO contient de nombreux dépôts ; les groupes/sous-groupes GitLab contiennent de nombreux projets. |
| Projet (inclut un dépôt Git) | Dépôt (à l'intérieur d'un projet) | Historique Git, branches, tags. Dans GitLab, un « projet » est le dépôt plus les tickets, CI/CD, wiki, etc. Un dépôt par projet. |
| Merge Request (MR) | Pull Request (PR) | Revue de code, discussions, approbations. Les règles des MR incluent les approbations, les pipelines requis, les propriétaires de code. |
| Branches protégées, règles d'approbation des MR, vérifications de statut | Politiques des branches | Imposent des revues et des vérifications. GitLab combine les protections + les règles d'approbation + les vérifications de statut requises. |
| GitLab CI/CD | Pipelines Azure | Pipelines YAML, étapes/jobs, logs. ADO a également des pipelines UI classiques ; GitLab se concentre sur .gitlab-ci.yml. |
| .gitlab-ci.yml | azure-pipelines.yml | Définit les étapes/jobs/déclencheurs. La syntaxe/les fonctionnalités diffèrent ; map job, variables, artefacts et déclencheurs. |
| Runners (partagés/spécifiques) | Agents / pools d'agents | Exécutent les jobs sur des machines/conteneurs. Ciblent via des demandes (ADO) ou tags (GitLab). L'enregistrement/la portée diffère. |
| Variables CI/CD (projet/groupe/instance), protégées/masquées | Variables de pipeline, groupes de variables, bibliothèque | Transmettent la configuration/les secrets aux jobs. GitLab prend en charge l'héritage de groupe et les flags de masquage/protection. |
| Intégrations, variables CI/CD, clés de déploiement | Connexions de service | Authentification externe vers les services/clouds. Map vers les intégrations ou les variables ; des assistants spécifiques au cloud sont disponibles. |
| Environnements et déploiements (environnements protégés) | Environnements (avec approbations) | Suivent les cibles/l'historique de déploiement. Approbations via environnements protégés et jobs manuels dans GitLab. |
| Versions (tag + notes) | Versions (classiques ou pipelines) | Notes/artefacts versionnés. La version GitLab est liée aux tags ; les déploiements sont suivis séparément. |
| Artefacts de job | Artefacts de pipeline | Inscrivent de manière permanente les sorties de job. La rétention/l'expiration sont configurées par job ou par projet. |
| Registre de paquets (NuGet/npm/Maven/PyPI/Composer, etc.) | Artefacts Azure (NuGet/npm/Maven, etc.) | Hébergement de paquets. L'authentification/l'espace de nommage diffère ; migrez par type de paquets. |
| Registre de conteneurs GitLab | Registre de conteneurs Azure (ACR) ou autres | Images OCI. GitLab fournit des registres par projet/groupe. |
| Tableaux de tickets | Tableaux | Affichent les tâches dans des colonnes. Les tableaux GitLab sont pilotés par des labels ; plusieurs tableaux par projet/groupe. |
| Tickets (types/labels), epics | Éléments de travail (user story/bogue/tâche) | Suivent les unités de travail. Mappent les types/champs ADO vers les labels/champs personnalisés ; epics au niveau du groupe. |
| Epics, tickets parent/enfant | Epics/fonctionnalités | Hiérarchie du travail. Le schéma diffère ; utilisation des epics + relations de tickets. |
| Jalons et itérations | Chemins d'itération | Temps limité. Itérations GitLab (fonctionnalité de groupe) ou jalons par projet/groupe. |
| Labels (labels à portée) | Chemins de domaine | Catégorisation/propriété. Remplacement des domaines hiérarchiques par des labels à portée. |
| Wiki de projet/groupe | Wiki de projet | Wiki Markdown. Sauvegardes avec des dépôts dans les deux ; la mise en page/l'authentification diffère légèrement. |
| Rapports de test via CI, gestion des exigences/tests, intégrations | Plans/cas/exécutions de test | QA des preuves/de la traçabilité. Pas de correspondance 1:1 avec les plans de test ADO ; utilisent souvent les rapports CI + tickets/exigences. |
| Rôles (propriétaire/chargé de maintenance/développeur/rapporteur/invité) + rôles personnalisés | Niveaux d'accès + permissions granulaires | Contrôlent la lecture/l'écriture/l'administration. Les modèles diffèrent ; exploitation de l'héritage de groupe et des ressources protégées. |
| Webhooks | Hooks de service | Intégrations basées sur les événements. Les noms/charges utiles d'événements diffèrent ; reconfiguration des points de terminaison. |
| Recherche avancée | Recherche de code | Recherche dans le dépôt en texte intégral. GitLab Self-Managed peut nécessiter Elasticsearch/OpenSearch pour les fonctionnalités avancées. |
Cet article de blog vous a plu ou vous avez des questions ou des commentaires ? Partagez vos réflexions en créant un sujet dans le forum de la communauté GitLab.
Donnez votre avis