logo
0
0
WeChat Login
docs: 添加环境变量示例到 README

CNB Auto Clean Plugin

CNB 自动清理插件,支持清理仓库的 Release、Git Tag 和 Docker 镜像 Tag。

基于https://cnb.cool/cnb/plugins/cnbcool/release-clean仓库修改

功能特性

  • 支持清理 Release(按名称/Tag 前缀、时间、数量过滤)
  • 支持清理 Git Tag(按名称前缀、数量过滤)
  • 支持清理 Docker 镜像 Tag(按名称前缀、时间、数量过滤,基于 push_at 时间)
  • 支持 dry-run 模式(仅输出不删除)
  • 分页自动遍历全量数据
  • 输出流水线变量供后续步骤使用

清理类型

通过 cleanType 参数控制需要清理的资源类型:

cleanType说明
release仅清理 Release
tag仅清理 Git Tag
docker仅清理 Docker 镜像 Tag
all(默认)清理以上所有类型

注意:cleanTypedockerall 时,必须确保 CNB_REPO_SLUG_LOWERCASE 环境变量可用,或通过 imageSlug 参数指定。

过滤器规则

通过 filter 参数指定过滤策略,格式为 TYPE=PARAM

过滤类型格式说明适用资源
TAGNAME_PREFIXTAGNAME_PREFIX=v1.按 Tag 名称前缀匹配Release / Tag / Docker
NAME_PREFIXNAME_PREFIX=build-按名称前缀匹配Release / Tag / Docker
RECENT_NRECENT_N=5保留最近 N 个,删除其余Release / Tag / Docker
RECENT_N_DAYSRECENT_N_DAYS=30删除 N 天前的记录Release / Docker
RECENT_N_DAYS_RETAIN_NRECENT_N_DAYS_RETAIN_N=30,3保留最近 N 个 + 删除其余超过 N 天的Release / Docker

注意: RECENT_N_DAYSRECENT_N_DAYS_RETAIN_N 不适用于 Git Tag(Git Tag 没有 CreatedAt 字段)。Docker 的时间过滤使用 last_pusher.push_at 字段。

Docker 直接调用

除在流水线中使用外,也可以通过 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:rwrepo-code:rw
  • 清理 Docker Tag:registry-package:rregistry-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"

示例二:仅清理 Release,保留最近 10 个

stages:
  - name: auto-clean-releases
    image: docker.cnb.cool/r_r/auto-clean:latest
    settings:
      cleanType: "release"
      filter: "RECENT_N=10"

示例三:清理 Docker 镜像 Tag,按前缀 + 时间策略

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."

示例四:Dry Run 模式(预览不删除)

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

参数配置

cleanType

  • 类型: string
  • 默认值: all
  • 必填: 否
  • 说明: 需要清理的类型。支持值:releasetagdockerall

示例:

settings:
  cleanType: "docker"

filter

  • 类型: string
  • 默认值: 无
  • 必填: 是
  • 说明: 过滤规则,格式为 TYPE=PARAM。详见上方 过滤器规则

示例:

settings:
  filter: "RECENT_N_DAYS=60"

dryRun

  • 类型: boolean
  • 默认值: false
  • 必填: 否
  • 说明: 试运行模式。设为 true 时仅输出将要删除的项目列表,不执行实际删除操作。

示例:

settings:
  dryRun: true

imageSlug

  • 类型: string
  • 默认值: CNB_REPO_SLUG_LOWERCASE 环境变量值
  • 必填: 否(当 cleanType 包含 docker 时隐含必填)
  • 说明: Docker 镜像所属的仓库路径(小写)。用于定位制品仓库中的镜像包。跨仓库清理时需手动指定。

示例:

settings:
  imageSlug: "other-owner/image-repo"

imageName

  • 类型: string
  • 默认值: 从 imageSlug 中提取的最后一段(仓库名)
  • 必填: 否
  • 说明: Docker 镜像名称。仅在 cleanType 包含 docker 时生效。

示例:

settings:
  imageName: "my-app-image"

slug

  • 类型: string
  • 默认值: 当前仓库路径(CNB_REPO_SLUG
  • 必填: 否
  • 说明: Git 仓库路径。非跨仓无需传入,如需跨仓库操作可使用此参数指定。

endpoint

  • 类型: string
  • 默认值: 当前平台的 OPENAPI 地址
  • 必填: 否
  • 说明: 平台 API 地址。非跨平台无需传入,如需跨平台操作可使用此参数指定,如 https://api.cnb.cool

token

  • 类型: string
  • 默认值: 当前用户的临时票据
  • 必填: 否
  • 说明: 平台 token。如需跨平台操作,可传入该参数。需包含以下权限:
  • 清理 Release/Tag:repo-contents:rwrepo-code:rw
  • 清理 Docker Tag:registry-package:rregistry-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-releasesRelease 删除数(cleanType 不包含 release 时为 0)
cleaned-tagsGit Tag 删除数(cleanType 不包含 tag 时为 0)
cleaned-docker-tagsDocker 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=PARAM
  • Docker 清理缺少 ImageSlug → 提示需要 CNB_REPO_SLUG_LOWERCASE 或手动指定 imageSlug
  • 权限不足 → API 返回 401/403 错误

许可证

MIT License