Partager via


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.

Exemple 1 : stratégies de rétention des paramètres de projet

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