1. 程式人生 > >記一次 GitLab Webhooks 部署

記一次 GitLab Webhooks 部署

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 檢視。