安裝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 && git merge dev</code>
送出之後伺服器自動部署
<code>git push</code>