使用 Coding 持续集成自动化部署 Hexo

Coding 在卖给腾讯之后又表面上独立了,不再集成在腾讯云里面,改版之后开始使用 e.coding.net 域名,从单纯的 git 服务变成了项目管理,默认是以团队形式做项目管理,一个人也是创建团队之后再用,5 人一下团队免费。团队下面可以创建多个项目,每个项目可以有多个 git 仓库。新增功能包括:持续集成、文档管理、项目管理(待办等)、测试管理(用例、评审等)、项目统计等。

Coding Pages 服务免费了,需要实名认证(身份证号码和手机号即可),不过因为某些原因,服务器在国外,速度还可以,支持自定义域名、https 和 h2,折腾一天之后成功实现 push 之后自动编译 hexo 并部署到 Coding Pages,不用腾讯的小鸡部署了。

主要说一下 Jenkins 配置和自动部署:

Jenkins

以前也没用过 Jenkins ,coding 自带了图像化编辑功能,自动把 Jenkinsfile 图形化,互相编辑都可以

构建过程

Jenkinsfile 如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
pipeline {
agent any
stages {
stage('检出') {
steps {
checkout([
$class: 'GitSCM', branches: [[name: env.GIT_BUILD_REF]],
userRemoteConfigs: [[
url: env.GIT_REPO_URL,
credentialsId: env.CREDENTIALS_ID
]]
])
sh 'git submodule init'
sh 'git submodule update'
}
}
stage('构建') {
steps {
echo '构建中...'
sh '''pwd
node -v
npm install -g hexo-cli
npm install'''
npmAuditInDir(directory: '/', collectResult: true)
sh '''pwd
hexo clean
hexo generate'''
echo '构建完成.'
}
}
stage('测试') {
steps {
sh '''ls -lh public/
if [ ! -s public/index.html ]
then
exit 1
fi'''
}
}
stage('部署') {
steps {
echo '部署中...'
sh '''npm install https://github.com/zhangnew/hexo-deployer-git.git --save
hexo d'''
echo '部署完成'
}
}
}
}

检出部分

增加了 git submodule init git submodule update 是因为我的主题使用了来自 github 的 submodule,最开始 hexo generate 虽然编译成功,但是 html 文件都是空的,因为没有下载主题。

构建部分没什么可说的,略过。

测试部分是因为前面没有下载主题才加上的,就是判断一下生成的文件是否为空。

部署部分

这里有个大坑,搞了一晚上,一般情况下我们是使用 hexo-deployer-git 这个插件来把编译好的文件上传到 git 指定的 branch,既然涉及到 push,就有权限的问题,这个插件支持通过用户名密码、ssh 私钥、github token 的方式认证。

首先我们不能在 Jenkins 中输入用户名密码,也不能把私钥上传,只能通过 token,github token 很简单,直接用就可以了,但是 Coding 的 token 是带有用户名的,间接相当于使用用户名密码上传,所以直接使用这个插件是不行的。

所以我就把代码改了一下,参数增加 token_name,详见这个 commit ,也向原项目提交 pr 了, 还没 merge 。

所以最后是用了 npm install https://github.com/zhangnew/hexo-deployer-git.git --save 来安装我修改过的插件。使用方式如下:

1
2
3
4
5
6
7
8
9
10
deploy:
type: git
repo:
coding:
url: https://e.coding.net/xxx/xxx.git
branch: coding-pages
token_name: xxx # for e.coding.net
token: '$CODING_TOKEN' # 这里不要改,把 CODING_TOKEN 在 coding 里面设置好环境变量
name: zhangnew # git config user.name
email: xxx # git config user.email

获取 Token:项目设置 -> 开发者选项 -> 项目令牌, 权限勾选 pull 和 push 就够了。

hexo-deployer-git 文档写的不够详细,本身支持直接在 repo: 后面写 git url 的,但是这样写的话,插件就不会处理 Token 参数,所以建议都用我上面写的这种格式。

其他

不用缓存的话编译非常慢,上面说我的主题依赖 github 的代码库,在 coding 的 Jenkins 里面下载极慢,所以我建议设置缓存功能,勾选缓存项目目录npm;如果编译有问题可以重置缓存。

触发规则就是 push 到 master 就触发。

然后在 静态网站 (也就是 Pages 服务)里面选 push 到 coding-pages 触发。

如果在老版 coding 里面关联过自定义域名,在新版里面需要给域名添加一个 txt 记录来重新授权。