Azure DevOps Server 2019 保留策略不再有效

Azure DevOps Server 2019 Retention Policy no longer working

上周我们在 ADS 2019.1 服务器上从 TFVC 迁移到 Git。

在我们的验证管道中,我们有一个积极的保留政策。 它设置为 Keep for 2 days,10 个 good builds with the branch filter * 并且清除所有复选框 ADS 将其写为:+refs/heads/*

我们看到的是,自从我们迁移后,none 个 Git 构建已被删除。从过去的 8 天开始,我们现在有数百个版本下降了数 GB。

* 是否使用了正确的分支过滤器?这是 ADS 输入的默认设置,我们确实希望通过此策略删除所有分支的所有构建。

我也试过**,但没有改变,在构建结果页面我看到所有构建都是从一个临时分支构建的,有一个 4 位数的数字,这可能是拉取请求号。

我们如何确保根据保留策略清理构建?

生成定义未链接到发布管道。构建是由开发人员创建的合并请求触发的。拉取请求标记为已完成。

另一个构建定义,一个在每次提交后运行的 CI 触发器,似乎仍然根据定义的保留策略删除构建。

我们的 TFS 保留策略设置的图片。清理主构建,不清理拉取请求构建

上周手动清理后 TFS 中最旧构建的列表,这些构建现在已有 4-5 天,超过了保留策略的 2 天限制。 您还可以看到它们后面没有保留锁。

已删除构建的概览。您可以在其中看到 'master' 个已被保留策略删除的构建。

显示主版本在 2 天保留策略设置后被删除

Azure DevOps Server 2019 Retention Policy no longer working

同意马特的观点。如果发布管道的工件是构建,构建管道将使用发布保留而不是构建保留:

所以,我们需要检查发布保留,Project Settings->Release retention:

您可以从文档 Build and release retention policies-Q&A.

中查看此信息

此外,如果构建无限期保留,则保留政策将不再适用。

希望这对您有所帮助。

您也可以试试:

  1. 选项卡"Retention"
  2. Select 一项政策(在您的情况下:"Keep for 2 days, […]")
  3. 在"Branch filters"下再添加一个
  4. 类型:"Include",分支规范:"refs/pull/*"

说明: 如果您在构建代理的源文件夹(名为 s)和 运行 git branch --all 中打开一个终端,您将看到每个拉取请求(例如第 1234 章此外,如果将分支规范 * 与左侧显示的路径 (+refs/heads/*) 进行比较,您会发现它实际上 not 匹配所有分支……

保留政策 UI 极具误导性,因为 * 并不是真正的 * - 它是 refs/heads/*。当 UI(或者 API)保存 'branch specification' 时,它会隐式地将 +refs/heads/ 添加到您输入的任何内容中。 main 变为 +refs/heads/mainmybranch/* 变为 +refs/heads/mybranch/*

您可以通过查看 [Build] 中 RetentionPolicy 列中的 JSON 来了解这一点。[tbl_Definition](假设默认收集数据库名称):

SELECT [DefinitionName],[RetentionPolicy]
FROM [Tfs_DefaultCollection].[Build].[tbl_Definition]

默认构建保留策略永远不会匹配拉取请求分支,存储为:

[
  {
    "branches": [
      "+refs/heads/*"
    ],
    "artifacts": [],
    "artifactTypesToDelete": [
      "FilePath",
      "SymbolStore"
    ],
    "daysToKeep": 10,
    "minimumToKeep": 2,
    "deleteBuildRecord": true,
    "deleteTestResults": true
  }
]

TFS 作业代理的构建保留策略作业针对每个构建定义调用存储过程 [Build].[prc_GetBuildsForRetention] 一次,以获取要清理的潜在构建列表。发布保留的构建已从查询结果中排除。

您可以通过这样的查询自行尝试(更新 definitionId 和 maxFinishTime,可能还有 dataspaceId 和 partitionId):

EXEC [Tfs_DefaultCollection].[Build].[prc_GetBuildsForRetention]
    @partitionId = 1,
    @dataspaceId = 22,
    @definitionId = 164,
    @minFinishTime = '0001-01-01',
    @maxFinishTime = '2021-08-03',
    @maxBuilds = 1000

您会看到类似这样的结果:

要在您的保留策略中包含拉取请求,请添加一个新条目并在分支规范框中键入 refs/pull/*。这将作为 +refs/pull/* 持续到 JSON。您可能希望将 'days to keep' 设置得较低(我使用 1),并将 'minimum to keep' 设置得较低(我使用 0)。我们的 PR 构建将在几个小时后过期,因此将它们保留更长的时间没有什么好处。

为了将来参考,构建保留策略作业代码位于 Microsoft.TeamFoundation.Build2.Server.Extensions.BuildRetentionPolicyJob class 中的 <installFolder>\Application Tier\TFSJobAgent\Plugins\Microsoft.TeamFoundation.Build2.Server.Extensions.dll