利用github提供的Webhooks实现自动化部署

本文主要介绍利用 github 提供的 Webhooks 实现自动化部署

配置 git SSH 公钥和私钥

可参考:git配置SSH,配置成功之后,服务就能拉取 github 的代码了

配置 Webhooks

新建项目=>Settings=>Webhooks
配置项如下:

1
2
3
4
5
Payload URL // hook 触发的接口地址
Content type // request 类型(这里以 application/json 为例)
Secret // 加密的秘钥
Which events would you like to trigger this webhook // 想要触发的时间,默认选择第一个(push 事件)
Active // 是否提供详细信息

创建自动化部署 Shell 脚本(也可以是其他脚本或手段,这里以 Shell 为例)

1
2
3
4
5
#!/bin/bash
cd /opt/...
git pull
...
启动命令

编写调用自动化部署 Shell 的接口

这里以 node 服务 koa2 为例,也可以是其他语言服务

将创建 Webhooks 时填写的 Secret 存出在服务器环境变量中(这里以 contos7 为例)
临时生效:

1
2
3
export SECRET_TOKEN=创建 Webhooks 时填写的 Secret

echo $SECRET_TOKEN // 验证是否成功

永久生效:

1
2
3
4
5
6
7
8
9
10
11
12
vim /etc/profile

在最后,添加:

SECRET_TOKEN=创建 Webhooks 时填写的 Secret
export SECRET_TOKEN

保存,退出

source /etc/profile

echo $SECRET_TOKEN // 验证是否成功

创建 koa2 项目并编写调用自动化部署 Shell 的接口
创建 koa2 项目,对项目进行常规配置(此处省略 500 字,这里不属于本文重点介绍的内容,有兴趣请自行 Google)

关键代码性代码:

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
const router = require("koa-router")();
const childProcess = require("child_process"); // 创建子进程
const crypto = require("crypto"); // 加密解密工具

router.post("/url", function (ctx, next) {
// 这里的/url 必须与配置 Webhooks 时填写的接口路径相同
const hubSignatureKV = ctx.header["x-hub-signature"];
if (hubSignatureKV) {
// 获取 github 签名
const hubSignature = hubSignatureKV.slice(5);
// 获取系统环境变量 SECRET_TOKEN
const secret = process.env.SECRET_TOKEN;
// 创建一个 hmac 对象(必须是 sha1 算法,secret 作为加密秘钥)
const hmac = crypto.createHmac("sha1", secret);
// 往 hmac 对象中添加摘要内容(必须是请求主体,因为 Content type 配置为 application/json,所有此处需要转为 json 字符串)
const up = hmac.update(JSON.stringify(ctx.request.body));
// 使用 digest 方法生成加密内容(必须是 hex 格式)
const signature = up.digest("hex");
if (hubSignature === signature) {
// 相同则验证成功
childProcess.exec("/opt/shell/hexo.sh", function (err) {
// 利用子进程执行系统命令
console.log(err); //当成功是 error 是 null
});
ctx.body = "执行成功";
} else {
ctx.body = "服务器已积极拒绝你的请求";
}
} else {
ctx.body = "服务器已积极拒绝你的请求";
}
});

module.exports = router;

部署接口服务并验证

将服务部署到服务器(这里案例为 node 服务,推荐使用 pm2 守护进程部署)
部署成功之后推送代码验证即可