CNB流水线代码自动同步至GitHub私有仓库_解决方案.md
前提条件
- CNB (cnb.cool) 私有仓库
- GitHub 账户和私有仓库
- Git 基础操作知识
架构原理
- 主仓库: CNB 私有仓库(开发、构建、部署)
- 镜像仓库: GitHub 私有仓库(只读备份)
- 同步机制: CNB流水线 + Docker容器 + Git强制推送
步骤一:创建GitHub接收仓库
- 登录GitHub,点击右上角
+→New repository - 输入仓库名称(如
my-project-backup) - 选择
Private(私有) - 创建仓库,保持为空
步骤二:获取GitHub访问令牌
- 进入
GitHub Settings→Developer settings - 选择
Personal access tokens→Tokens (classic) - 点击
Generate new token (classic) - 配置权限:
- Note: 填写备注(如
CNB Sync Token) - Expiration: 设置有效期(推荐90天)
- Repo: 勾选
repo(Full control of private repositories)
- Note: 填写备注(如
- 生成后立即复制
ghp_开头的令牌
⚠️ 令牌仅在生成时可见,关闭页面后无法再次查看
步骤三:在CNB配置密钥
项目密钥仓库存放
创建专用密钥仓库 my-secrets,存放 envs.yml:
yaml
# my-secrets/envs.yml
GITHUB_TOKEN: "ghp_xxxxxxxxxxxxxxxxxxxx"在流水线中通过 imports 引入。
步骤四:编写流水线配置
在CNB仓库根目录创建 .cnb.yml:
yaml
# .cnb.yml
main:
push:
# 多项目共用时取消注释
# - imports: https://cnb.cool/你的用户名/my-secrets/-/blob/main/envs.yml
stages:
# 代码同步到GitHub(备份优先)
- name: Sync to GitHub
image: alpine/git
# 单项目配置时取消注释
# imports:
# - secrets/GITHUB_TOKEN
script: |
# 检查令牌
if [ -z "$GITHUB_TOKEN" ]; then
echo "Error: GITHUB_TOKEN is missing";
exit 1;
fi
# 配置Git身份
git config --global user.email "sync-bot@cnb.cool"
git config --global user.name "CNB Sync Bot"
# 添加GitHub远程仓库
git remote add github \
https://oauth2:$GITHUB_TOKEN@github.com/用户名/仓库名.git
# 强制推送(确保完全镜像)
git push --force github HEAD:main
# 正常构建流程(示例)
- name: Build Project
image: node:20
script: |
npm config set registry https://mirrors.cloud.tencent.com/npm/
npm install
npm run build技术要点解析
1. 为什么使用 --force?
- 镜像原则: GitHub作为CNB的"影子",需要完全一致
- 避免冲突: CI环境通常是浅克隆,
--force可忽略非快进式提交冲突
2. 安全性保障
- 令牌隐藏: 通过环境变量传递,日志不显示明文
- HTTPS传输: 数据全程加密传输
3. 性能优化
- 将同步任务放在流水线第一步
- Git同步通常只需几秒钟
验证方法
- 在CNB修改文件并提交
- 查看CNB流水线日志,确认
Sync to GitHub步骤成功 - 检查GitHub仓库:
- 代码已更新
- 提交记录与CNB一致
- 作者和时间戳完整保留
最佳实践
遵循单向原则:所有代码修改、合并请求均在CNB进行,GitHub仅作为只读备份,避免直接在GitHub修改代码。