在咱們本地開發好一個 NodeJS 項目,若是想要給別人看的話通常來講都是須要部署到服務器上面的。若是你使用 github 或者 coding 這裏代碼託管的服務,只須要在服務器安裝好環境且安裝好 git 以後,把項目 clone 下來而後使用 pm2 來啓動本身的 NodeJS 項目就好了。nginx
可是,若是我更新了代碼到了遠程倉庫去了,而服務器仍是之前的老代碼,你仍是須要登陸到服務器上面而且用 git 命令把最新的代碼拉下來,在重啓一次項目。長此以往,若是更改代碼頻繁的話,每次都是須要本身登陸到服務器上手動部署也不是一個好辦法。git
恰好咱們又用到了一些代碼託管的服務,且有 WebHook 這種好東西,怎麼不拿來用一用呢!github
在咱們肯定使用 WebHook 來實現自動部署後,咱們須要一個腳本去執行一些命令。在使用 Linux 的服務器下咱們可使用 shell 來寫這個自動部署腳本,這裏我把文件命名爲auto_build.sh
:web
#! /bin/bash git reset --hard origin/master git clean -f git pull origin master npm install npm run test npm run start
上面的 shell 腳本會運行咱們寫好的命令,這樣的話第一步編寫自動部署腳本就搞定了,若是對 shell 不熟悉的同窗能夠看看:Shell腳本編程30分鐘入門shell
若是要使用 WebHook 的話,咱們還須要在本身項目裏多啓動一個 http 服務專門用來處理接受請求,這裏假設咱們使用的是 Coding 來管理咱們的代碼,咱們可使用到coding-webhook-handler這個包。npm
首先安裝好coding-webhook-handler
:編程
npm i -S coding-webhook-handler
而後咱們新建一個 js 文件命名爲webhook.js
,代碼如上。這個就是使用到 coding-webhook-handler 這個模塊了,且爲它單獨啓動 http 服務,而後咱們就監聽若是有push
操做的話,就執行回調函數:bash
const http = require('http') const createHandler = require('coding-webhook-handler') const handler = createHandler({ path: '/', token: '' // 在 coding 上面能夠填寫一個 token }) http.createServer((req, res) => { handler(req, res, function(err) { 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(event) })
把最基礎的代碼寫好了,而後咱們須要運行咱們.sh
文件來實現自動部署。先寫一個可以運行命令的函數,函數也是寫在webhook.js
裏:服務器
... const rumCommand = (cmd, args, callback) => { const child = spawn(cmd, args) let response = '' child.stdout.on('data', buffer => response += buffer.toString()) child.stdout.on('end', () => callback(response)) } ...
接着修改handler.on('push', event => {...})
的回調函數:ssh
handler.on('push', event => { rumCommand('sh', ['./auto_build.sh'], txt => { console.log(txt) }) })
好了,咱們把webhook.js
的代碼都寫好,以後就須要用 nginx 把端口轉發出去。而後在 Coding 上面配置好 webhook 既可。
首先咱們須要進入到你的 coding 倉庫的頁面,而後咱們在左邊的側邊欄裏點擊設置進入項目設置頁面,你就能夠看到 WebHook 這個按鈕,而後在點擊去到設置 WebHook 的頁面。
接着咱們能夠在右面看到:
而後點擊新建 Hook 進入一個頁面:
url:就是訪問你webhook.js
啓動服務的域名。
token:非必要,若是使用了須要在createHandler
裏面也對應的填寫上。
而後下面你能夠選你須要監聽哪些事件,這裏咱們只是用來自動部署項目,就只監聽push
就好了。
確認設置好項目的 WebHook 以後,你最好也把部署公鑰也給設置了,省得到時候pull
代碼的時候須要輸入賬號密碼,而後用 ssh 的方式把倉庫 clone 到服務器上。而後啓動項目的服務和啓動 webhook.js 的服務。
若是你不想每次更新了代碼都要手動登陸服務器上去手動部署的話,並且也用到了一些代碼託管服務,你可使用 WebHook 來實現一個簡單的自動部署功能,這樣的話就剩下了不少手動部署的時間了。
上面演示的都是在 Coding 上的,若是你是使用 github 來管理的代碼的話,可使用github-webhook-handler,而後進去 github 項目的設置裏找到 Webhook 設置既可!
若是你還有更好的方案,不妨在留言告知我!!!