webhook是一种web回调或者http的push API,是向APP或者其他应用提供实时信息的一种方式。Webhook在数据产生时立即发送数据,也就是你能实时收到数据。这一种不同于典型的API,需要用了实时性需要足够快的轮询。这无论是对生产还是对消费者都是高效的,唯一的缺点是初始建立困难。

原因

在使用gitee时需要频繁打包上传服务器,所以需要利用gitee的webhook来进行自动部署。

步骤

  1. 获取公钥
1
2
3
4
5
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"  

# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key

  1. 查看公钥
1
2
cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
  1. 添加公钥
  1. 测试
1
2
ssh -T git@gitee.com
Welcome to Gitee.com, yourname! # 返回,说明正常
  1. 配置脚本

mkdir /opt/webhook #创建目录
cd /opt/webhook
npm init # 初始化项目,方便以后迁移
npm install gitee-webhook-handler –save # 当前的版本为v0.1.2

  1. 创建脚本
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
vim webhook.js

var http = require('http')
var createHandler = require('gitee-webhook-handler')
var handler = createHandler({ path: '/webhooks_push', secret: '123456' })# post 所需要用到的秘钥

function run_cmd(cmd, args, callback) {
var spawn = require('child_process').spawn;
var child = spawn(cmd, args);
var resp = "";
child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
child.stdout.on('end', function() { callback (resp) });
}
handler.on('error', function (err) {
console.error('Error:', err.message)
})
handler.on('Push Hook', function (event) { # 这个地方就是GitHub 和 Gitee 不一样的地方,需要注意
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
run_cmd('sh', ['./deploy.sh'], function(text){ console.log(text) });# 需要执行的脚本位置
})
try {
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(6666) # 服务监听的端口,可以自行修改
}catch(err){
console.error('Error:', err.message)
}
  1. 创建执行脚本

在此之前需要通过ssh来clone 相关文件。

1
2
3
rm -rf saoblog-shuiao
git clone git@gitee.com:tianqicha/saoblog-shuiao.git
cp -rf saoblog-shuiao/. ../../usr/local/lighthouse/softwares/nginx/html

当然可以自行调整自己的脚本!

  1. 测试

pm2进程管理

使用pm2应用进程管理器更为方便

1
2
3
npm install -g pm2
pm2 start webhook.js
pm2 monit # 可以通过此命令查看服务的状态

结束

如遇疑问可以在评论区留言哦,以上仅为个人练习的博客记录。