CNB 简介

前阵子偶然在雨月空间站了解到腾讯出了一个云原生构建项目 CNB,一开始以为只是另一个国产的 gitee,但是深入体验后才发现它比半死不活的 gitee 高明得很多,非常接近 github。借用评论区的简要概括:云原生开发是 github codespace,云原生构建是 github actions,制品库是 github registry。

CNB 还是很大方地提供了免费额度,详情见云原生构建定价,实际云开发使用体验也非常不错。自从我换电信宽带后,基本无法直接向 github 推代码,既然如此,那我是不是也可以将我的博客自动化迁移到 CNB 上呢?

CNB 自动化部署hexo流程

必要步骤

1.注册一个 CNB 的账号,目前只支持使用微信登陆;

2.创建一个组织,实测非常见字符可以直接创建,但是短字符或常用字符需要域名验证。因为支持 .cool 域名验证,所以我创建了组织“hin”;

CNB组织创建

3.创建仓库,和 github 一样,你可以创建公开和私有仓库,此外,github 中的私钥等环境变量在 CNB 中得通过创建秘钥仓库来实现;

4.在这里创建访问令牌,以便拉取和推送代码,场景和权限范围还是非常细致的。特别提醒:记得保存生成的令牌!

创建令牌

创建 hexo 仓库

如果你要推送 hexo 博客到腾讯云 cos,那么你可以使用 hexo-cos-demo 这个模板;如果你要推送到自己的服务器,则可以使用 hexo-rsync-remote这个模板。这两个模板都自带云原生开发环境,可以一键上手。

起初考虑到我的 hexo 以及主题版本都太低,至少有两年没更新了,所以我选择了创建空白仓库,复制原 github 仓库文件和代码,参考案例编写环境。

强烈建议:创建私密仓库,以免配置文件中的一些密钥泄露!!!

仓库根目录创建.ide/Dockerfile文件,参考内容如下:

# 帮助文档地址: https://docs.cnb.cool/zh/vscode/quick-start.html
# .ide/Dockerfile,node 版本可自定义
FROM node:18

# 设置软件源
RUN npm config set registry https://mirrors.cloud.tencent.com/npm/

# 以及按需安装其他软件
# RUN apt-get update && apt-get install -y git

# 安装 code-server 和 vscode 常用插件
RUN curl -fsSL https://code-server.dev/install.sh | sh \
&& code-server --install-extension redhat.vscode-yaml \
&& code-server --install-extension dbaeumer.vscode-eslint \
&& code-server --install-extension eamodio.gitlens \
&& code-server --install-extension tencent-cloud.coding-copilot \
&& echo done

# 安装 ssh 服务,用于支持 VSCode 客户端通过 Remote-SSH 访问开发环境
RUN apt-get update && apt-get install -y wget unzip openssh-server

# 指定字符集支持命令行输入中文(根据需要选择字符集)
ENV LANG C.UTF-8
ENV LANGUAGE C.UTF-8

# 安装环境依赖,便于云原生开发可以调试
RUN npm install #安装仓库内 package.json 的依赖
RUN npm install -g hexo-server
RUN npm install -g hexo-cli

推送 hexo 到仓库

拉取和推送项目的操作和使用 github 一样,不再赘述。在第一次拉取私密仓库或者推送时,需要登陆,在登陆框填写此前创建的令牌即可。

我复制了此前 hexo 文件夹下的 sourcethemes 等文件夹,以及 _config.ymlpackage.json 等文件,然后 git push到仓库。

hexo仓库界面

点击右上角的橙色“云原生开发”,很快就会创建好环境,可以选择使用 WebIDE,也可以使用 VSCode 等 IDE 打开。为了方便,我就直接选择了网页版的 IDE。

cnbworkspace

打开网页版的 IDE 就可以在网页上使用 vscode 进行代码编写、拉取和推送等操作了。IDE 自带了腾讯的代码助手,但是我没使用过它。

cnbwebide

和 github codespace 一样,你可以直接在网页版 IDE 中使用 hexo s这样的命令来在线运行和调试。

