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