Partager via


Utiliser plusieurs référentiels dans votre pipeline

Azure DevOps Services | Azure DevOps Server | Azure DevOps Server 2022

Pipelines s’appuient souvent sur plusieurs référentiels qui contiennent du code source, des outils, des scripts ou d’autres éléments dont vous avez besoin pour générer votre code. En utilisant plusieurs étapes checkout dans votre pipeline, vous pouvez récupérer (fetch) et extraire d’autres référentiels, outre celui que vous utilisez pour stocker votre pipeline YAML.

Spécifier plusieurs référentiels

Les référentiels peuvent être spécifiés en tant que ressource repository ou inline avec l’étape checkout.

Sont pris en charge les types de référentiels suivants.


  • Azure DevOps Server (limité aux dépôts dans la même organisation)
  • Azure DevOps Services

GitHub (github)

  • Azure DevOps Services

GitHubEnterprise (githubenterprise)

  • Azure DevOps Services

Bitbucket Cloud (bitbucket)

  • Azure DevOps Services

Important

Seuls Azure Repos Git (git) dans la même organisation que le pipeline sont pris en charge pour l’extraction de plusieurs référentiels dans Azure DevOps Server.

Notes

Azure Pipelines fournit Limiter l’étendue du travail pour les référentiels Git Azure Repos. Pour extraire Azure Repos référentiels Git hébergés dans un autre project, Limiter l’étendue du travail doit être configuré pour autoriser access. Pour plus d’informations, consultez Limiter l’étendue d’autorisation du travail.

Sont prises en charge les combinaisons suivantes d’étapes checkout.


Aucune étape checkout

Le comportement par défaut est identique au cas de figure où checkout: self constitue la première étape, et le référentiel actuel est extrait.


Une seule étape checkout: none

Aucun référentiel n’est synchronisé ni extrait.


Une seule étape checkout: self

Le référentiel actuel est extrait.


Une seule étape checkout qui n’est pas self ni none

Le référentiel désigné est extrait au lieu de self.


Plusieurs étapes checkout

Chaque référentiel désigné est extrait dans un dossier nommé d’après le référentiel, à moins qu’un autre path ne soit spécifié à l’étape checkout. Pour extraire self comme référentiel, utilisez checkout: self parmi les étapes checkout.


Notes

Lorsque vous consultez Azure Repos référentiels Git autres que celui contenant le pipeline, vous pouvez être invité à autoriser access à cette ressource avant l’exécution du pipeline pour la première fois. Pour plus d’informations, consultez Pourquoi m’est-il demandé d’autoriser des ressources la première fois que j’essaie d’extraire un autre référentiel ? dans la section FAQ.

Définition de ressources de référentiel

Vous devez utiliser une ressource repository si votre type de référentiel nécessite une connexion de service ou un autre champ de ressources étendues. Une connexion de service est nécessaire pour les types de référentiels suivants.

Type de référentiel Connexion du service
Bitbucket Cloud Bitbucket Cloud
GitHub GitHub
GitHub Enterprise Server GitHub Enterprise Server
Azure Repos référentiels Git dans une organisation différente de celle de votre pipeline Azure Repos/Team Foundation Server

Il est possible d’utiliser une ressource de référentiel même si le type de référentiel en question n’implique pas de connexion de service, par exemple si une ressource de référentiel a déjà été définie pour les modèles dans un autre référentiel.

Dans l’exemple suivant, trois référentiels sont déclarés en tant que ressources de référentiel. Dépôt Git Azure Repos dans une autre organisation, GitHub et Bitbucket Cloud les ressources du référentiel nécessitent des connexions service qui sont spécifiées comme endpoint pour ces ressources de référentiel. Cet exemple comporte quatre étapes checkout, ce qui permet d’extraire les trois référentiels déclarés en tant que ressources de référentiel, ainsi que le référentiel self actuel qui contient le YAML de pipeline.

resources:
  repositories:
  - repository: MyGitHubRepo # The name used to reference this repository in the checkout step
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
  - repository: MyBitbucketRepo
    type: bitbucket
    endpoint: MyBitbucketServiceConnection
    name: MyBitbucketOrgOrUser/MyBitbucketRepo
  - repository: MyAzureReposGitRepository # In a different organization
    endpoint: MyAzureReposGitServiceConnection
    type: git
    name: OtherProject/MyAzureReposGitRepo

trigger:
- main

pool:
  vmImage: 'ubuntu-latest'

