CNB 自动清理插件,支持清理仓库的 Release、Git Tag 和 Docker 镜像 Tag。
基于https://cnb.cool/cnb/plugins/cnbcool/release-clean仓库修改
push_at 时间)通过 cleanType 参数控制需要清理的资源类型:
| cleanType | 说明 |
|---|---|
release | 仅清理 Release |
tag | 仅清理 Git Tag |
docker | 仅清理 Docker 镜像 Tag |
all(默认) | 清理以上所有类型 |
注意: 当
cleanType为docker或all时,必须确保CNB_REPO_SLUG_LOWERCASE环境变量可用,或通过imageSlug参数指定。
通过 filter 参数指定过滤策略,格式为 TYPE=PARAM:
| 过滤类型 | 格式 | 说明 | 适用资源 |
|---|---|---|---|
TAGNAME_PREFIX | TAGNAME_PREFIX=v1. | 按 Tag 名称前缀匹配 | Release / Tag / Docker |
NAME_PREFIX | NAME_PREFIX=build- | 按名称前缀匹配 | Release / Tag / Docker |
RECENT_N | RECENT_N=5 | 保留最近 N 个,删除其余 | Release / Tag / Docker |
RECENT_N_DAYS | RECENT_N_DAYS=30 | 删除 N 天前的记录 | Release / Docker |
RECENT_N_DAYS_RETAIN_N | RECENT_N_DAYS_RETAIN_N=30,3 | 保留最近 N 个 + 删除其余超过 N 天的 | Release / Docker |
注意:
RECENT_N_DAYS和RECENT_N_DAYS_RETAIN_N不适用于 Git Tag(Git Tag 没有CreatedAt字段)。Docker 的时间过滤使用last_pusher.push_at字段。
除在流水线中使用外,也可以通过 docker run 直接调用本插件:
docker run --rm \
-e TZ=Asia/Shanghai \
-e CNB_TOKEN='TOKEN' \
-e CNB_API_ENDPOINT='https://api.cnb.cool' \
-e CNB_REPO_SLUG='r_r/auto-clean' \
-e CNB_REPO_SLUG_LOWERCASE='r_r/auto-clean' \
-e PLUGIN_CLEANTYPE='all' \
-e PLUGIN_FILTER='RECENT_N=10' \
docker.cnb.cool/r_r/auto-clean:latest
注意: 请将
CNB_TOKEN替换为你自己的有效 Token。Token 需包含对应权限:
- 清理 Release/Tag:
repo-contents:rw和repo-code:rw- 清理 Docker Tag:
registry-package:r和registry-package-delete:rw
在 .cnb.yml 流水线配置中使用:
stages:
- name: auto-clean
image: docker.cnb.cool/r_r/auto-clean:latest
settings:
cleanType: "all"
filter: "RECENT_N_DAYS=30"
stages:
- name: auto-clean-releases
image: docker.cnb.cool/r_r/auto-clean:latest
settings:
cleanType: "release"
filter: "RECENT_N=10"
stages:
- name: auto-clean-docker
image: docker.cnb.cool/r_r/auto-clean:latest
settings:
cleanType: "docker"
imageSlug: "owner/my-repo" # 可选,默认取 CNB_REPO_SLUG_LOWERCASE
imageName: "my-image" # 可选,默认取仓库名
filter: "TAGNAME_PREFIX=v2024."
stages:
- name: auto-clean-preview
image: docker.cnb.cool/r_r/auto-clean:latest
settings:
cleanType: "all"
filter: "RECENT_N_DAYS_RETAIN_N=90,5"
dryRun: true
stringallrelease、tag、docker、all示例:
settings:
cleanType: "docker"
stringTYPE=PARAM。详见上方 过滤器规则示例:
settings:
filter: "RECENT_N_DAYS=60"
booleanfalsetrue 时仅输出将要删除的项目列表,不执行实际删除操作。示例:
settings:
dryRun: true
stringCNB_REPO_SLUG_LOWERCASE 环境变量值cleanType 包含 docker 时隐含必填)示例:
settings:
imageSlug: "other-owner/image-repo"
stringimageSlug 中提取的最后一段(仓库名)cleanType 包含 docker 时生效。示例:
settings:
imageName: "my-app-image"
stringCNB_REPO_SLUG)stringhttps://api.cnb.cool。stringrepo-contents:rw 和 repo-code:rwregistry-package:r 和 registry-package-delete:rw无论是否 dry-run,均会输出以下流水线变量:
##[set-output total-cleaned=15]
##[set-output cleaned-releases=5]
##[set-output cleaned-tags=8]
##[set-output cleaned-docker-tags=2]
可在后续步骤中引用:
| 变量名 | 说明 |
|---|---|
total-cleaned | 总删除数(三种类型合计) |
cleaned-releases | Release 删除数(cleanType 不包含 release 时为 0) |
cleaned-tags | Git Tag 删除数(cleanType 不包含 tag 时为 0) |
cleaned-docker-tags | Docker Tag 删除数(cleanType 不包含 docker 时为 0) |
main:
push:
- stages:
- name: auto-clean
image: docker.cnb.cool/r_r/auto-clean:latest
settings:
cleanType: "all"
filter: "RECENT_N_DAYS_RETAIN_N=90,5"
dryRun: false
exports:
total-cleaned: TOTAL_CLEANED
cleaned-releases: CLEANED_RELEASES
cleaned-tags: CLEANED_TAGS
cleaned-docker-tags: CLEANED_DOCKER_TAGS
- name: echo result
script:
- echo "Total cleaned: $TOTAL_CLEANED"
- echo "Releases: $CLEANED_RELEASES"
- echo "Tags: $CLEANED_TAGS"
- echo "Docker Tags: $CLEANED_DOCKER_TAGS"
main:
push:
- stages:
- name: auto-clean-cross-repo
image: docker.cnb.cool/r_r/auto-clean:latest
settings:
slug: "other-owner/other-repo"
imageSlug: "other-owner/other-repo"
endpoint: "https://api.cnb.cool"
token: "${OTHER_REPO_TOKEN}"
cleanType: "all"
filter: "RECENT_N_DAYS=180"
遇到 API 错误或参数缺失时,插件会退出并返回非零状态码,导致流水线失败。常见错误场景:
cleanType 值 → 提示支持的类型列表filter 参数 → 提示必填filter 格式错误 → 提示正确格式 TYPE=PARAMImageSlug → 提示需要 CNB_REPO_SLUG_LOWERCASE 或手动指定 imageSlugMIT License