前言
因为使用挂载blog源代码的虚拟机被我整坏了,还好是有备份的。不过还是需要整一个持续集成的blog流水线,
但是又不想使用原来Jenkins+Gitlab方式,觉得太笨重了,又调查了一番想着使用gogs+webhook,然后又是一阵百度谷歌之旅,还是没有找到想要的webhook,
于是决定自己写一个钩子,需求:能接受http请求,执行shell脚本,于是20行左右js代码就写完了。
webhook
使用nodejs编写hook.js非常简单
const http =require('http');
const url = require("url");
const querystring = require("querystring");
const exec = require('child_process').execSync;
const requestHandler = function (req, res) {
const arg = querystring.parse(url.parse(req.url).query);
if ( arg.secret !== '4YQcC6qy0MIiYjk') {
console.log('密钥不对',arg.secret);
res.statusCode = 500;
res.end('密钥不对 error...');
return
}
try {
// do something here,certification authorization etc
// passing parameters ,just like:exec('bash ~/blog-ci.sh'+' '+'sss') or use execFile()
exec('bash ~/blog-ci.sh');
res.end('ok');
}
catch (e) {
console.log('script exec error', e);
res.statusCode = 500;
res.end('server error...');
}
};
//create server
const web = http.createServer(requestHandler);
web.listen(34512, '0.0.0.0');
console.log('http running on http://0.0.0.0:xxx');
func main() {
router := gin.Default()
// github webhook method is post
router.POST("/xxx", webhook)
_ = router.Run(":1231")
}
type Resp struct {
Msg string `json:"msg"`
Data string `json:"data"`
Code int `json:"code"`
}
const SECRET = "xxxx"
const HOST = "xxx.xx:1231"
func webhook(context *gin.Context) {
host := context.Request.Host
if host != HOST {
context.JSON(400, Resp{"fail", "host not right", 400})
return
}
secret := context.Query("xxx")
if secret != SECRET {
context.JSON(400, Resp{"fail", "badrequest", 400})
return
}
cmd := exec.Command("/bin/bash", "-c", "./blog-ci.sh")
if out, err := cmd.Output(); err != nil {
log.Println(out, err)
context.JSON(500, Resp{"fail", "server error", 500})
return
}
context.JSON(200, Resp{"ok", "success", 200})
}
使用PM2管理
PM2是node进程管理工具,可以利用它来简化很多node应用管理的繁琐任务,如性能监控、自动重启、负载均衡等,而且使用非常简单.
全局安装,简直不能更简单npm install -g pm2
,安装完毕后自动创建目录
- $HOME/.pm2 will contain all PM2 related files
- $HOME/.pm2/logs will contain all applications logs
- $HOME/.pm2/pids will contain all applications pids
- $HOME/.pm2/pm2.log PM2 logs
- $HOME/.pm2/pm2.pid PM2 pid
- $HOME/.pm2/rpc.sock Socket file for remote commands
- $HOME/.pm2/pub.sock Socket file for publishable events
- $HOME/.pm2/conf.js PM2 Configuration
启动webhook:pm2 start app.js --watch
,可通过pm2 save && pm2 startup
开启开机自启服务
查看我们的hook.js,使用pm2 list
这么短的代码使用45MB的内存,还是有点出乎意料的,不过已经满足了我需求,可以通过访问ip+port?secret=xxx的形式执行脚本了
本博客所有文章除特别声明外,均采用: 署名-非商业性使用-禁止演绎 4.0 国际协议,转载请保留原文链接及作者。