steps:
- checkout: self
- checkout: MyGitHubRepo
- checkout: MyBitbucketRepo
- checkout: MyAzureReposGitRepository

- script: dir $(Build.SourcesDirectory)

Si le référentiel self est nommé CurrentRepo, la commande script produit la sortie CurrentRepo MyAzureReposGitRepo MyBitbucketRepo MyGitHubRepo. Dans cet exemple, le nom donné aux dossiers est celui des référentiels (indiqué par la propriété name dans la ressource de référentiel), car aucun path n’est spécifié à l’étape checkout. Pour plus d’informations sur les noms et emplacements des dossiers de référentiel, consultez la section Chemin d’extraction suivante.

Syntaxe checkout inline

Si votre référentiel n’a pas besoin d’une connexion de service, vous pouvez le déclarer inline avec votre étape checkout.

Notes

Seuls Azure Repos référentiels Git dans la même organisation peuvent utiliser la syntaxe inline. Azure Repos référentiels Git dans une autre organisation et d’autres types de référentiels pris en charge nécessitent une connexion service et doivent être déclarés comme une ressource repository.

steps:
- checkout: self
- checkout: git://MyProject/MyRepo # Azure Repos Git repository in the same organization

Notes

Dans l'exemple précédent, le référentiel checkout self est spécifié afin d'extraire la source du référentiel associé au pipeline.

Si vous utilisez le référentiel Git par défaut Azure Repos (qui porte le même nom que le project), utilisez le format - checkout: git://MyProject/MyRepo.

Chemin de l’extraction

À moins qu’un path ne soit spécifié à l’étape checkout, le code source est placé dans un répertoire par défaut. Ce répertoire est différent selon qu’un seul ou plusieurs référentiels sont extraits.

  • Un seul référentiel : si le travail comporte une seule étape checkout ou ne comprend pas d’étape checkout équivalente à checkout: self, le code source est extrait dans un répertoire appelé s, qui constitue un sous-dossier de $(Agent.BuildDirectory). Si $(Agent.BuildDirectory) a la valeur C:\agent\_work\1, le code est extrait dans C:\agent\_work\1\s.

  • Plusieurs référentiels : si le travail comporte plusieurs étapes checkout, le code source est extrait dans les répertoires nommés d’après les référentiels qui constituent un sous-dossier de s dans $(Agent.BuildDirectory). Si $(Agent.BuildDirectory) est C:\agent\_work\1 et que les référentiels s’appellent tools et code, le code est extrait dans C:\agent\_work\1\s\tools et C:\agent\_work\1\s\code.

    Notes

    Si aucun path n’est spécifié à l’étape checkout, le nom donné au dossier est celui du référentiel, et non la valeur repository permettant de faire référence au référentiel à l’étape checkout.

Si un path est spécifié pour une étape checkout, il est utilisé, par rapport à $(Agent.BuildDirectory).

Notes

Lorsque les chemins par défaut sont utilisés, le fait d’ajouter une deuxième étape de référentiel checkout a pour effet de modifier le chemin par défaut du code du premier référentiel. Par exemple, le code d’un référentiel nommé tools est extrait dans C:\agent\_work\1\s quand tools représente le seul référentiel. Cependant, si un deuxième référentiel est ajouté, tools est extrait dans C:\agent\_work\1\s\tools. Toute étape dépendant du code source qui se trouve à l’emplacement d’origine doit être mise à jour.

Référentiel d’espace de travail

Lorsque plusieurs étapes checkout (et différents chemins d’accès pour chacun) sont utilisées dans votre pipeline, vous pouvez utiliser le répertoire racine de l’un des référentiels comme répertoire de travail par défaut. Si c’est le cas, vous pouvez définir l’entrée workspaceRepo sur true pour l’étape de checkout associée.

- checkout: git://project/first
  path: repo/first-repo

- checkout: git://project/second
  path: repo/second-repo
  workspaceRepo: true

- pwsh: pwd
# Expected output: $(Pipeline.Workspace)/repo/second-repo

Extraction d’une référence spécifique

La branche par défaut est extraite, à moins que vous ne désigniez une référence spécifique.

Si vous utilisez la syntaxe inline, désignez la référence en ajoutant @<ref>. Par exemple :

- checkout: git://MyProject/MyRepo@features/tools # checks out the features/tools branch
- checkout: git://MyProject/MyRepo@refs/heads/features/tools # also checks out the features/tools branch
- checkout: git://MyProject/MyRepo@refs/tags/MyTag # checks out the commit referenced by MyTag.

