前言
抱歉!你以为我要说的是github! 其实我要说的是码云!
不过关系不大,在下的梯子掉了,访问github实在慢的要死,标题写码云我怕大家不认识。一句话解释,码云就是中国的github,速度比较快!
这个教程的编写主要是目前关于webhook的node版本的视频教程和文字教程都没有,而学会这个技能还是能大大提高效率的。做法是我自己瞎搞的做法,可能不是很符合规范,但是自己的项目使用起来还是很爽的,值得收藏。
原理
原先我们编写一个项目的时候,可能是在本地进行开发,然后上传到github中。接着进入服务器中,使用git pull origin 拉取下来。最后重新启动服务。
有的时候进行一次更新操作是很费时间的。你可能为了要登录服务器,进入目录,拉取代码,有时候还要处理冲突,最后重新启动项目。快的话十几分钟,慢的话搞着搞着1个小时过去了。
实际操作中,登录服务器然后在服务器上的操作是比较费时的,如果可以让我们提交了代码之后让服务器自己拉取代码并重新启动的话,就可以省不少时间。
git系的远程仓库都有webhook功能,意思是可以让你提交代码之后顺带执行一条请求。利用这一点我们可以在服务器中额外开启一个服务用于自动部署。
流程如下:
- 本地更新代码并push到仓库
- 仓库接受到push请求并执行webhook请求,请求服务器中的自动化部署服务。
- 自动化部署服务接受到请求,在服务器端向仓库发送pull请求并部署。
演示
首先创建一个正在编写的程序,我们还是以egg的helloworld为例。
npm init egg --type=simple
在码云中创建仓库并上传这个代码上去
项目地址: https://gitee.com/Zeeephr/auto-coding
然后在服务器中拉取下来。
这个作为你正在编写的项目。
实现一个自动化部署服务项目
脚本
#autoBuild.sh
npm run stop
git reset --hard origin/master
git clean -f
git pull
npm run start
web服务
var http = require('http')
var spawn = require('child_process').spawn
// 脚本地址
const script = '/xxx/xxx.sh';
// 执行指令的地址
const currentPath = '/xxx/xxx';
const password = 'xxx';
http.createServer(function (req, res) {
if(req.headers['x-gitee-token'] === password) {
console.log('密码正确 开始拉取代码');
rumCommand('sh', [script], function( txt ) {
console.log(`在${currentPath}目录下执行了脚本${script}`);
console.log(txt);
});
res.statusCode = 200;
res.end('success');
} else {
res.statusCode = 200;
res.end('???');
}
}).listen(8889);
console.log('listen to 127.0.0.1:8889')
function rumCommand( cmd, args, callback ) {
var child = spawn( cmd, args, {
cwd: currentPath,
} )
var response = ''
child.stdout.on('data', function( buffer ){ response += buffer.toString(); })
child.stdout.on('end', function(){ callback( response ) })
}
这里我只做了最简单的实现,这个服务监听8889服务,假设密码为xxx。
- 需要注意的是代码中的脚本位置设置为上面脚本的位置
- currentPath 设置为auto-coding的项目部署的位置,这样才会在改位置执行git pull。这点其他的教程没怎么提及。
代码也上传到码云了: https://gitee.com/Zeeephr/auto-helper
将脚本和部署服务同样部署到服务器中,使用pm2 start app.js将服务常驻内存。
设置webhook
回到auto-coding项目,添加webhook操作。
设置指向的地址和密码
测试连通性。
其中success就是上面服务中返回的
res.statusCode = 200;
res.end('success');
测试整体流程
在本地中修改auto-coding项目代码
至此我们就实现了自动部署。
后记
这里的auto-coding是一个公开项目,所以git pull的时候不需要密码,如果是私有项目的时候是需要密码的,没有提供密码的时候服务是无效的。可以在服务器中进行设置记录一下密码,具体搜索“linux 设置github 免密码”。这里不再赘述。