使用webhook同步代码

本地开发代码发布线上是先提交git,然后人为触发让服务器pull代码。最近使用的一个项目没有本地测试环境,想着有没有办法在测试机器上自动同步一下git服务器的代码

基本想法就是push的时候在服务器那边执行以下git pull

node的实现,感觉大概是这样:

const express = require('express');
const app = express();
const process = require('child_process');
const bodyParser = require('body-parser');

app.use(bodyParser.urlencoded({extended: false}));
app.use(bodyParser.json());

app.post('/webhook', (req, res) => {
  // console.log(req.headers)
  // console.log(req.body)
  process.exec('cd /data/git-demo; git pull', (err, stdout, stderr) => {
    if (err) {
      console.log(err);
      return;
    }
    console.log(`stdout ${stdout}`);
    console.log(`stderr ${stderr}`);
  });
  res.send('ok');
});

app.listen(8066);

熟悉的pm2..

pm2 start hook.js --watch

然后在nginx的设置里加上8066端口设置

vim /usr/local/nginx/conf/nginx.conf
# ...
server {
      listen 80;
      server_name your.webhook.url;
      ......
      location /webhook {
          proxy_pass http://127.0.0.1:8066;
      }
   }      
# ....

重启下ngingx服务

/usr/local/nginx/sbin/nginx -s reload

在coding.net里项目设置中设置,这里监听的push操作,他们自己也有个说明文档

结束后ping以下ok了,然后在项目里push之后服务器上的就会自动执行pull

不过实际上是用的后端同学写的php(刚开始是因为运维同学说那个鸡子没法装node,不过后来还是装上去了)

<?php
$http = new swoole_http_server("0.0.0.0", 8066);
$http->on("request", function ($request, $response) {
        $git_basedir = '/data/web/';                                                                                                                                                                  
        if($request->rawContent()) {
                $info = json_decode($request->rawContent(), true);
                if($info['repository']['name']) {
                        $projectName = $info['repository']['name'];
                }
        }
        if(isset($projectName) && file_exists($git_basedir.$projectName)) {
                $gitDir = $git_basedir.$projectName;
                echo "\n".date("Y-m-d H:i:s")." $gitDir 更新 结果: \t".`cd $gitDir ; git pull 2>&1`;
        } else {
                echo $projectName;
                echo "\n".date("Y-m-d H:i:s")." 无效的请求";
        }
    $response->end("ok");
});
$http->start();

然后由于是内网机器,没有外网可以访问的地址,就在公网ip上做了转发(额具体操作不是很懂_(:зゝ∠)_)

附一些后端师傅放的shell命令

// 感觉上类似pm2开node服务..
nohup php xxx.php  
// 停止
jobs
fg [id]
// 然后control c 停了
// 或者
ps -ef | grep xxx
// 然后kill了它 _(:зゝ∠)_
// 不过后来说是用nginx什么做的开机启动 没有用nohup
Comments
Write a Comment