git使用WebHook實現自動構建
阿新 • • 發佈:2019-08-20
說明
我們使用git進行版本管理常常會遇到這樣的一個需求,希望git push的時候伺服器上程式碼的程式碼也能自動更新,這次我使用了coding進行示範
一、編寫git pull 更新指令碼 auth_pull.sh
vim auth_pull.sh
#!/bin/sh
unset GIT_DIR
Path="{自己的專案跟目錄}"
cd $Path
git pull origin master
exit 0
對auth_pull.sh進行授權
chmod a+x auth_pull.sh
二、編寫auto_pull.js檔案
這裡為了方便只使用了nodejs,你也可以使用php python,原理都是一樣,githua、coding上都會有一個webhook的功能,如果git有push 或者其它事件發生就會向你設定webhook發起一個請求,這裡我簡單的拿了個coding的請求程式碼
請求頭:
Request URL: http://hook.chainhots.com/pushRequest
method: POST
User-Agent: Coding.net Hook
X-Coding-Event: push
X-Coding-Delivery: 7bf60799-a9ac-4ae1-b496-dd47b1bb5537
X-Coding-WebHook-Version: v2
X-Coding-Signature: sha1=ca375797efab8acea2f59db51ade3e99ef97c45f
請求內容
...
這裡就不多寫了,想知道可以自己去看看,吧請求的資料寫到日誌中就能看到了。
auto_pull.js :
var http = require('http'); var crypto = require('crypto') var exec = require('child_process').exec; // 在Webhook中設定的secret var secret = '' // 在Webhook中設定的Payload URL var url = '' http.createServer(function(request, response) { response.writeHead(200, {'Content-Type':'application/json'}); response.end(); if (request.headers['x-coding-event'] && request.headers['x-coding-event'] === 'push') { console.log('push'); request.on('data', function(chunk) { //這裡可以寫自己驗證邏輯 //var Signature = request.headers['x-coding-signature']; //console.log(chunk.toString()); chunk中儲存了payload的資料,如果需要可以拿出來做更精確的處理.比如部署觸發該次push的commit的程式碼 //if (verifySecret(Signature, sign(secret, chunk.toString())) && verifyUrl(url, request.url)) { console.log('verify'); runCommand(); //} else { // console.log('verify faild'); //} }); } }).listen(8083, '127.0.0.1'); // 對,服務監聽的是內網地址.用Nginx反代一下就好.(當然直接丟到外網也沒問題) function sign(secret, data) { return 'sha1=' + crypto.createHmac('sha1', secret).update(data).digest('hex'); } function verifySecret(data0, data1) { return (data0 == data1); } function verifyUrl(data0, data1) { return (data0 == data1); } function runCommand() { exec("./auto_pull.sh", function(err,stdout,stderr){ if(err) { console.log('error:'+stderr); } else { console.log("stdout:"+stdout); } }); }
執行node auto_pull.js
三、配置守護程序
這裡守護程序使用 Supervisor 來實現
centos 7 直接執行命令
yum install supervisor
一路回車下來就行,安裝完成之後啟動supervisor
systemctl start supervisord
設定開機自動啟動
systemctl enable supervisord
接寫來編寫auto_pull 的守護程序配置 ,切換到 cd /etc/supervisord.d目錄下,建立auto_pull.ini檔案
[program:auto_pull] #應用程式名稱
command=nohup node /home/githook/auto_pull.js > /home/githook/consloe.log 2>&1 & #配置後臺執行並講輸出日誌寫入到檔案中
directory=
user=root #執行使用者
stopsignal=INT
autostart=true #是否自動啟動
autorestart=true #是否自動重啟
startsecs=3 #重啟間隔時間
stderr_logfile=/var/log/autopull.err.log #執行錯誤日誌
stdout_logfile=/var/log/autopull.out.log #執行日誌
配置完成,執行
systemctl restart supervisord
重啟就