Important

La checkout valeur, y compris la partie incluse @<ref> , se résout au moment de la compilation en tant que référence de ressource. Les variables de syntaxe de macro ($(var)) ne sont pas développées dans la checkout valeur. Par exemple, checkout: git://MyProject/MyRepo@$(branch) ne résout pas la variable : le pipeline tente d’extraire un ref nommé littéralement $(branch), ce qui échoue généralement avec une erreur « ref introuvable ».

Pour paramétrer la branche, utilisez des expressions de modèle (${{ }}) avec des paramètres d’exécution, comme illustré dans les exemples suivants. ${{ variables.myVar }} fonctionne uniquement pour les variables définies en tant que valeurs littérales dans YAML (connu au moment de la compilation), et non pour les variables de mise en file d’attente ou de définition dynamique.

Paramétrer une branche avec une syntaxe inline

Définissez un paramètre runtime et référencez-le avec une expression de modèle dans la valeur d’extraction inline :

parameters:
  - name: branch
    type: string
    default: 'main'

steps:
  - checkout: git://MyProject/MyRepo@${{ parameters.branch }}

Paramétrer une branche avec une ressource de référentiel

Utilisez la ref propriété sur une ressource de référentiel pour définir la branche à partir d’un paramètre :

parameters:
  - name: branch
    type: string
    default: 'main'

resources:
  repositories:
    - repository: MyRepo
      type: git
      name: MyProject/MyRepo
      ref: ${{ parameters.branch }}

steps:
  - checkout: MyRepo

Lorsque vous utilisez une ressource de référentiel, spécifiez la référence à l’aide de la propriété ref. L’exemple suivant extrait la branche features/tools/ du référentiel désigné.

resources:
  repositories:
  - repository: MyGitHubRepo
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
    ref: features/tools

steps:
- checkout: MyGitHubRepo

L’exemple suivant utilise tags pour extraire la validation référencée par MyTag.

resources:
  repositories:
  - repository: MyGitHubRepo
    type: github
    endpoint: MyGitHubServiceConnection
    name: MyGitHubOrgOrUser/MyGitHubRepo
    ref: refs/tags/MyTag

steps:
- checkout: MyGitHubRepo

Déclencheurs

Il est possible de déclencher un pipeline lorsqu’une mise à jour est envoyée (push) au référentiel self ou à l’un des référentiels déclarés en tant que ressources. Cette solution est utile, par exemple, dans les scénarios suivants :

  • Vous consommez un outil ou une bibliothèque à partir d’un autre référentiel. Vous souhaitez exécuter des tests de votre application chaque fois que l’outil ou la bibliothèque est mis à jour.
  • Vous conservez votre fichier YAML dans un référentiel distinct du code de l’application. Vous souhaitez déclencher le pipeline chaque fois qu’une mise à jour est envoyée (push) au référentiel de l’application.

Important

Les déclencheurs de ressource de référentiel fonctionnent uniquement pour Azure Repos référentiels Git dans la même organisation et lorsque le type de référentiel self est Azure Repos Git. Ils ne fonctionnent pas pour les ressources de dépôt GitHub ou Bitbucket.

batch n’est pas pris en charge dans les déclencheurs de ressources de référentiel.

Si vous ne spécifiez pas de section trigger dans une ressource de référentiel, le pipeline n’est pas déclenché par les modifications apportées à ce référentiel. Dans le cas inverse où une section trigger est définie, le comportement observé est similaire au fonctionnement des déclencheurs CI pour le référentiel self.

Si vous spécifiez une section trigger pour plusieurs ressources de référentiel, toute modification apportée à l’une d’elles déclenche une nouvelle exécution.

Lorsqu’un pipeline est déclenché, Azure Pipelines doit déterminer la version du fichier YAML qui doit être utilisée et une version pour chaque référentiel à extraire. Si une modification apportée au référentiel self déclenche un pipeline, la validation qui a déclenché le pipeline est utilisée pour déterminer la version du fichier YAML. Dans le cas où le pipeline est déclenché par une modification apportée à une autre ressource de référentiel, c’est la dernière version de YAML dans la branche par défaut du référentiel self qui est retenue.

