如何编写按版本数量保留最新10个版本的Artifactory清理脚本?
解决方案思路与代码示例
这个需求很常见,咱们核心要解决的是按制品维度分组,对每个组内的版本按日期排序后保留最新10个,其余批量删除。下面分步骤拆解思路,再给你Python代码示例参考:
核心思路步骤
- 第一步:按制品唯一标识分组:比如按制品名称、项目ID这类能区分不同制品的字段,把所有版本归到对应的组里——毕竟咱们要给每个制品单独留10个版本,不能跨制品混排。
- 第二步:对组内版本按日期降序排序:这里的日期优先用制品的创建/上传时间,降序排完后,列表最前面的就是最新的版本。
- 第三步:筛选出待删除的版本:每组里只保留前10个,剩下的所有版本就是我们要删除的目标。如果某组本身版本数≤10,就跳过不处理。
- 第四步:安全执行删除操作:删除前最好加个确认环节(比如打印待删列表让用户核对),避免误删;如果是调用API删除,记得加异常捕获,防止个别版本删除失败导致整个流程中断。
代码示例(Python)
假设我们的制品数据是从仓库API拉取的,每个制品对象包含artifact_name(制品名称)、version(版本号)、created_at(创建时间,格式为datetime对象)、delete_url(删除接口地址)这些字段:
from collections import defaultdict from datetime import datetime # 模拟从制品仓库拉取的所有版本数据 sample_artifacts = [ {"artifact_name": "user-service", "version": "v1.3.5", "created_at": datetime(2024, 5, 20), "delete_url": "/api/delete/user-service/v1.3.5"}, {"artifact_name": "user-service", "version": "v1.3.4", "created_at": datetime(2024, 5, 18), "delete_url": "/api/delete/user-service/v1.3.4"}, {"artifact_name": "user-service", "version": "v1.3.3", "created_at": datetime(2024, 5, 15), "delete_url": "/api/delete/user-service/v1.3.3"}, # 省略更多版本... {"artifact_name": "order-service", "version": "v2.1.0", "created_at": datetime(2024, 6, 1), "delete_url": "/api/delete/order-service/v2.1.0"}, ] def keep_latest_n_artifacts(artifacts, keep_count=10): # 1. 按制品名称分组 artifact_groups = defaultdict(list) for art in artifacts: artifact_groups[art["artifact_name"]].append(art) to_delete = [] for name, versions in artifact_groups.items(): # 2. 按创建时间降序排序(最新的在前) sorted_versions = sorted(versions, key=lambda x: x["created_at"], reverse=True) # 3. 筛选出需要删除的版本(跳过前keep_count个) if len(sorted_versions) > keep_count: to_delete.extend(sorted_versions[keep_count:]) print(f"制品 {name} 共有 {len(sorted_versions)} 个版本,将保留最新 {keep_count} 个,删除 {len(sorted_versions)-keep_count} 个") else: print(f"制品 {name} 仅 {len(sorted_versions)} 个版本,无需删除") # 4. 执行删除(这里模拟删除,实际替换为API调用或本地删除命令) print("\n待删除版本列表:") for art in to_delete: print(f"- {art['artifact_name']}: {art['version']} (创建时间: {art['created_at'].strftime('%Y-%m-%d')})") # 实际删除操作示例: # import requests # response = requests.delete(art["delete_url"]) # if response.status_code != 200: # print(f"删除失败:{art['artifact_name']}:{art['version']}") return to_delete # 调用函数,保留每个制品最新10个版本 keep_latest_n_artifacts(sample_artifacts, keep_count=10)
额外注意事项
- 数据备份:在正式执行删除前,一定要先导出所有制品的版本数据做备份,防止误删后无法恢复。
- 测试验证:先在测试环境或者小范围制品上测试脚本逻辑,确认保留的版本符合预期后再批量执行。
- 兼容原有逻辑:如果需要结合“未被下载”的条件(比如最新10个里如果有未下载的也保留,其余未下载的才删),可以在筛选待删版本时再加个判断:
if len(sorted_versions) > keep_count and art["download_count"] == 0,不过这得看你具体需求调整。
内容的提问来源于stack exchange,提问作者Cigizmoond Vyhuholev
相关产品推荐
相关产品推荐

