Przechowywanie przebiegów potoku
Azure DevOps Services | Azure DevOps Server 2022 r. | Azure DevOps Server 2020 r.
Zachowywanie uruchomienia potoku dłużej niż skonfigurowane ustawienia projektu jest obsługiwane przez tworzenie dzierżaw przechowywania. Dzierżawy przechowywania tymczasowego są często tworzone przez procesy automatyczne i bardziej trwałe dzierżawy, manipulując interfejsem użytkownika lub gdy Release Management zachowuje artefakty, ale mogą być również manipulowane za pośrednictwem interfejsu API REST. Poniżej przedstawiono kilka przykładów zadań, które można dodać do potoku yaml na potrzeby przechowywania.
Wymagania wstępne
Domyślnie członkowie grup Współautorzy, Administratorzy kompilacji, Administratorzy projektu i Administratorzy wydania mogą zarządzać zasadami przechowywania.
Przykład: przesłanianie krótkiego okna przechowywania na poziomie projektu
W tym przykładzie projekt jest skonfigurowany do usuwania przebiegów potoku po upływie zaledwie 30 dni.
Jeśli potok w tym projekcie jest ważny, a przebiegi powinny być przechowywane przez dłużej niż 30 dni, to zadanie gwarantuje, że przebieg będzie ważny przez dwa lata, dodając nową dzierżawę przechowywania.
- PowerShell
- Bash
- Zadanie interfejsu API REST
- 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;
Pytanie: czy potok może być zachowywany dla wartości mniejszych niż skonfigurowane wartości projektu?
Nie, dzierżawy nie działają w odwrotnej kolejności. Jeśli projekt jest skonfigurowany do przechowywania przez dwa lata, uruchomienie potoku nie spowoduje usunięcia przebiegów przez dwa lata. Aby usunąć te przebiegi wcześniej, usuń je ręcznie lub użyj równoważnego interfejsu API REST.
Przykład: Tylko przebiegi w gałęziach o nazwie releases/*
powinny być przechowywane przez długi czas
Jest to podobne do powyższych. Tylko warunek musi ulec zmianie:
- 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;
Przykład: aktualizowanie okna przechowywania dla potoku wieloetapowego na podstawie powodzenia etapu
Rozważmy dwuetapowy potok, który najpierw uruchamia kompilację, a następnie wydanie. Po pomyślnym zakończeniu Build
etap zachowuje przebieg przez trzy dni, ale administrator projektu chce, aby etap zakończył się powodzeniem Release
, aby przedłużyć dzierżawę do jednego roku.
Etap Build
może zachować potok, jak w powyższych przykładach, ale z jednym dodatkiem: zapisując nową dzierżawę Id
w zmiennej wyjściowej, dzierżawa może zostać zaktualizowana później po uruchomieniu etapu wydania.
- 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";
Aby zaktualizować dzierżawę przechowywania , wymagane jest inne wywołanie interfejsu 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;
Następne kroki
W tych przykładach przedstawiono sposób używania niestandardowych zadań potoku do zarządzania przechowywaniem przebiegów.
W tym samouczku omówiono:
- Przesłanianie krótkiego okna przechowywania
- Zastępowanie przechowywania dla przebiegów w określonych gałęziach
- Aktualizowanie dzierżawy przechowywania, gdy przebieg powinien być zachowywany jeszcze dłużej