Rétention des exécutions de pipeline
Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
La conservation d'une exécution de pipeline pour une durée supérieure aux paramètres du projet configurés est gérée par la création de baux de conservation. Les baux de conservation temporaire sont souvent créés par des processus automatiques et des baux plus permanents en manipulant l’interface utilisateur ou lorsque Release Management conserve les artefacts, mais ils peuvent également être manipulés via l’API REST. Voici quelques exemples de tâches que vous pouvez ajouter à votre pipeline yaml à des fins de rétention.
Prérequis
Par défaut, des membres des groupes Contributeurs, Administrateurs de build, Administrateurs de projet et Administrateurs de mise en production peuvent gérer des stratégies de rétention.
Exemple : remplacer une fenêtre de rétention courte au niveau du projet
Dans cet exemple, le projet est configuré pour supprimer les exécutions de pipeline après seulement 30 jours.
Si un pipeline de ce projet est important et que les exécutions doivent être conservées pendant plus de 30 jours, cette tâche garantit la validité de l’exécution pendant deux ans en ajoutant un nouveau bail de rétention.
- task: PowerShell@2
condition: and(succeeded(), not(canceled()))
name: RetainOnSuccess
displayName: Retain on Success
inputs:
failOnStderr: true
targetType: 'inline'
script: |
$contentType = "application/json";
$headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
$rawRequest = @{ daysValid = 365 * 2; definitionId = $(System.DefinitionId); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(Build.BuildId) };
$request = ConvertTo-Json @($rawRequest);
$uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;
Question : un pipeline peut-il être retenu pour moins que les valeurs configurées du projet ?
Non, les baux ne fonctionnent pas dans le sens inverse. Si un projet est configuré pour être conservé pendant deux ans, le pipeline exécute le système ne supprime pas les exécutions pendant deux ans. Pour supprimer ces exécutions plus tôt, supprimez-les manuellement ou utilisez l'API REST équivalente.
Exemple : Seules les exécutions sur les branches nommées releases/*
doivent être conservées pendant une longue période
Ceci est similaire à ce qui précède, seule la condition doit changer :
- task: PowerShell@2
condition: and(succeeded(), not(canceled()), startsWith(variables['Build.SourceBranch'], 'releases/'))
name: RetainReleaseBuildOnSuccess
displayName: Retain Release Build on Success
inputs:
failOnStderr: true
targetType: 'inline'
script: |
$contentType = "application/json";
$headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
$rawRequest = @{ daysValid = 365 * 2; definitionId = $(System.DefinitionId); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(Build.BuildId) };
$request = ConvertTo-Json @($rawRequest);
$uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;
Exemple : Mise à jour de la fenêtre de rétention d’un pipeline multiétapes en fonction de la réussite de l’étape
Considérez un pipeline en deux phases qui exécute d’abord une build, puis une mise en production. En cas de réussite, la Build
phase conserve l’exécution pendant trois jours, mais l’administrateur de projet souhaite qu’une phase réussie Release
prolonge le bail à un an.
La phase Build
peut conserver le pipeline comme dans les exemples ci-dessus, mais avec un ajout : en enregistrant le Id
du nouveau bail dans une variable de sortie, le bail peut être mis à jour ultérieurement lors de l’exécution de la phase de mise en production.
- task: PowerShell@2
condition: and(succeeded(), not(canceled()))
name: RetainOnSuccess
displayName: Retain on Success
inputs:
failOnStderr: true
targetType: 'inline'
script: |
$contentType = "application/json";
$headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
$rawRequest = @{ daysValid = 365; definitionId = $(System.DefinitionId); ownerId = 'User:$(Build.RequestedForId)'; protectPipeline = $false; runId = $(Build.BuildId) };
$request = ConvertTo-Json @($rawRequest);
$uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases?api-version=6.0-preview.1";
$newLease = Invoke-RestMethod -uri $uri -method POST -Headers $headers -ContentType $contentType -Body $request;
$newLeaseId = $newLease.Value[0].LeaseId
echo "##vso[task.setvariable variable=newLeaseId;isOutput=true]$newLeaseId";
Pour mettre à jour un bail de rétention, vous devez appeler une autre API REST.
- stage: Release
dependsOn: Build
jobs:
- job: default
variables:
- name: NewLeaseId
value: $[ stageDependencies.Build.default.outputs['RetainOnSuccess.newLeaseId']]
steps:
- task: PowerShell@2
condition: and(succeeded(), not(canceled()))
name: RetainOnSuccess
displayName: Retain on Success
inputs:
failOnStderr: true
targetType: 'inline'
script: |
$contentType = "application/json";
$headers = @{ Authorization = 'Bearer $(System.AccessToken)' };
$rawRequest = @{ daysValid = 365 };
$request = ConvertTo-Json $rawRequest;
$uri = "$(System.CollectionUri)$(System.TeamProject)/_apis/build/retention/leases/$(newLeaseId)?api-version=7.1-preview.2";
Invoke-RestMethod -uri $uri -method PATCH -Headers $headers -ContentType $contentType -Body $request;
Étapes suivantes
Avec ces exemples, vous avez appris à utiliser des tâches de pipeline personnalisées pour gérer la rétention des exécutions.
Vous avez appris à :
- Remplacer une fenêtre de rétention courte
- Remplacer la rétention pour les exécutions sur des branches spécifiques
- Mettre à jour un bail de rétention lorsqu’une exécution doit être conservée encore plus longtemps