此外,建议你使用子模块的方式引入 hexo 主题,以便于后续主题的更新和修改。和在 github 一样,在当前仓库创建 .gitmodules 文件即可,内容参考:

[submodule "themes/butterfly"]
path = themes/butterfly
url = https://github.com/yourname/hexo-theme.git
branch = master

创建密钥仓库

在网页 IDE 中测试没有问题后,即可开始下一步了。

新建仓库,类型选择密钥仓库,参考文档在仓库里创建一个env.yml文件,内容参考如下:

# 密钥仓库 env.yml
RSYNC_KEY: |
-----BEGIN OPENSSH PRIVATE KEY-----
b3BlbnNzaC1rABAAABlwAAAAdzc2gtcn
NhAAAAfdsghr/tUCVZVy4w5Clrs1Jgwq
-----END OPENSSH PRIVATE KEY-----
RSYNC_USER: root

# 声明指定镜像的插件任务能引用该配置文件
allow_images:
- tencentcom/rsync:latest
# 声明指定仓库的流水线能引用该配置文件
allow_slugs:
- hin/hexo

详细的参数说明参考官方的 rsync 文档。此外,一定要记得粘贴私钥内容有两个要点:

1.在 yml 中,多行内容要用|来表明;

2.由于 yml 对格式非常敏感,所以私钥的每一行都需要缩进两个空格而不是 Tab。

一开始我没注意到第二点,导致尝试推送静态文件到服务器时登陆失败,虽然构建日志中也提供满血版 deepseek 帮忙分析日志,但这也为我明明格式正确却无法连接到服务器埋下了另一个伏笔。

创建自动化工作流

在 hexo 仓库(不是密钥仓库)中创建一个名为 .cnb.yml的文件,它的作用和 .github/workflows/main.yml是一样的,写法上稍有不同,参考代码如下:

main:
push:
#声明构建环境:https://docs.cnb.cool/zh/
- docker:
image: node:18
#volumes缓存:https://docs.cnb.cool/zh/grammar/pipeline.html#volumes
volumes:
- /root/.npm:cow
stages: #安装依赖和 hexo
- name: npm install
script: npm install
- name: install hexo
script: npm install -g hexo-cli
- name: build
script: hexo generate
# https://cnb.cool/cnb/plugins/tencentcom/rsync
- name: rsync 上传到服务器
image: tencentcom/rsync
# 引用密钥仓库配置文件
# 导入环境变量:https://docs.cnb.cool/zh/env.html#dao-ru-huan-jing-bian-liang
imports: https://cnb.cool/yourgroup/env/-/blob/main/env.yml
settings:
user: $RSYNC_USER
key: $RSYNC_KEY
port: 22
hosts:
- 1.2.3.4
# 相对路径末尾带斜线表示同步文件夹里面的内容。
# 不带斜线表示通过这个目录
source: ./public/
target: /www/hexo
prescript:
- echo "prescript"
- ls /www/hexo
script:
- echo "after script"
- ls /www/hexo

到此我们要做的事已经基本完成。当这个文件创建之后,云原生构建便会自动开始。起初,我的每一次构建都在上传到服务器这一步失败了,原因是服务器拒绝了连接。后来查看服务器日志才发现,因为之前失败次数达到设定的值,IP 已经被 fail2ban 给拉黑了。

写在最后

其实这个过程我尝试并失败过很多次,比如 hexo s 的时候发现有标签报错呀,我一直很纳闷,明明主题里有这个标签。后来偶然发现,我的主题是以子模块的方式引入的,在 CNB 仓库里没有声明子模块,导致浪费了很多时间。

其实自从腾讯云的 webify 基本没什么存在感之后,我对 CNB 的期待也不会太高,不知道哪一天这个项目也会被腾讯给淡忘。但是就目前来说,拉取和推送代码快速,云端 IDE 方便,配置给得也很大方,后面试试用来编译 openwrt 的固件都是值得一试的,我们切用且珍惜吧。