Artifactory配置需求:仅保留单个构建制品,新制品上传自动删旧
解决Artifactory仅保留单个构建制品的方案
以下是几种可行的实现方式,覆盖内置配置、构建脚本集成、API调用等场景:
一、利用Artifactory内置清理规则(最省心)
直接在Artifactory仓库配置里设置自动清理:
- 进入目标仓库的Cleanup Policies配置页
- 新建清理规则,核心配置:
- 启用「Keep only the last N artifacts」,把N设为1
- 添加过滤条件(比如按制品后缀
*.jar、特定路径),避免误删其他文件 - 触发方式选「After each deployment」,确保每次上传新制品后立刻清理旧的
二、构建脚本中前置删除逻辑
在上传新制品前,先删除仓库里的旧制品,适合需要精准控制的场景:
Maven/Shell 示例(用jfrog-cli)
# 删除指定路径下所有旧制品 jfrog rt del "my-repo/apps/my-service/*" --quiet # 上传新构建的制品 jfrog rt upload "target/my-service-*.jar" "my-repo/apps/my-service/"
Gradle 示例
在build.gradle里加前置任务:
task cleanOldArtifacts(type: Exec) { commandLine 'jfrog', 'rt', 'del', 'my-repo/apps/my-service/*', '--quiet' } // 上传前先执行删除 uploadArchives.dependsOn(cleanOldArtifacts)
三、用REST API精准删除旧制品
如果需要更灵活的逻辑(比如按上传时间筛选),可以写个脚本调用Artifactory API:
# 获取仓库中指定路径下,除最新制品外的所有文件路径 OLD_ITEMS=$(curl -u your-username:your-password "https://artifactory.example.com/api/search/aql" -d ' items.find({ "repo": "my-repo", "path": "apps/my-service" }).sort({"$desc": ["created"]}).skip(1).include("repo", "path", "name") ' | jq -r '.results[] | .repo + "/" + .path + "/" + .name') # 循环删除旧制品 for ITEM in $OLD_ITEMS; do curl -u your-username:your-password -X DELETE "https://artifactory.example.com/api/storage/$ITEM" done
把这个脚本和你的构建流水线绑定,上传完新制品后执行即可。
四、绑定构建记录清理(适合关联构建的场景)
如果你的制品和Artifactory构建记录关联,可以通过清理旧构建来自动删制品:
- 进入构建配置页,启用「Discard Old Builds」,设置仅保留最新1个构建
- 勾选「Delete artifacts when discarding builds」,删除旧构建时会同步删除对应的制品
内容的提问来源于stack exchange,提问作者Mahesh Margam
相关产品推荐
相关产品推荐

