原文转载 - 简书 - https://www.jianshu.com/p/d0d601af3797
只是为了方便后期自己查找所以转载过来。可以直接点击查看原作者原文,如果有侵权请联系删除。
webhook的原理图

图片上演示是php代码。但是同理可以使用其他后端语言实现 java node均可
使用gitlab / github / gitee + node 纯前端实现自动化部署代码功能。
可以直接放置在服务器新建个目录,来用pm2运行。 也可以放置在项目根目录上。。 跟着项目一起走方便管理。
文件创建时注意文件格式。sh脚本文件是需要脚本格式文件类型。不建议在sh文件中书写注释。只是为了方便所以才加上。 有应用到项目中建议删除注释,要不然node运行有可能报错
//deploy.sh
#! /bin/bash
WEB_PATH=你的项目服务器路径
cd $WEB_PATH
git reset --hard master //需要pull代码的分支
git clean -f //清除一下服务器本地代码
git pull //开始pull代码
#git checkout master //可要可不要 没啥意义
#存一下日志。。但是无大意义。都是成功的日志
echo $(date) " --- git pull success " >> ./deploy.log
//deploy.js
"use strict";
const http = require('http');
const url = require('url');
const webhook = require('./webhook');
const path = '/webhook';
function resText(res, args) {
res.writeHead(args.stateCode, {'Content-Type': 'text/plain; charset=utf-8'});
res.end(args.msg);
}
http.createServer(function(req, res) {
if(path !== url.parse(req.url, true).pathname) {
resText(res, {
stateCode: 404,
msg: '404 Not found.'
});
return;
}
let post = '';
let headers = req.headers;
req.on('data', function(chunk) {
post += chunk;
});
req.on('end', function(){
try{
post = JSON.parse(post);
} catch(e) {
resText(res, {
stateCode: 400,
msg: 'Bad request.'
});
return;
}
webhook({headers, post}, function(result){
if(!result) {
resText(res, {
stateCode: 400,
msg: 'Bad request.'
});
return;
}
});
res.end('done');
});
}).listen(7777);
//webhook.js
'use strict';
const exec = require('child_process').exec;
const cmd = './deploy.sh';
const token = 'webhook Secret Token';
function webhook(args, callback) {
let header = args.headers;
let body = args.post;
let allowEvent = {
push: true,
merge_request: true
}
if(!header['x-gitlab-event'] || header['x-gitlab-token'] !== token) {
console.error('wrong x-gitlab-event OR x-gitlab-token');
callback(null);
return;
}
if(!allowEvent[body['object_kind']]) {
callback(null);
return;
}
if(
body['object_kind'] === 'push' &&
body.ref.split('/').pop() !== 'master'
) {
callback(null);
return;
}
if(
body['object_kind'] === 'merge_request' &&
body['object_attributes']['state'] !== 'merged'
) {
console.error(
'merge_request state: ',
body['object_attributes']['state']
)
callback(null);
return;
}
exec(cmd, function(err, stdout, stderr) {
if(err) {
console.error(err);
callback(null);
return;
}
console.log('stdout----->', stdout);
console.log('stderr----->', stderr);
});
}
module.exports = webhook;