Lorsqu’une mise à jour de l’un des référentiels déclenche un pipeline, les variables suivantes sont définies en fonction du référentiel en question :

  • Build.Repository.ID
  • Build.Repository.Name
  • Build.Repository.Provider
  • Build.Repository.Uri
  • Build.SourceBranch
  • Build.SourceBranchName
  • Build.SourceVersion
  • Build.SourceVersionMessage

Pour le référentiel déclencheur, le commit qui a déclenché le pipeline détermine la version du code extrait. En ce qui concerne les autres référentiels, la version par défaut extraite dépend du ref défini dans YAML pour la ressource de référentiel.

Prenons l’exemple suivant, où le référentiel self contient le fichier YAML, et les référentiels A et B du code source supplémentaire.

trigger:
- main
- feature

resources:
  repositories:
  - repository: A
    type: git
    name: MyProject/A
    ref: main
    trigger:
    - main

  - repository: B
    type: git
    name: MyProject/B
    ref: release
    trigger:
    - main
    - release
steps:
- checkout: self
- checkout: A
- checkout: B

Le tableau suivant montre quelles versions sont extraites pour chaque référentiel par un pipeline utilisant le fichier YAML ci-dessus.

Élément modifié Pipeline déclenché Version de YAML Version de self Version de A Version de B
main dans self Oui Commit à partir de main qui a déclenché le pipeline Commit à partir de main qui a déclenché le pipeline La dernière à partir de main La dernière à partir de release
feature dans self Oui Commit à partir de feature qui a déclenché le pipeline Commit à partir de feature qui a déclenché le pipeline La dernière à partir de main La dernière à partir de release
main dans A Oui La dernière à partir de main La dernière à partir de main Commit à partir de main qui a déclenché le pipeline La dernière à partir de release
main dans B Oui La dernière à partir de main La dernière à partir de main La dernière à partir de main Commit à partir de main qui a déclenché le pipeline
release dans B Oui La dernière à partir de main La dernière à partir de main La dernière à partir de main Commit à partir de release qui a déclenché le pipeline

Vous pouvez également déclencher le pipeline lorsque vous créez ou mettez à jour une demande de tirage (pull request) dans l’un des référentiels. To do cela, déclarez les ressources du référentiel dans les fichiers YAML comme dans les exemples ci-dessus et configurez une stratégie de branche dans le référentiel (Azure Repos uniquement).

Détails du référentiel

Lorsque plusieurs référentiels sont extraits, certaines données sur le référentiel self sont disponibles sous forme de variables. Si vous utilisez des déclencheurs multiréférentiels, certaines de ces variables comportent au contraire des informations sur le référentiel déclencheur. Le détail de tous les référentiels consommés par le travail est disponible sous la forme d’un objet de contexte de modèle appelé resources.repositories.

Par exemple, pour obtenir la référence d’un référentiel autre que self, il est possible d’écrire un pipeline comme suit :

resources:
  repositories:
  - repository: other
    type: git
    name: MyProject/OtherTools

variables:
  tools.ref: $[ resources.repositories['other'].ref ]

steps:
- checkout: self
- checkout: other
- bash: |
    echo "Tools version: $TOOLS_REF"

Questions fréquentes (FAQ)

Pourquoi ne puis-je pas extraire un référentiel d'un autre project ? Cela fonctionnait auparavant.

Azure Pipelines fournit une étendue d'autorisation de travail Limiter le paramètre actuel project, qui, lorsqu'il est activé, n'autorise pas le pipeline à access ressources en dehors du project qui contient le pipeline. Ce paramètre peut être défini au niveau de l’organisation ou du project. Si ce paramètre est activé, vous ne pourrez pas extraire un référentiel dans une autre project, sauf si vous accordez explicitement access. Pour plus d’informations, consultez 'étendue d’autorisationJob.

Pourquoi m’est-il demandé d’autoriser des ressources la première fois que j’essaie d’extraire un autre référentiel ?

Lorsque vous consultez Azure Repos référentiels Git autres que celui contenant le pipeline, vous pouvez être invité à autoriser access à cette ressource avant l’exécution du pipeline pour la première fois. Ces invites s’affichent sur la page récapitulative de l’exécution du pipeline.

This pipeline a besoin d’autorisation pour access une ressource

Bouton « Autoriser les ressources ».

Choisissez Afficher ou Autoriser des ressources, puis suivez les invites pour autoriser les ressources.

Fenêtre « En attente d’examen ».

Permit access

Pour plus d’informations, consultez Résolution des problèmes d’autorisation d’un pipeline YAML.