Partager via


Contexte d’expression de décorateur de pipeline

Azure DevOps Services

Les décorateurs de pipeline ont accès au contexte sur le pipeline dans lequel ils s’exécutent. En tant qu’auteur de décorateur de pipeline, vous pouvez utiliser ce contexte pour prendre des décisions sur le comportement du décorateur. Les informations disponibles dans le contexte sont différentes pour les pipelines et pour la mise en production. En outre, les décorateurs s’exécutent une fois que les noms des tâches sont résolus en identificateurs globaux uniques (GUID). Lorsque votre décorateur souhaite référencer une tâche, il doit utiliser le GUID plutôt que le nom ou le mot clé.

Conseil

Consultez notre documentation la plus récente sur le développement d’extensions à l’aide du Kit de développement logiciel (SDK) d’extension Azure DevOps.

Remarque

Les décorateurs de pipeline sont utilisés lors de la création d’extensions web. Ces exemples ne sont pas conçus pour fonctionner dans des pipelines YAML.

Ressources

Les ressources de pipeline sont disponibles sur l’objet resources .

Référentiels

Actuellement, il n’y a qu’une seule clé : repositories. repositories est un mappage de l’ID de dépôt aux informations sur le référentiel.

Dans une build de concepteur, l’alias de dépôt principal est __designer_repo. Dans un pipeline YAML, le dépôt principal est appelé self. Dans un pipeline de mise en production, les référentiels ne sont pas disponibles. Les variables d’artefact de mise en production sont disponibles.

Par exemple, pour imprimer le nom du self dépôt dans un pipeline YAML :

steps:
- script: echo ${{ resources.repositories['self'].name }}

Les référentiels contiennent ces propriétés :

resources['repositories']['self'] =
{
	"alias": "self",
	"id": "<repo guid>",
	"type": "Git",
	"version": "<commit hash>",
	"name": "<repo name>",
	"project": "<project guid>",
	"defaultBranch": "<default ref of repo, like 'refs/heads/main'>",
	"ref": "<current pipeline ref, like 'refs/heads/topic'>",
	"versionInfo": {
		"author": "<author of tip commit>",
		"message": "<commit message of tip commit>"
	},
	"checkoutOptions": {}
}

Travail

Les détails du travail sont disponibles sur l’objet job .

Les données ressemblent à ce qui suit :

job = 
{
	"steps": [
		{
			"environment": null,
			"inputs": {
				"script": "echo hi"
			},
			"type": "Task",
			"task": {
				"id": "d9bafed4-0b18-4f58-968d-86655b4d2ce9",
				"name": "CmdLine",
				"version": "2.146.1"
			},
			"condition": null,
			"continueOnError": false,
			"timeoutInMinutes": 0,
			"id": "5c09f0b5-9bc3-401f-8cfb-09c716403f48",
			"name": "CmdLine",
			"displayName": "CmdLine",
			"enabled": true
		}
	]
}

Par exemple, pour ajouter une tâche de manière conditionnelle uniquement s’il n’existe pas encore :

- ${{ if not(containsValue(job.steps.*.task.id, 'f3ab91e7-bed6-436a-b651-399a66fe6c2a')) }}:
  - script: echo conditionally inserted

Variables

Les variables de pipeline sont également disponibles.

Par exemple, si le pipeline avait une variable appelée myVar, sa valeur serait disponible pour le décorateur en tant que variables['myVar'].

Par exemple, pour donner à un décorateur un opt-out, nous pourrions rechercher une variable. Les auteurs de pipelines qui souhaitent refuser le décorateur peuvent définir cette variable et le décorateur n’est pas injecté. Si la variable n’est pas présente, le décorateur est injecté comme d’habitude.

my-decorator.yml

- ${{ if ne(variables['skipInjecting'], 'true') }}:
  - script: echo Injected the decorator

Ensuite, dans un pipeline de l’organisation, l’auteur peut demander au décorateur de ne pas s’injecter lui-même.

pipeline-with-opt-out.yml

variables:
  skipInjecting: true
steps:
- script: echo This is the only step. No decorator is added.

Noms des tâches et GUID

Les décorateurs s’exécutent après que les tâches ont déjà été transformées en GUID. Considérez le yaML suivant :

steps:
- checkout: self
- bash: echo This is the Bash task
- task: PowerShell@2
  inputs:
    targetType: inline
    script: Write-Host This is the PowerShell task

Chacune de ces étapes est mappée à une tâche. Chaque tâche a un GUID unique. Les noms et mots clés des tâches sont mappés aux GUID des tâches avant l’exécution des décorateurs. Si un décorateur souhaite vérifier l’existence d’une autre tâche, il doit effectuer une recherche par GUID de tâche plutôt que par nom ou mot clé.

Pour les tâches normales (que vous spécifiez avec le task mot clé), vous pouvez examiner les tâches task.json pour déterminer son GUID. Pour des mots clés spéciaux comme checkout et bash dans l’exemple précédent, vous pouvez utiliser les GUID suivants :

Mot clé GUID Nom de la tâche
checkout 6D15AF64-176C-496D-B583-FD2AE21D4DF4 n/a, voir remarque
bash 6C731C3C-3C68-459A-A5C9-BDE6E6595B5B Bash
script D9BAFED4-0B18-4F58-968D-86655B4D2CE9 CmdLine
powershell E213FF0F-5D5C-4791-802D-52EA3E7BE1F1 PowerShell
pwsh E213FF0F-5D5C-4791-802D-52EA3E7BE1F1 PowerShell
publish ECDC45F6-832D-4AD9-B52B-EE49E94659BE PublishPipelineArtifact
download 30f35852-3f7e-4c0c-9a88-e127b4f97211 DownloadPipelineArtifact

Une fois les noms de tâches et les mots clés résolus, le YAML précédent devient :

steps:
- task: 6D15AF64-176C-496D-B583-FD2AE21D4DF4@1
  inputs:
    repository: self
- task: 6C731C3C-3C68-459A-A5C9-BDE6E6595B5B@3
  inputs:
    targetType: inline
    script: echo This is the Bash task
- task: E213FF0F-5D5C-4791-802D-52EA3E7BE1F1@2
  inputs:
    targetType: inline
    script: Write-Host This is the PowerShell task

Conseil

Vous trouverez chacun de ces GUID dans la tâche dans la task.json zone correspondante. La seule exception est checkout, qui est une fonctionnalité native de l’agent. Son GUID est intégré au service et à l’agent Azure Pipelines.