記一次 GitLab Webhooks 部署
阿新 • • 發佈:2018-12-21
Webhooks,可以讓你在 Git 倉庫中操作某些行為後觸發指定的行為,比如說在 git push 後由伺服器自動 git pull 拉取程式碼然後執行一些特定行為,比如 npm run build 自動打包專案讓生產/測試環境程式碼第一時間能夠自動更新到最新狀態。
過程也很簡單,選擇事件 -> 繫結介面。這樣在事件發生的時候 GitLab 會向指定介面傳送一個 POST 請求,然後就可以在接口裡做剩下的事情了。
下面是所支援的事件鉤子:
URL 就是介面地址,Secret Token 是用來在伺服器驗證介面的,比如如果你收到的請求中 Secret Token 的內容與你設定的內容不一致就不執行任何行為。
介面我是這麼寫的:
router.post('/build', async function ( ctx ) { try { WebHookServer.build( ctx.request.header, ctx.request.body ); ctx.body = 'success' } catch (err) { ctx.throw(400, err.toString()); } })
沒有等待打包過程完成直接返回 200,是因為如果專案打包時間如果過長會造成介面超時,我覺得也沒有必要。
build 函式:
const exec = require('child_process').exec; const build = function ( header, body ) { const token = 'lab build'; return new Promise((resolve, reject) => { if ( !header['x-gitlab-event'] || header['x-gitlab-token'] !== token ) { return reject('error'); } const filename = __dirname + '/build.sh'; exec(filename, function ( err, stdout, stderr ) { if (err) { console.log('執行指令碼出錯', err); return reject(err); } resolve('success'); }) }) }
簡單的驗證 Secret Token 以後執行指令碼。
指令碼的內容:
WEB_PATH=/home/... cd $WEB_PATH ./build.sh
WEB_PATH這個目錄路徑我就簡化了,執行介面所在目錄的指令碼,這個指令碼執行需要構建的專案所在目錄下的指令碼:
git pull npm run build rm -rf ../...... mv ./dist ../......
這就很容易理解了,拉程式碼,打包,刪除原來目錄,打包完的目錄移動到指定的目錄下。
流程上基本上就是這樣了。
來看一下這個 POST 請求的 Header 資訊:
"x-gitlab-event" 是觸發的鉤子名稱
"x-gitlab-token" 是所填寫的 Secret Token
至於 body 裡面有什麼可以到時候自行列印 log 檢視。