Freigeben über


Aufbewahrung von Pipelineausführungen

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

Das Beibehalten einer Pipelineausführung länger als die konfigurierten Projekteinstellungen erfolgt durch die Erstellung von Aufbewahrungsleases. Temporäre Aufbewahrungsleases werden häufig durch automatische Prozesse und dauerhaftere Leases erstellt, indem die Benutzeroberfläche bearbeitet wird oder wenn Release Management Artefakte beibehält, aber sie können auch über die REST-API bearbeitet werden. Im Folgenden finden Sie einige Beispiele für Aufgaben, die Sie ihrer yaml-Pipeline zur Aufbewahrung hinzufügen können.

Voraussetzungen

Standardmäßig können Mitglieder der Gruppen „Mitwirkende“, „Buildadministratoren“, „Projektadministratoren“ und „Releaseadministratoren“ Aufbewahrungsrichtlinien verwalten.

Beispiel: Überschreiben eines kurzen Aufbewahrungsfensters auf Projektebene

In diesem Beispiel ist das Projekt so konfiguriert, dass Pipelineausführungen nach nur 30 Tagen gelöscht werden.

Beispiel 1: Aufbewahrungsrichtlinien für Projekteinstellungen

Wenn eine Pipeline in diesem Projekt wichtig ist und Ausführungen länger als 30 Tage aufbewahrt werden sollen, stellt diese Aufgabe sicher, dass die Ausführung zwei Jahre lang gültig ist, indem eine neue Aufbewahrungleasase hinzugefügt wird.

- 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;

Frage: Kann eine Pipeline für weniger als die konfigurierten Projektwerte beibehalten werden?

Nein, Leases funktionieren umgekehrt nicht. Wenn ein Projekt so konfiguriert ist, dass es zwei Jahre lang aufbewahrt wird, wird die Ausführung durch die Pipeline nicht für zwei Jahre entfernt. Um diese Ausführungen zuvor zu löschen, löschen Sie sie manuell, oder verwenden Sie die entsprechende REST-API.

Beispiel: Nur Ausführungen für Branches mit dem Namen releases/* sollten für einen längeren Zeitraum beibehalten werden.

Dies ist ähnlich wie oben, nur die Bedingung muss sich ändern:

- 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;

Beispiel: Aktualisieren des Aufbewahrungsfensters für eine mehrstufige Pipeline basierend auf dem Phasenerfolg

Stellen Sie sich eine zweistufige Pipeline vor, die zuerst einen Build und dann ein Release ausführt. Bei erfolgreicher Ausführung behält die Build Phase die Ausführung drei Tage lang bei, aber der Projektadministrator möchte eine erfolgreiche Release Phase, um die Lease auf ein Jahr zu verlängern.

Die Build Phase kann die Pipeline wie in den obigen Beispielen beibehalten, aber mit einer Ergänzung: Durch das Speichern der neuen Lease in Id einer Ausgabevariablen kann die Lease später aktualisiert werden, wenn die Releasephase ausgeführt wird.

- 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";

Um eine Aufbewahrungleasase zu aktualisieren, ist ein anderer REST-API-Aufruf erforderlich.

- 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;

Nächste Schritte

In diesen Beispielen haben Sie gelernt, wie Sie benutzerdefinierte Pipelinetasks verwenden, um die Ausführungsaufbewahrung zu verwalten.

Sie haben Folgendes gelernt:

  • Überschreiben eines kurzen Aufbewahrungsfensters
  • Überschreiben der Aufbewahrung für Ausführungen in bestimmten Branches
  • Aktualisieren einer Aufbewahrungslease, wenn eine Ausführung noch länger aufbewahrt werden soll