當咱們利用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