当咱们利用github
来托管项目时,每次部署项目都要走一样的流程,敲击一样的命令行,尤为的咱们的node
项目更是没法忍受这种重复工做。html
那到底有没有一种能够解放咱们双手,当咱们提交代码后,服务器自动执行咱们已经制定好的命令行,答案是咱们能够利用Github
自有的Webhooks
。node
Webhooks
是来监测你在github
上的各类事件,咱们能够经过定制它来监测一个push
事件,每当咱们提交代码时Webhooks
会被触发,这是咱们能够经过配置一个HOST POST
请求到你所须要的地址。nginx
找到你在Github
上的项目地址上的Setting
的Webhooks
,以下图配置:git
shell命令
在项目根目录下新建deployed.sh
文件,输入你想在服务器上执行的命令行,如:github
cd /front/docs/ git pull origin master
在项目根目录下新建deployed.js
文件web
var http = require('http') var spawn = require('child_process').spawn var createHandler = require('github-webhook-handler') var handler = createHandler({ path: '/pushCode', secret: '12345678' }) http.createServer(function (req, res) { handler(req, res, function (err) { res.statusCode = 404; res.end('no such location') }) }).listen(3000) 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) rumCommand('sh', ['./deployed.sh'], function (txt) { console.log(txt) }) }) function rumCommand(cmd, args, callback) { var child = spawn(cmd, args) var response = '' child.stdout.on('data', function (buffer) { response += buffer.toString() }) child.stdout.on('end', function () { callback(response) }) }
执行脚本跑在了3000端口,咱们服务器对应启用到 3000 端口shell
upstream test { server 127.0.0.1:3000; } server { location /pushCode { proxy_pass http://test; proxy_redirect off; } }
首次部署到服务器时,仍然是须要咱们手动执行命令git pull
项目,当咱们在服务器上clone
下咱们的项目后,在本地尝试修改下代码,而后再次提交,可看到后台的日志json
再次查看Webhooks
服务器
表示已经自动触发了接口,项目自动化部署成功。ui
在服务器上执行node
命令后,当咱们离开服务器后,实际上程序进程关闭了,因此咱们利用pm2来管理咱们的node
进程。
在项目根目录下新建pm2.json
[{ "name": "test", "script": "deployed.js", "env_dev": { "NODE_ENV": "development" }, "env_production": { "NODE_ENV": "production" } }]
把全部的代码推送上服务器,进入服务器项目目录,执行
// 启动命令 pm2 start pm2.json // 查看是否启动 pm2 list // 查看日志 pm2 logs