最近将网站迁移到服务器上面了,想着本地更改的时候,能够将 github.io 仓库和服务器端的 git 仓库同步进行更新,尝试用 webhook 来实现我的想法
添加 SSH key 到 GitHub 仓库
登录服务器终端,输入如下命令后一直回车,直到出现例如”ssh-rsa AAAA…”
1 | ssh-keygen -t rsa -b 4096 -C "your_email@example.com" |
查看公钥并复制
1 | cat ~/.ssh/id_rsa.pub |
打开 github.io 仓库 -> Settings -> Deploy keys -> Add deploy key
Title 字段填写自己能够辨识的名称
Key 字段粘贴刚复制的内容
然后点击”Add Key”
最后测试 SSH 连接,若成功会看到类似于 “Hi username! You’ve successfully authenticated…”这段信息
1 | ssh -T git@github.com |
在网站目录拉取 git
在网站目录下初始化git仓库,并拉取 github.io 仓库的内容
注:这里及后文演示的网站目录位置假设为/opt/apps/openresty/openresty/www/example.com/html
1 | git init |
安装 webhook 工具
在/home
中创建一个临时目录 tmp
1 | mkdir /home/tmp |
下载 webhook 的二进制文件压缩包
注:不同的操作系统的下载链接可能会不一致,详情查看https://github.com/adnanh/webhook/releases
1 | wget https://github.com/adnanh/webhook/releases/download/2.8.2/webhook-linux-amd64.tar.gz |
解压下载的文件
1 | tar -xzf webhook-linux-amd64.tar.gz |
进入解压后的目录
1 | cd webhook-2.8.2-linux-amd64 |
将 webhook 可执行文件移动到系统 PATH 中的目录 (/usr/local/bin)
1 | sudo mv webhook /usr/local/bin/ |
检查 webhook 是否安装成功并查看版本
1 | webhook -version |
清理临时目录和下载文件
1 | cd /home/tmp |
编写 deploy-server.sh 来拉取 github.io 仓库的文件
在适当的位置创建 deploy-server.sh 文件,这里选择的是/opt/webhook-ts
1 | mkdir /opt/webhook-ts |
编写 sh 文件,用于拉取 github.io 仓库的文件
1 |
|
给予脚本执行权限
1 | sudo chmod +x /opt/webhook-ts/deploy-server.sh |
编写 hook.js
使用 openssl 创建 Secret 并复制
1 | openssl rand -base64 32 |
然后打开 github.io 仓库 -> Settings -> Webhooks -> Add webhook
Payload URL 字段设置为 Webhook 接收端在互联网上的地址,这里我设置的是https://example.com/hooks/github-pull
Content type 字段选择 application/json
Secret 字段粘贴刚复制的 Secret
然后点击”Add webhook”即可
在适当的位置创建 hook.js 文件,这里选择的是/opt/apps/openresty/openresty/www/example.com
1 | cd /opt/apps/openresty/openresty/www/example.com |
编写 hook.js 文件
1 | [ |
使用 Systemd 管理 webhook 进程
创建 Systemd Service Unit 文件
1 | sudo vim /etc/systemd/system/webhook.service |
编写文件内容,记得删掉注释
1 | [Unit] |
重载 Systemd 配置并启动 webhook 服务
1 | sudo systemctl daemon-reload |
检查服务状态
1 | sudo systemctl status webhook.service |
设置开机自启动
1 | sudo systemctl enable webhook.service |
设置反向代理
1 | location = /hooks/github-pull { |
拒绝对网站 .git 的子文件和文件夹的访问
1 | location ~ /\.git { |
测试
进行 git push 的操作,然后打开 github.io 仓库 -> Settings -> Webhooks,再点击之前创建的 webhook,在 Recent Deliveries 查看 Response,出现如下图所示结果即代表测试成功