天天看點

Webhook 實踐 —— 自動部署

安裝nodejs建議直接下載下傳二進制包,把官網上的64位二進制版本下載下傳位址複制下來,執行

​<code>​wget https://nodejs.org/dist/v6.9.2/node-v6.9.2-linux-x64.tar.xz​</code>​

​<code>​xz​</code>​格式的檔案按照以下指令解壓:

<code>xz -d xxx.tar.xz</code> 将 xxx.tar.xz解壓成 xxx.tar

<code>tar xvf xxx.tar</code>來解包

解壓之後把目錄拷貝到​<code>​/usr/local/node​</code>​目錄下

​<code>​cp ~/node_v**** /usr/local/node​</code>​

為了友善全局啟動需要在​<code>​/usr/local/bin​</code>​下建立檔案軟連接配接

​<code>​ln -s /usr/local/node/bin/npm /usr/local/bin​</code>​

​<code>​ln -s /usr/local/node/bin/node /usr/local/bin​</code>​

執行完畢之後就可以全局使用​<code>​npm​</code>​和​<code>​node​</code>​指令了。

由于網絡問題,國内可以使用阿裡npm鏡像​<code>​cnpm​</code>​

​<code>​npm install -g cnpm --registry=https://registry.npm.taobao.org​</code>​

然後通常​<code>​/usr/bin​</code>​下面的都是系統預裝的可執行程式,會随着系統更新而改變​<code>​/usr/local/bin​</code>​目錄是給使用者放置自己的可執行程式的地方,推薦放在這裡,不會被系統更新而覆寫同名檔案.如果兩個目錄下有相同的可執行程式,誰優先執行受到​<code>​path​</code>​環境變量的影響.

這裡我們要實作遠端http調用之後可以啟動shell腳本,是以我們先編寫部署腳本,由于這個項目我的開發環境和測試環境的配置檔案不一樣,是以将git目錄和部署目錄分開了。這樣就需要兩個目錄之間的​<code>​單向同步​</code>​,這裡我采用的方案是​<code>​rsync​</code>​,雖然​<code>​diff​</code>​也能實作檔案夾比對,但是同步過程複雜,需要手動分析目錄變動。

這個項目的架構是​<code>​laravel​</code>​,​<code>​xxx_git​</code>​是源碼目錄,​<code>​xxx​</code>​是部署目錄,具體情況可以調整。

這裡我們對于目錄采用​<code>​rsync​</code>​單向同步,對單檔案采用​<code>​cp​</code>​直接覆寫方式。

腳本編寫完畢之後執行下面的指令賦予執行能力

​<code>​chmod +x ./my_sync.sh.sh​</code>​

rsync參數: ​<code>​-a​</code>​:表示歸檔模式,用遞歸方式傳輸檔案 ​<code>​-v​</code>​:詳細輸出 ​<code>​-z​</code>​:傳輸時對檔案進行壓縮處理 ​<code>​-r​</code>​:對子目錄進行遞歸 ​<code>​-t​</code>​:保持檔案的時間資訊 ​<code>​-p​</code>​:保持檔案的權限 ​<code>​-o​</code>​:保持檔案的屬主資訊 ​<code>​-g​</code>​:保持檔案的屬組資訊 ​<code>​--delete​</code>​:表示以服務端為基準進行同步,保持服務端的目錄檔案和用戶端的完全一緻 ​<code>​--progress​</code>​:用于顯示資料同步的過程 ​<code>​--exclude​</code>​:排除不需要同步的目錄或者檔案

這裡我采用了gitos上面的webhoos,其他的gitlab、github大同小異。

oschina的webhook可見​​這裡​​

這裡我采用了​<code>​express + child_process​</code>​解決調用問題,這個過程就比較簡單了,這裡面需要注意的是檢測送出​<code>​push​</code>​操作的是不是​<code>​master​</code>​分之,其他分之的送出使不處理的。

這裡​<code>​exec​</code>​和​<code>​req.send()​</code>​是沒有回調關系的,是以伺服器webhook時候不會逾時。另外這裡還實作了腳本運作的日志記錄,可以針對每次部署來檢視具體檔案變更情況。

參考延伸 ​​《exec與spawn方法的差別與陷阱》​​

nodejs是異步單線程,在一些情況下會出現異常退出的情況,為了保證服務常可用,我們需要一個​​pm2​​來保證程式的運作。

​<code>​npm install pm2 -g​</code>​

這裡如果安裝速度慢的話可以使用​<code>​cnpm​</code>​安裝。

執行​<code>​pm2 start node app.js​</code>​即可以背景維護運作node程式。

pm2一些指令 pm2 list pm2 stop all/[name] pm2 start all/[name]

​<code>​git checkout dev​</code>​

切換到dev分支後修改檔案

​<code>​git commit​</code>​

切換到主分支然後将dev分之合并過來

​<code>​git checkout dev &amp;&amp; git merge dev​</code>​

送出之後伺服器自動部署

​<code>​git push​</code>​