Github webhook自动发布代码

平时本地写的一些代码,总是要手动扔到自己的服务器上感觉好麻烦。因为项目代码放在github,试一下用webhook自动发布。

git

服务器安装git

yum install git

生成sshkey,后面邮箱写github使用的邮箱

ssh -keygen -t res -C xxx@xxx.com

复制/root/.ssh目录下的id_rsa.pub公钥,到github新建SSH key

项目目录拉取代码

git clone git@github.com:username/project.git

nodejs执行shell拉取代码

自动发布部分,新建deploy.js 和 deploy.sh

const http = require('http');
const { spawn } = require('child_process');
const createHandler = require('github-webhook-handler');
const handler = createHandler({ path: '/', secret: 'secret' });

function runCommand(command, args, callback) {
  const child = spawn(command, args);
  let resp = '';

  child.stdout.on('data', (buffer) => {
    resp += buffer.toString();
  });

  child.stdout.on('end', () => {
    callback(resp);
  });
}

handler.on('error', (err) => {
  console.error('Error:', err.message);
});

handler.on('push', ({ payload }) => {
  console.log(
    'Received a push event for %s to %s',
    payload.repository.name,
    payload.ref
  );
  
  runCommand('sh', ['./deploy.sh', payload.repository.name], (text) => {
    console.log(text);
  });
});

http.createServer((req, res) => {
  handler(req, res, () => {
    res.statusCode = 404;
    res.end('no such location');
  });
}).listen(7777);

使用了nodejs的子进程,执行shell命令sh ./deploy.sh 'repository name'

  • 需要安装依赖 github-webhook-handler;
  • secret 和 github 中的设置保持一致
 #!/bin/bash
WEB_PATH='/root/xxx/'$1
WEB_USER='root'
WEB_USERGROUP='root'

echo "Start deployment"
cd $WEB_PATH
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
git checkout master
echo "changing permissions..."
chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATH
echo "Finished."

WEB_PATH写项目文件所在目录

$1是给shell脚本传递的第一个参数,就是payload.repository.name即项目名称
chown [-R] 账号名称:用户组名称 文件或目录 更改文件拥有者

运行deploy.js

pm2 start deploy.js

服务监听的7777端口,之后在nginx中设置代理到了80端口

webhook

然后到github项目设置中新增webhook,url写的上面nginx反向代理用的域名,secret和deploy.js中的一致。设置完push代码的时候就会向url发送post请求,执行shell来pull代码

参考:
Webhooks | GitHub Developer Guide
使用 GitHub / GitLab 的 Webhooks 进行网站自动化部署 – 尘埃落定

Comments
Write a Comment