logo
3
0
Login
The repository has been archived and is now in read-only mode.
feat: 新增Docker镜像同步Web触发器并支持多架构中间镜像清理

CNB 同步工具集

这个项目提供了一套工具,用于将 Docker 镜像、GitHub 仓库和 GitHub Releases 同步到 CNB (Cloud Native Builder) 平台。

TOKEN 设置

CNB 平台的 API 需要通过 MY_CNB_TOKENCNB_TOKEN 进行访问授权。你可以在 CNB 个人中心 - 访问令牌 创建新的访问令牌,并在流水线或本地导出环境变量,例如:

export MY_CNB_TOKEN="your_token_here"

或者

export CNB_TOKEN="your_token_here"

推荐优先使用 MY_CNB_TOKEN,脚本会自动优先读取该变量。

最小授权范围

以下权限是保证所有同步功能正常运行的最小授权,请在创建令牌时勾选:

  • repo-code:读写(推拉 Git 仓库)
  • repo-basic-info:读写(查询或修改仓库基础信息)
  • repo-manage:读写(新建或修改仓库设置)
  • repo-contents:读写(管理分支、标签、提交、Release 信息)
  • group-resource:读写(创建或管理组织、子组织)
  • group-manage:读写(管理组织成员及组织设置)

功能特点

GitHub 仓库同步 (sync_git.py)

  • 将 GitHub 仓库同步到 CNB 平台
  • 支持创建新仓库或更新现有仓库
  • 支持设置仓库描述、许可证和可见性
  • 支持两种推送模式:mirror(完整镜像)和 safe(仅推送 heads 和 tags)
  • 自动处理 Git LFS 文件
  • 自动设置仓库站点链接到原始 GitHub 仓库

Docker 镜像清理 (clean_docker.py)

  • 删除 CNB Registry 中的 Docker 镜像标签
  • 支持精确删除指定标签
  • 支持通过模糊匹配批量删除标签
  • 提供确认机制,防止误操作

Docker 镜像同步 (sync_docker.py)

  • 从 Docker Hub 获取指定镜像的最新标签
  • 支持多平台镜像同步(linux/amd64, linux/arm64, linux/386 等)
  • 自动重新标记镜像并推送到 CNB Registry (docker.cnb.cool)
  • 创建多架构 manifest 并推送
  • 支持并发处理,提高同步效率

GitHub Releases 同步 (sync_release.py)

  • 获取 GitHub 仓库的所有 releases
  • 自动检查 release 是否已存在于 CNB
  • 创建不存在的 release
  • 下载 release 资源并上传到 CNB
  • 支持多线程并发处理,可配置并行下载数
  • 自动重试下载失败的资源

使用方法

GitHub 仓库同步

python sync_git.py --github-repo <GitHub仓库> --cnb-repo-path <CNB仓库路径> [选项]

参数说明:

  • --github-repo: GitHub 仓库路径,例如 AlistGo/docs
  • --cnb-repo-path: CNB 完整仓库路径,例如 gither/Mirrors/AlistGo/docs
  • --description: 仓库描述(可选)
  • --license: 许可证名称,默认为 "MIT"(可选)
  • --visibility: 仓库可见性,可选值为 "public" 或 "private",默认为 "public"
  • --push-mode: 推送模式,可选值为 "safe" 或 "mirror",默认为 "mirror"
    • "mirror": 使用 --mirror 完整镜像推送
    • "safe": 仅推送 heads 和 tags

示例:

# 基本用法 python sync_git.py --github-repo AlistGo/docs --cnb-repo-path gither/Mirrors/AlistGo/docs # 设置私有仓库 python sync_git.py --github-repo AlistGo/docs --cnb-repo-path gither/Mirrors/AlistGo/docs --visibility private --description "Mirror of AlistGo docs" # 使用安全推送模式 python sync_git.py --github-repo AlistGo/docs --cnb-repo-path gither/Mirrors/AlistGo/docs --push-mode safe

Docker 镜像清理

python clean_docker.py --repo <CNB仓库路径> --session <CNBSESSION> --csrfkey <CSRFKEY> [--tag <标签名>] [--filter <过滤模式>]

参数说明:

  • --repo: CNB 仓库路径,例如 gither/mirrors/debian
  • --session: CNB 会话 Cookie(CNBSESSION)
  • --csrfkey: CNB CSRF 密钥
  • --tag: 要删除的具体标签名称(与 --filter 互斥)
  • --filter: 用于批量删除的标签过滤模式(与 --tag 互斥)
  • --yes: 跳过确认提示,直接执行删除操作(谨慎使用)

示例:

