前言

因为使用挂载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
Pm2  list

这么短的代码使用45MB的内存,还是有点出乎意料的,不过已经满足了我需求,可以通过访问ip+port?secret=xxx的形式执行脚本了


本博客所有文章除特别声明外,均采用: 署名-非商业性使用-禁止演绎 4.0 国际协议,转载请保留原文链接及作者。

prometheus operator 接入钉钉 上一篇
专业名词记录 下一篇

 目录


买个卤蛋,吃根冰棒