使用 WebHook 來自動部署 NodeJS 項目!

前言

在咱們本地開發好一個 NodeJS 項目,若是想要給別人看的話通常來講都是須要部署到服務器上面的。若是你使用 github 或者 coding 這裏代碼託管的服務,只須要在服務器安裝好環境且安裝好 git 以後,把項目 clone 下來而後使用 pm2 來啓動本身的 NodeJS 項目就好了。nginx

可是,若是我更新了代碼到了遠程倉庫去了,而服務器仍是之前的老代碼,你仍是須要登陸到服務器上面而且用 git 命令把最新的代碼拉下來,在重啓一次項目。長此以往,若是更改代碼頻繁的話,每次都是須要本身登陸到服務器上手動部署也不是一個好辦法。git

恰好咱們又用到了一些代碼託管的服務,且有 WebHook 這種好東西,怎麼不拿來用一用呢!github

編寫自動部署腳本

在咱們肯定使用 WebHook 來實現自動部署後,咱們須要一個腳本去執行一些命令。在使用 Linux 的服務器下咱們可使用 shell 來寫這個自動部署腳本,這裏我把文件命名爲auto_build.shweb

#! /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

若是要使用 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 設置:

首先咱們須要進入到你的 coding 倉庫的頁面,而後咱們在左邊的側邊欄裏點擊設置進入項目設置頁面,你就能夠看到 WebHook 這個按鈕,而後在點擊去到設置 WebHook 的頁面。

接着咱們能夠在右面看到:

而後點擊新建 Hook 進入一個頁面:

  • url:就是訪問你webhook.js啓動服務的域名。

  • token:非必要,若是使用了須要在createHandler裏面也對應的填寫上。

而後下面你能夠選你須要監聽哪些事件,這裏咱們只是用來自動部署項目,就只監聽push就好了。

確認設置好項目的 WebHook 以後,你最好也把部署公鑰也給設置了,省得到時候pull代碼的時候須要輸入賬號密碼,而後用 ssh 的方式把倉庫 clone 到服務器上。而後啓動項目的服務和啓動 webhook.js 的服務。

總結

若是你不想每次更新了代碼都要手動登陸服務器上去手動部署的話,並且也用到了一些代碼託管服務,你可使用 WebHook 來實現一個簡單的自動部署功能,這樣的話就剩下了不少手動部署的時間了。

上面演示的都是在 Coding 上的,若是你是使用 github 來管理的代碼的話,可使用github-webhook-handler,而後進去 github 項目的設置裏找到 Webhook 設置既可!

若是你還有更好的方案,不妨在留言告知我!!!

相關文章
相關標籤/搜索