使用webhook實現代碼自動化部署

需求背景

本身搭建的博客,代碼託管到github,心想博客更新那麼頻繁,每次push代碼後都到服務器上手動部署,實在是太麻煩, 因而想到自動化部署,開始的時候只是想經過一個簡單的 shell +cron的方法來解決,可是這方法真的太笨了,一點都不 智能 。想到github的webhook,以前只是據說,明白其原理,並無實操,此次恰好能夠親自體驗一把了。具體以下:node

webhook簡介

webhook是一種web回調或者http的push API,是向APP或者其餘應用提供實時信息的一種方式。Webhook在數據產生時當即發送數據,也就是你能實時收到數據。這一種不一樣於典型的API,須要用了實時性須要足夠快的輪詢。這不管是對生產仍是對消費者都是高效的。linux

Webhook有時也被稱爲反向API,由於他提供了API規則,你須要設計要使用的API。Webhook將向你的應用發起http請求,典型的是post請求,應用程序由請求驅動。nginx

Webhook模式的主要優勢是,當你的應用在等待變化時,無需週期性地調用APIs。git

github webhookgithub

工做原理

20190426155626442490073.png

  • vps啓動一個nodejs進程(webhook),用來監聽github倉庫的狀態;
  • 管理員本地修改代碼,而後push到github代碼倉庫,master分支;
  • webhook監測到master分支的push操做;
  • 觸發VPS上部署的腳本,代碼到指定位置wwwroot。

構建webhook服務

下載腳本:webhook.jsweb

說明:shell

  • 須要nodejs,部署node環境
  • 該腳本支持同時管理多個項目,只須要修改 var handler 配置便可;
  • handler:path名稱和github中項目名稱保持一致;
  • secret:和github中webhook密碼保持一致;
  • listen:配置監聽端口,以後再github中要用;

將webhook服務加入systemctl管理

# /usr/lib/systemd/system/webhook.service
[Unit]
Description=Github webhook
After=network.target

[Service]
Type=simple
User=nginx
Group=nginx
WorkingDirectory=/home/nginx/workspace/gitbook/scripts/
Environment=NODE_PORT=10080
ExecStart=/home/nginx/.nvm/versions/node/v10.15.3/bin/node /home/nginx/workspace/gitbook/scripts/webhook.js
Restart=on-failure

[Install]
WantedBy=multi-user.target

注意事項: 聲明WorkingDirectory。json

代碼發佈腳本

#!/bin/bash

WEB_PATH='/home/nginx/workspace/gitbook/books/'$1
WEB_USER='nginx'
WEB_USERGROUP='nginx'
source /home/nginx/.bash_profile

t1=`date +'%Y-%m-%d %H:%M:%S'`
echo "$t1 Start deployment"  >> /home/nginx/workspace/gitbook/scripts/info.log
cd $WEB_PATH
pwd
echo "pulling source code..."
git reset --hard origin/master
git clean -f
git pull
sleep 2
echo "building..."
t2=`date +'%Y-%m-%d %H:%M:%S'`
gitbook build

if [ $? -eq 0 ];then
    echo "$t2 Finished."  >> /home/nginx/workspace/gitbook/scripts/info.log
else
    echo "$t2 Error!"  >> /home/nginx/workspace/gitbook/scripts/info.log
fi

注意事項: source /home/nginx/.bash_profile 其中加入/$HOME/.nvm/versions/node/v10.15.3/bin/,不然可能致使腳本運行時找不到gitbook命令,構建失敗。bash

github配置webhook

  • 進入項目,Settings;服務器

  • Webhook

  • Add webhook

  • Payload URL:ip或域名(解析到服務器)+上面腳本監聽的端口+項目名稱,如:http://domainname:7777/devops_docs

  • Content type:

    • application/json
    • application/x-www-from-urlencode
  • Secret:保持和webhook.js中一致

  • 選擇要監測的github動態:默認只監聽 push event 就好

  • Active!

測試

經過上面的配置,及完成了自動化部署的全部操做,此時能夠經過向倉庫中push代碼來進行測試。

20190426155626436371687.png

開啓Active後每次推送都會有詳細日誌,若是推送失敗,根據日誌調試便可。

相關文章
相關標籤/搜索