Azure DevOps Services | Azure DevOps Server 2022 | Azure DevOps Server 2020
保留管道运行的时间超过配置的项目设置的问题是通过创建保留租约来处理的。 临时保留租约通常是由自动流程创建的,更永久的租约是通过操作 UI 创建的,或者是在 Release Management 保留工件时创建的,但你也可以通过 REST API 来操作它们。 下面是一些可添加到 yaml 管道以保留的任务示例。
先决条件
默认情况下,参与者、生成管理员、项目管理员和发布管理员组的成员可以管理保留策略。
示例:替代短的项目级保留期
在此示例中,项目配置为在仅 30 天后删除管道运行。
如果此项目中的管道很重要,并且运行应保留超过 30 天,则此任务通过 添加新的保留租约来确保运行有效期为两年。
- 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;
问题:管道的保留时间是否可以少于配置的项目值?
否,租约不能反过来。 如果将项目配置为保留两年,则管道运行系统不会删除两年的运行。 若要提前删除这些运行,请手动删除它们或使用等效的 REST API。
示例:只应长期保留名为 releases/*
的分支上的运行
这类似于上述情况,只需更改条件:
- 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;
示例:在阶段成功后更新多阶段管道的保留期
请考虑一个两阶段管道,该管道首先运行生成,然后运行发布。 成功后,阶段 Build
将运行保留三天,但项目管理员希望成功 Release
阶段将租约延长至一年。
Build
阶段可以像上述示例所示的那样保留管道,但需要补充的是:通过将新租约的 Id
保存在输出变量中,租约可以稍后在发布阶段运行时更新。
- 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";
更新保留租约需要不同的 REST API 调用。
- 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;
后续步骤
通过这些示例,你了解了如何使用自定义管道任务来管理运行保留。
你已了解如何执行以下操作:
- 替代较短的保留期
- 替代特定分支上的运行的保留期
- 在运行应保留更长时间时更新保留租约