給你的項目增加Webhooks,自動進行部署(包含Github/Gitlab)
前言
Github或者Gitlab的Webhooks,允許用戶訂閱特定的事件,如commit, push,兩者不盡相同,但本質差不太多。Github的可以參看github webhooks,Gitlab可以參看gitlab webhooks。
本文後續都以Github為例進行講解,Gitlab相關可以參考相關內容。
自動部署腳本
Webhooks的作用就是在特定的事件執行的時候觸發自定義的動作。本質上,Github的Webhooks觸發後,會給相應的URL(自行設置,後面會講解)發送POST請求,請求頭中含有event等相應的信息。
而正確響應後的事件,比如push完之後,觸發自動部署腳本,現在我們來寫一個簡單的腳本。
#!/bin/bashnPROJECT_DIR = path-to-your-projectnnecho startncd $PROJECT_DIRnnecho pull codengit reset --hard origin/master && git clean -fngit pull && git checkout masternnecho run npm scriptnnpm run buildnnecho finishedn
腳本大概的作用就是cd到項目目錄,拉取最新的代碼,build代碼(該步驟不一定需要,如果你的代碼直接可以上測試/生產環境)。你必須保證,腳本中涉及的環境變數是可用的,比如git,npm等等。
我們把這個腳本命名為deploy.sh,暫時放在一邊,等需要的時候再用。
設置Webhooks
在你的項目中,通過Settings -> Webhooks -> Add webhook進入webhook設置頁面。我們以下都以push事件為例。
Payload URL就是push之後,請求的url,我們這是https://example.com/app。
Content type目前有兩種,根據server提供的來寫,我們選擇json格式的,因為後面的server使用的是json的。
Secret就是密碼了,後面校驗的時候需要用到。
events就是觸發的事件列表,我們選push就行了,可以選擇全部事件(第二個選項),也可以根據需要選擇(第三個選項)。個人建議最好是根據需要去選擇,不然會發送很多無謂的請求,加重伺服器的壓力。
然後就是處理請求的邏輯了,目前Github上有很多處理的handler。對於前端,當然是node的最熟悉,可以採用github-webhook-handler,但是這個單個webhook處理比較方便,多個會比較麻煩,所以這裡採用的就是我自己擼的一個支持多個webhooks的node-github-webhook。
安裝
npm install node-github-webhook --saven
入口文件app.js
var http = require(http)nvar createHandler = require(node-github-webhook)nvar handler = createHandler({ path: /app, secret: appsecret }) // single handlernnfunction execFunc(content) {n var exec = require(child_process).execn exec(content, function(error, stdout, stderr) {n if (error) {n console.error(exec error: + error)n returnn }n console.log(stdout: + stdout)n console.log(stderr: + stderr)n })n}nnhttp.createServer(function (req, res) {n handler(req, res, function (err) {n res.statusCode = 404n res.end(no such location)n })n}).listen(7777)nnhandler.on(error, function (err) {n console.error(Error:, err.message)n})nnhandler.on(push, function (event) {n console.log(n Received a push event for %s to %s,n event.payload.repository.name,n event.payload.refn )n execFunc(sh ./deploy.sh)n})n
path就是前面Payload URL的內容,切記,是不包含host的,secret就是自己設置的密碼。
這裡為了方便,寫的是單個webhook的設置,如果你有多個項目,設置請參考這個。
守護程序
理論上,現在就可以運行了。
node app.jsn
但是,現在的node-github-webhook遇到錯誤是直接拋錯的,會終止程序的進行,所以最好採用守護進程去運行,如pm2,forever,我這採用了pm2。
pm2 start app.jsn
反向代理
現在程序是在7777埠跑的,需要Ngnix反向代理到80埠。這裡就不展開了。如果不想做,可以直接把Payload URL設置成https://example.com:7777/app,就是看起來不夠優雅。
結果
一般來說,如果成功了的話,你的代碼就已經自動拉取並部署了。如果你需要看具體的請求內容和返回結果,可以在Webhooks里的Recent Deliveries查看每次請求的內容。
推薦閱讀:
※如何看待從Django 2.0開始不再提供對Python2的支持?
※如何看待 python 的性能?
※chrome控制台確認發送一個ajax請求,但伺服器卻收到三個請求?
※get和post区别?
※學習ASP.NET WEB開發需要學習那些知識?