# 删除单个标签 python clean_docker.py --repo gither/mirrors/debian --session <your-session> --csrfkey <your-csrfkey> --tag latest # 批量删除匹配模式的标签 python clean_docker.py --repo gither/mirrors/debian --session <your-session> --csrfkey <your-csrfkey> --filter "-amd64" # 跳过确认直接删除标签 python clean_docker.py --repo gither/mirrors/debian --session <your-session> --csrfkey <your-csrfkey> --tag latest --yes

注意:

  • 默认情况下,所有删除操作都需要确认,脚本会提示输入 "yes" 来确认删除操作
  • 使用 --yes 参数可以跳过确认提示,直接执行删除操作,请谨慎使用
  • CNBSESSION 和 CSRFKEY 可以从浏览器的开发者工具中获取

Docker 镜像同步

python sync_docker.py --image <镜像名称> --cnb-repo <CNB仓库路径> [选项]

参数说明:

  • --image: 要同步的 Docker 镜像,例如 library/debian
  • --cnb-repo: CNB 仓库路径,例如 gither/mirrors/debian(也可通过环境变量 CNB_REPO_SLUG 设置)
  • --limit: 要同步的标签数量,默认为 3
  • --platforms: 要同步的平台列表,默认为 ["linux/amd64", "linux/arm64", "linux/386"]
  • --workers: 最大并行下载数,默认为 4

示例:

python sync_docker.py --image library/debian --cnb-repo gither/mirrors/debian --limit 5

GitHub Releases 同步

python sync_release.py --github-repo <GitHub仓库> --cnb-repo <CNB仓库路径> [选项]

参数说明:

  • --github-repo: GitHub 仓库路径,例如 tdp/paper-editor
  • --cnb-repo: CNB 仓库路径,例如 tdp/paper-editor
  • --limit: 要同步的最新 release 数量(可选)
  • --workers: 最大并行下载数,默认为 4
  • --only-latest-tag: 仅同步最新的标签(可选)

功能特点:

  • 自动获取 GitHub 仓库的所有 releases
  • 从旧到新处理每个 release
  • 自动检查 release 是否已存在于 CNB
  • 创建不存在的 release
  • 并行下载和上传 release 资源
  • 自动重试下载失败的资源
  • 过滤 Draft 和 Pre-release 版本

示例:

# 同步指定数量的最新 release python sync_release.py --github-repo tdp/paper-editor --cnb-repo tdp/paper-editor --limit 10 # 仅同步最新的 release python sync_release.py --github-repo tdp/paper-editor --cnb-repo tdp/paper-editor --only-latest-tag # 使用更多并行下载线程 python sync_release.py --github-repo tdp/paper-editor --cnb-repo tdp/paper-editor --workers 8

环境变量

  • CNB_REPO_SLUG: CNB 仓库路径(用于 Docker 镜像同步)
  • CNB_TOKEN: CNB API 访问令牌(用于 GitHub Releases 同步和 GitHub 仓库同步)
  • CNB_DOMAIN: CNB 域名,默认为 "cnb.cool"

依赖项

  • Python 3.6+
  • Docker CLI 和 Docker Buildx(用于多架构镜像处理)
  • Git 和 Git LFS(用于仓库同步)
  • Git CNB CLI
  • Python 包:
    • requests
    • tenacity(用于自动重试下载)

开发环境

项目包含 .cnb.yml 配置文件,用于设置 VSCode 开发环境。该配置定义了基于 Docker 的开发环境,包括所需的服务和启动任务。

工作流程

  1. GitHub 仓库同步流程

    • 检查目标 CNB 仓库是否存在
    • 如果不存在,创建新仓库并设置基本信息(描述、许可证、可见性)
    • 设置仓库站点链接到原始 GitHub 仓库
    • 克隆 GitHub 仓库(bare 模式)
    • 配置并处理 Git LFS 文件
    • 根据选择的推送模式(mirror/safe)同步到 CNB
    • 推送所有 Git LFS 文件
  2. Docker 镜像清理流程

    • 连接到 CNB Registry
    • 获取指定仓库的所有标签
    • 根据用户指定的标签名或过滤模式筛选标签
    • 确认删除操作(除非使用 --yes 参数跳过确认)
    • 执行标签删除操作
  3. Docker 镜像同步流程

    • 获取指定镜像的最新标签
    • 为每个标签的每个平台拉取镜像
    • 重新标记为 CNB Registry 格式
    • 推送到 CNB Registry
    • 创建多架构 manifest
  4. GitHub Releases 同步流程

    • 获取 GitHub 仓库的所有 releases
    • 过滤掉 Draft 和 Pre-release 版本
    • 从旧到新处理每个 release
    • 检查 release 是否已存在于 CNB
    • 创建不存在的 release
    • 并行下载和上传 release 资源
    • 自动重试失败的下载