logo
0
0
WeChat Login
feat: 支持同步 Release 的 latest 标记

CNB GitHub 迁移插件

将 GitHub 仓库一键迁移至 CNB,支持迁移代码和 Release。


功能特性

  • 自动判断 CNB 仓库是否存在,不存在则自动创建
  • 在 CNB 创建仓库(自动同步描述、许可证、可见性)
  • 使用 git push --mirror 镜像推送所有分支和标签
  • 增量迁移 GitHub Release 及其附件(已存在的 Release 自动跳过,缺失附件自动补传)
  • 同步 GitHub Release 标记到 CNB(Latest、Pre-release 标记与 GitHub 保持一致)
  • 同步仓库 Topics 和 Homepage
  • 支持公开仓库无需 GitHub Token 即可迁移

Docker 直接调用

除在流水线中使用外,也可以通过 docker run 直接调用本插件:

docker run --rm \
  -e TZ=Asia/Shanghai \
  -e PLUGIN_CNB_TOKEN='cnb_xxxx' \
  -e PLUGIN_GITHUB_REPO='owner/repo' \
  -e PLUGIN_CNB_SLUG='your-cnb-org-slug' \
  -e PLUGIN_GITHUB_TOKEN='ghp_xxxx' \
  -e PLUGIN_CNB_REPO_NAME='your-cnb-repo-name' \
  -e PLUGIN_MIGRATE_RELEASES='true' \
  -e PLUGIN_VISIBILITY='private' \
  docker.cnb.cool/dailybo/github2cnb:latest

注意:cnb_token 为必填参数,需包含 repo-contents:rrepo-code:rw 权限。对于公开仓库,github_token 可省略。


使用方法

.cnb.yml 流水线配置中使用:

main:
  push:
    - stages:
      - name: migrate-to-cnb
        image: docker.cnb.cool/your-org/github-to-cnb:latest
        settings:
          github_repo: owner/repo
          cnb_slug: your-cnb-org-slug
          # cnb_token: cnb_xxxx           # 可选,跨组织操作时需提供
          # github_token: ghp_xxxx        # 可选,私有仓库必填
          # cnb_repo_name: custom-name  # 可选,默认使用 GitHub 仓库名
          # migrate_releases: true      # 可选,默认 true
          # visibility: private         # 可选,默认 private

参数配置

参数类型必填默认值说明
github_repostring-GitHub 仓库地址,格式 owner/repo
cnb_slugstring-CNB 组织 slug
cnb_tokenstringDocker 必填流水线自动提供CNB 访问令牌,跨组织操作时需指定
github_tokenstring私有仓库必填-GitHub Personal Access Token
cnb_repo_namestringGitHub 仓库名CNB 仓库名称
migrate_releasesbooleantrue是否迁移 Release
visibilitystringprivate仓库可见性

github_repo

  • 类型: string
  • 必填: 是
  • 说明: GitHub 仓库地址,格式为 owner/repo

示例:

settings:
  github_repo: "octocat/hello-world"

cnb_slug

  • 类型: string
  • 必填: 是
  • 说明: CNB 组织 slug,用于指定仓库创建的目标组织。

示例:

settings:
  cnb_slug: "my-org"

cnb_token

  • 类型: string
  • 必填: Docker 运行时必填,流水线中自动提供
  • 默认值: 流水线自动提供的 CNB_TOKEN
  • 说明: CNB 访问令牌,需包含 repo-contents:rrepo-code:rw 权限。流水线中自动提供,无需手动指定;Docker 直接运行时必填;跨组织操作时需提供具有目标组织权限的 Token。

示例:

settings:
  cnb_token: "cnb_xxxxxxxxxxxx"

github_token

  • 类型: string
  • 必填: 否(私有仓库必填)
  • 默认值: 无
  • 说明: GitHub Personal Access Token。公开仓库可省略,私有仓库需提供,需有 repo 权限。

示例:

settings:
  github_token: "ghp_xxxxxxxxxxxx"

cnb_repo_name

  • 类型: string
  • 默认值: GitHub 仓库名
  • 必填: 否
  • 说明: CNB 仓库名称。不指定时默认使用 GitHub 仓库名。

示例:

settings:
  cnb_repo_name: "my-custom-repo"

migrate_releases

  • 类型: boolean
  • 默认值: true
  • 必填: 否
  • 说明: 是否迁移 GitHub Release 及其附件。支持增量迁移,已存在的 Release 自动跳过,缺失附件自动补传。同时同步 GitHub 的 Latest 和 Pre-release 标记到 CNB。

示例:

settings:
  migrate_releases: false

visibility

  • 类型: string
  • 默认值: private
  • 必填: 否
  • 说明: CNB 仓库可见性,可选值为 privatepublic。仅在创建新仓库时生效,已有仓库不会被修改。

示例:

settings:
  visibility: "public"

输出变量

迁移完成后,会输出以下流水线变量:

##[set-output github2cnb-repo-url=https://cnb.cool/my-org/my-repo]
##[set-output github2cnb-repo-slug=my-org/my-repo]

可在后续步骤中通过 @{github2cnb-repo-url}@{github2cnb-repo-slug} 引用。


完整示例

main:
  push:
    - stages:
      - name: migrate-to-cnb
        image: docker.cnb.cool/your-org/github-to-cnb:latest
        settings:
          github_repo: octocat/hello-world
          cnb_slug: my-org
          migrate_releases: true
          visibility: public
        exports:
          github2cnb-repo-url: GITHUB2CNB_REPO_URL
          github2cnb-repo-slug: GITHUB2CNB_REPO_SLUG
      - name: echo result
        script:
          - echo "GITHUB2CNB_REPO_URL $GITHUB2CNB_REPO_URL"
          - echo "GITHUB2CNB_REPO_SLUG $GITHUB2CNB_REPO_SLUG"

迁移流程

  1. 获取 GitHub 仓库信息(描述、许可证、Topics 等)
  2. 检查 CNB 仓库是否存在,不存在则自动创建
  3. git clone --bare + git push --mirror 镜像推送代码
  4. 更新 CNB 仓库信息(Topics、Homepage)
  5. 增量迁移 GitHub Release:获取 CNB 已有 Release 列表,已存在的 Release 跳过创建并补传缺失附件,新 Release 正常创建。同步 Latest 和 Pre-release 标记,最后一个非 Draft 非 Pre-release 的 Release 标记为最新

错误处理

遇到 API 错误或参数缺失时,插件会退出并返回非零状态码,导致流水线失败。


许可证

MIT License