作為一個前端,買了騰訊雲伺服器後,一直想嘗試專案自動化打包部署,奈何jenkins體量太大,窮人買的低配伺服器還玩不起來,還有gitHub的webhooks,於是自己摸索用node.js結合webhooks跑通了自動部署的流程。
前期準備:一個伺服器(自己搭好node環境, 安裝好git), 一個託管在github、部署在伺服器上的前端專案。
- 在伺服器上建立一個服務(我用node.js),用於監聽gitHub的webhooks觸發的post請求,
請求所帶的資料大概如下:
由此可區分出觸發的事件(僅識別push觸發)和分支(僅對master分支做了識別並自動部署),之後執行部署指令碼。
服務程式碼deploy.js如下:
var http = require('http')
var createHandler = require('github-webhook-handler')
var handler = createHandler({ path: '/', secret: '1qazxsw2' })
// 上面的 path 即是github中填寫的url的path部分
// 上面的 secret 保持和 GitHub 後臺設定的一致
function run_cmd(cmd, args, callback) {
var spawn = require('child_process').spawn; var child = spawn(cmd, args);
var resp = "";
child.stdout.on('data', function(buffer) { resp += buffer.toString(); });
child.stdout.on('end', function() { callback (resp) });
}
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(7777)
// listen(7777)指監聽7777埠,可以根據實際情況改成你自己的
handler.on('error', function (err) {
console.error('Error:', err.message)
})// push事件觸發
handler.on('push', function (event) {
var name=event.payload.repository.name;
console.log('Received a push event for %s to %s', event.payload.repository.name, event.payload.ref);
// 判斷master分支變動時執行,可根據payload.ref區分分支
if (event.payload.ref === 'refs/heads/master') {
run_cmd('sh', ['./deploy.sh',name], function(text){ console.log(text) });
}
})
//這裡為了實現不同倉庫的自動部署,傳了倉庫名給shell指令碼
handler.on('issues', function (event) {
console.log('Received an issue event for % action=%s: #%d %s', event.payload.repository.name, event.payload.action, event.payload.issue.number, event.payload.issue.title)
})
複製程式碼
部署指令碼所做的工作:伺服器拉取並更新程式碼庫(伺服器要配置好git,生成公鑰,並在gihub專案上新增公鑰),打包生成dist,移動到對應的目錄替換髮版檔案。
部署指令碼程式碼deploy.sh如下
#!/bin/bash
WEB_NAME="$1"# 伺服器上的專案程式碼庫路徑
PROJECT_PATH="/root/project/${WEB_NAME}/"
# 專案釋出的地址,我用的nginx的靜態目錄DEPLOY_PATH="/usr/share/nginx/html/${WEB_NAME}/"
cd $PROJECT_PATH
MD5=`md5sum package.json | cut -d' ' -f1`
rm -rf dist
git pull
NEW_MD5=`md5sum package.json | cut -d' ' -f1`
# 利用前後package.json檔案MD5值是否變化來決定是否重新npm install
if [ $MD5 == $NEW_MD5 ]; then
echo '未檢測到依賴項改變'else
echo "change install"
npm installfi
npm run build
if [[ ! -d "dist" ]]; then
echo "build error" exit 1fi
rm -rf $DEPLOY_PATH*
cp -rf dist/* $DEPLOY_PATH
echo "build success $WEB_NAME"
複製程式碼
可以用pm2管理此服務,此外,我根據package.json檔案MD5值是否變化來選擇是否重新安裝依賴 npm install。
在github專案配置url和secert
測試,修改專案程式碼,提交、push。檢視是否觸發,gitHub皮膚會有觸發記錄,redeliver按鈕也可以方便除錯,不用每次都自己push觸發。
如此實現了前端自動部署專案的流程,但是實際生產中,還是jenkin等有介面的ci系統更為可靠。