通过webHooks 实现热部署
本文于930天之前发表,文中内容可能已经过时。
原理
- 配置好github上的webhooks后,每次在本地执行git push到github上的时候,github会自动发送一个post请求到服务器,
- 服务器上接收到这个信号,执行写好的shell脚本,shell脚本的内容第一步cd到目标目录,然后执行git pull / npm install等操作
- 因为要在服务器上执行一系列git命令,所以需要在服务器上事先生成密钥,将公钥放到github上
具体步骤
配置webHook
- 在github上新建一个仓库,选择setting –> 选择webhooks –> add webhook –> 配置好github上的webhooks
接收github的请求(写在服务器端, 需要安装github-webhook-handler模块)
第一步:编写监听端口,监听后执行第二步中的shell
12345678910111213141516171819202122232425262728293031var http = require('http')var createHandler = require('github-webhook-handler')// secret 保持和 GitHub 后台设置的一致var handler = createHandler({ path: '/', secret: 'wechat' })function run_cmd(cmd, args, callback) {var spawn = require('child_process').spawn;var child = spawn(cmd, args);var resp = "";child.stdout.on('data', function(buffer) { resp += buffer.toString(); });child.stdout.on('end', function() { callback (resp) });}http.createServer(function (req, res) {handler(req, res, function (err) {res.statusCode = 404res.end('no such location')})}).listen(7777)handler.on('error', function (err) {console.error('Error:', err.message)})handler.on('push', function (event) {console.log('Received a push event for %s to %s',event.payload.repository.name,event.payload.ref);run_cmd('sh', ['./deploy.sh',event.payload.repository.name], function(text){ console.log(text) });})第二步:在同级目录下编写shell脚本,命名为deploy.sh
123456789101112131415161718WEB_PATH='/root/zyj/'$1 //你要pull到服务器的的地址 $1 就是你github的仓库名称WEB_USER='root'WEB_USERGROUP='root'echo "Start deployment"echo $1cd $WEB_PATHecho "pulling source code..."git reset --hard origin/mastergit clean -fgit pull origin masternpm installgit checkout masterecho "changing permissions..."chown -R $WEB_USER:$WEB_USERGROUP $WEB_PATHecho "Finished."
在服务器上生成密钥,并在相应pull目录和github仓库建立联系
服务器上安装git
1yum install git生成git密钥
1ssh-keygen -t raa -C ‘邮箱地址’ -f ~/.ssh/id_rsa将公钥放在github上
12// 找到.pub文件cd ~/.ssh测试ssh
12// 出现Permission denied(publickey)执行下一步ssh -T git@second.github.com
|
|
- 到相应目录下关联github,保证在该目录下能够git pull成功123cd /root/zyj/demogit initgit remote add origin gitcom:账号/仓库名.git.
最后执行node
|
|