我们经常使用GitHub、GitLab、Gitee 之类的仓库,有时候需要频繁的发布代码打包,人工发布,工作量有时候会很大,有时候还容易出错,所以会使用Jenkins一类的工具进行辅助,但是如果是一个简单的项目或者是个人项目使用Jenkins就显得太重了,可以直接使用webhook,比较方便。

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

Webhook有时也被称为反向API,因为他提供了API规则,你需要设计要使用的API。Webhook将向你的应用发起http请求,典型的是post请求,应用程序由请求驱动。

配置webhook

需要服务器配置项目公私钥, 确保服务器能过正常通过git pull项目 文档

1.配置私钥
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"  

# Generating public/private rsa key pair...
# 三次回车即可生成 ssh key
2.查看公私钥
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
3.添加公钥

4.测试
ssh -T git@gitee.com
Welcome to Gitee.com, yourname! # 返回,说明正常

配置服务器

  1. 确保服务器已经安装node, 使用node 创建自动部署的项目
    npm init

  2. 使用 yarn或者 npm 安装依赖库

npm install log4js --save #日志 npm i --save gitee-webhook-handler #gitee 依赖

  1. 创建脚本 app_gitee.js
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)
}

4.创建需要执行的脚本 deploy.sh

#! /bin/bash

SITE_PATH='/usr/local/www/smart-docs'
USER='root'
USERGROUP='root'

cd $SITE_PATH

git reset --hard origin/master
git clean -f
git pull
git checkout master
chown -R $USER:$USERGROUP $SITE_PATH
  1. 启动服务并测试

node app_gitee.js

使用pm2应用进程管理器

使用node 启动服务不是很方便,推荐使用pm2

npm install -g pm2 安装
pm2 start webhook.js 启动
pm2 kill 关闭
pm2 monit # 可以通过此命令查看服务的状态