Github WebHook
利用Github WebHook
可以实现 push 提交自动构建,构建完成后自动发布到线上。
start.sh
#!/bin/bash
echo ""
#输出当前时间
date --date='0 days ago' "+%Y-%m-%d %H:%M:%S"
echo "Start"
#git项目路径 就是你服务器网站允许的地址
gitPath="/www/wwwroot/blog/soya.xy"
#git 网址
gitHttp="https://github.com/Soya-xy/soya.xy.git"
pmName="blog"
echo "Web站点路径:$gitPath"
#判断项目路径是否存在
if [ -d "$gitPath" ]; then
cd $gitPath
#判断是否存在git目录
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
sudo git clone $gitHttp gittemp
sudo mv gittemp/.git .
sudo rm -rf gittemp
fi
echo "拉取最新的项目文件"
# 这里是清理脚本创建导致修改,无法pull
sudo git restore .
# 清理后开始拉取最新的项目文件
sudo git pull
echo "拉取结束End"
echo "设置目录权限"
sudo chmod -R 777 ~/.pm2
sudo chown -R www:www $gitPath
#这里是自定义的配置,我这里有yarn和npm去安装包,然后直接删掉应用重启,如果是vue的话
sudo yarn build
#可以在PM2之前插入npm run build去打包后重启(反正都是自定义了自己看看)
echo "pm2 删除上个应用"
sudo pm2 delete $pmName
echo "pm2启动新应用"
sudo pm2 start .output/server/index.mjs --name $pmName
exit
else
echo "该项目路径不存在"
echo "新建项目目录"
mkdir $gitPath
cd $gitPath
#判断是否存在git目录
if [ ! -d ".git" ]; then
echo "在该目录下克隆 git"
sudo git clone $gitHttp gittemp
sudo mv gittemp/.git .
sudo rm -rf gittemp
fi
echo "拉取最新的项目文件"
sudo git reset --hard origin/master
sudo git pull
echo "设置目录权限"
sudo chown -R www:www $gitPath
echo "End"
exit
fi
deploy.js
const http = require('http')
const createHandler = require('github-webhook-handler')
const handler = createHandler({ path: '/webhook', secret: 'cs123123' })
function RunCmd(cmd, args, cb) {
const spawn = require('child_process').spawn
const child = spawn(cmd, args)
const result = ''
child.stdout.on('data', (data) => {
console.log(data.toString())
})
child.stdout.on('end', () => {
cb('Run Over')
})
}
http
.createServer((req, res) => {
handler(req, res, () => {
res.statusCode = 404
res.end('no such location')
})
})
.listen(7777)
handler.on('error', (err) => {
console.error('Error:', err.message)
})
handler.on('push', (event) => {
console.log(
'Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref,
)
const shpath = './blog-start.sh'
RunCmd('sh', [shpath], (result) => {
console.log(result)
})
})
handler.on('issues', (event) => {
console.log(
'Received an issue event for %s action=%s: #%d %s',
event.payload.repository.name,
event.payload.action,
event.payload.issue.number,
event.payload.issue.title,
)
})
Comments