git使用WebHook實現自動構建


說明

我們使用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

重啟就OKle


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM