You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何编写按版本数量保留最新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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.11 08:36:50