在前面的 Github Actions 工作流中,我们最后都是直接使用 SSH 连接在服务器上执行命令,但是这样很不优雅,而且会被认为是服务器被异常登录

所以可以尝试使用 webhook

简单地说,就是先在服务器准备一个部署脚本,然后一直运行一个守护进程监听请求,触发 GitHub Actions 时发送请求,守护进程被收到后自动执行部署脚本

准备部署脚本

准备 redeploy.sh

1
2
3
4
5
6
7
8
#!/bin/bash

sudo docker login --username=***** registry.cn-hangzhou.aliyuncs.com --password "******"

sudo docker-compose pull

sudo docker-compose up -d

这个很容易理解,在写完之后记得测试一下能不能成功运行

编写 webhook

这里为了方便,就直接使用一个库:https://github.com/adnanh/webhook

这东西看文档直接 apt 就能安装了

1
sudo apt install webhook

使用方法就是编写配置文件,然后运行时带上配置文件,就能根据规则监听请求

新建一个 webhook.json

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
[
{
"id": "webhook",
"execute-command": "/home/admin/projects/github-actions-test/redeploy.sh",
"command-working-directory": "/home/admin/projects/github-actions-test",
"trigger-rule":
{
"match":
{
"type": "value",
"value": "1234567",
"parameter":
{
"source": "url",
"name": "token"
}
}
}
}
]

简单地说就是规定了执行的脚本,还有触发条件:url 中有 token 参数并且值为 1234567 时就触发

这东西还有很多高级用法,比如传参数给脚本,具体可以看文档,这里就不演示了

先测试一下运行效果

1
webhook -hooks webhook.json -verbose

image-20230104190325333

然后手动请求一下

1
curl "http://www.nickxu.top:9000/hooks/webhook?token=1234567"

image-20230104190615260

看来成功执行了脚本

现在就用 screen 或者其他方法让这东西跑在后台就行

修改 GitHub Actions 脚本

接下来的过程就显而易见了,在 GitHub Actions 脚本中加上这个请求就行

1
2
3
- name: Webhook
run: |
curl --location --request GET '${{ secrets.WEBHOOK_URL }}'

image-20230104192204053