原因
我們經(jīng)常使用GitHub、GitLab继薛、Gitee 之類的倉庫修壕,有時候需要頻繁的發(fā)布代碼打包,人工發(fā)布遏考,工作量有時候會很大慈鸠,有時候還容易出錯,所以會使用Jenkins一類的工具進行輔助灌具,但是如果是一個簡單的項目或者是個人項目使用Jenkins就顯得太重了林束,可以直接使用webhook,比較方便稽亏。
什么是webhook
準(zhǔn)確的說webhoo是一種web回調(diào)或者h(yuǎn)ttp的push API壶冒,是向APP或者其他應(yīng)用提供實時信息的一種方式。Webhook在數(shù)據(jù)產(chǎn)生時立即發(fā)送數(shù)據(jù)截歉,也就是你能實時收到數(shù)據(jù)胖腾。這一種不同于典型的API,需要用了實時性需要足夠快的輪詢。這無論是對生產(chǎn)還是對消費者都是高效的咸作,唯一的缺點是初始建立困難锨阿。
Webhook有時也被稱為反向API,因為他提供了API規(guī)則记罚,你需要設(shè)計要使用的API墅诡。Webhook將向你的應(yīng)用發(fā)起http請求,典型的是post請求桐智,應(yīng)用程序由請求驅(qū)動末早。
配置webhook
知道什么是webhook 后我們就要開始配置我們自己的項目了。
環(huán)境:
CentOS7
Gitee(網(wǎng)上GitHub的教程比較多说庭,這個基于碼云)
- 配置項目公私鑰
- 生產(chǎn)公鑰
ssh-keygen -t rsa -C "xxxxx@xxxxx.com"
# Generating public/private rsa key pair...
# 三次回車即可生成 ssh key
- 查看公鑰
cat ~/.ssh/id_rsa.pub
# ssh-rsa AAAAB3NzaC1yc2EAAAADAQABAAABAQC6eNtGpNGwstc....
-
添加公鑰
image-2018-153940@2x.png 測試
ssh -T git@gitee.com
Welcome to Gitee.com, yourname! # 返回然磷,說明正常
- 配置服務(wù)器node環(huán)境
- 安裝nvm,服務(wù)器上使用nvm 方便多版本node切換
curl -o- https://raw.githubusercontent.com/creationix/nvm/v0.33.8/install.sh | bash
vim /etc/profile
#加入下面的內(nèi)容
export NVM_DIR="$HOME/.nvm"
[ -s "$NVM_DIR/nvm.sh" ] && \. "$NVM_DIR/nvm.sh"
source /etc/profile
nvm install stable # 安裝穩(wěn)定版
nvm current # 查看當(dāng)前的版本
- 配置相關(guān)的腳本
安裝gitee-webhook-handler(GitHub,GitLab,gitee 的包是不同的刊驴,不能混用)
mkdir /opt/webhook #創(chuàng)建目錄
cd /opt/webhook
npm init # 初始化項目姿搜,方便以后遷移
npm install gitee-webhook-handler --save # 當(dāng)前的版本為v0.1.2
- 創(chuàng)建對應(yīng)的webhook服務(wù)
vim webhook.js
var http = require('http')
var createHandler = require('gitee-webhook-handler')
var handler = createHandler({ path: '/webhooks_push', secret: '123456' })# post 所需要用到的秘鑰
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) });
}
handler.on('error', function (err) {
console.error('Error:', err.message)
})
handler.on('Push Hook', function (event) { # 這個地方就是GitHub 和 Gitee 不一樣的地方,需要注意
console.log('Received a push event for %s to %s',
event.payload.repository.name,
event.payload.ref);
run_cmd('sh', ['./deploy.sh'], function(text){ console.log(text) });# 需要執(zhí)行的腳本位置
})
try {
http.createServer(function (req, res) {
handler(req, res, function (err) {
res.statusCode = 404
res.end('no such location')
})
}).listen(6666) # 服務(wù)監(jiān)聽的端口捆憎,可以自行修改
}catch(err){
console.error('Error:', err.message)
}
- 創(chuàng)建需要執(zhí)行的腳本
vim deploy.sh
git pull xxxxx # 根據(jù)自己的需要自行編寫
-
測試服務(wù)
WX20180225-163439@2x.png
顯示ok舅柜,說明成功
使用pm2應(yīng)用進程管理器
使用node 啟動服務(wù)不是很方便,推薦使用pm2
npm install -g pm2
pm2 start webhook.js
pm2 monit # 可以通過此命令查看服務(wù)的狀態(tài)
上圖顯示了一些應(yīng)用的基本信息躲惰,可以更好的觀察到服務(wù)的狀態(tài)
結(jié)束
配置完成后致份,只要pull代碼到倉庫,就會觸發(fā)webhook執(zhí)行腳本礁扮,十分的方便知举,同時減少了工作量,相對采用輪詢的方式消耗的資源更小太伊。