PM2自動發布本地項目到伺服器 (一)開發環境

  • 2019 年 10 月 5 日
  • 筆記

(一)開發環境

  • 本地伺服器 Ubunt14.04
  • 遠程伺服器Ubuntu16.04
  • 發布軟體PM 2

(二)發布介紹

  本地和我們的遠程伺服器,必須都安裝有git,pm2,以及nodejs環境。實際上配置自動化發布本地程式碼就到遠程伺服器。省去了遠程伺服器的登錄過程,如果項目小還不要緊,但是項目過大,不可能每個人都去登錄伺服器主機,而且中途發布的過程經過jit遠程倉庫以後,可以增加程式碼的安全性和規範性,這樣是誰在何時何地修改的程式碼都有記錄,也增加了項目的穩定性。所以這也是為什麼推薦使用自動發布的原因。而我們之所以使用PM2軟體,是因為他相對於forever有著更強大之處,見下圖:

  下面再簡述一下本地,git,伺服器在發布時候的流程圖,見下圖:

(三)開始發布

1、配置本地和伺服器git。這裡我們使用的程式碼倉庫為碼雲,因為碼雲伺服器在中國,響應速度更快一些,關鍵是私人倉免費的多。gitub是要收錢滴。劃重點,我找了很久她兩的區別,就是收費問題。下面來看配置步驟:

  1.   生成當前機器的公鑰私鑰,如果之前有過就不用重複執行。『這裡修改為自己的郵箱』
ssh-keygen -t rsa -b 4096 -C 'g376482a@163.com'
  1. 配置git全局用戶名和郵箱,這裡的郵箱和上面定義一致:
1  git config --global user.name"gede"  2  git config --global user.email"g376482a@163.com"
  1. 啟動ssh代理:
 eval "$(ssh-agent -s)"
  1. 切換到.ssh目錄下,查看複製id-rsa.pub文件內容。
  2. 打開自己碼雲對應的倉庫,添加ssh認證即可。
  3. 使用以下程式碼測試是否配置成功:clone後面的為自己倉庫的git地址。
git clone git@gitee.com:qjnugede/ice.git

2、配置好git就可以開始我們的自動部署了,在部署之前,我們先進行一步添加本地ssh到伺服器的操作,這樣就省區了每次發布部署程式碼都要頻繁輸入伺服器密碼的麻煩,步驟如下:

  1. 複製本地的id_rsa.pub公鑰到伺服器 。『root@101.132.109.40』 –>"伺服器用戶名@伺服器ip地址"
 ssh-copy-id -i .ssh/id_rsa.pub root@101.132.109.40
  1. 配置成功如下圖:

3、自動化部署程式碼

  1. 先看一下此次發布的目錄結構:ecosystem.json為自動部署的配置文件,發布伺服器,發布哪些程式碼都在這裡進行配置。server.js為我們此次測試的小程式碼,也是node.js官方的測試文檔程式碼。 
  1. 我們進行ecosystem.json文件的編寫,程式碼和相關注釋如下,自行修改即可:
 1 {   2     "apps": [{   3         "name": "ice", //對應Nginx上的配置   4         "script": "server.js", //入口文件   5         "env": {   6             "COMON_VARIABLE": "true"   7         },   8         "env_production": {   9             "NODE_ENV": "production"  10         }  11      }],  12     "deploy": {  13         "production": {  14             "user": "root",  15             "host": ["101.132.109.40"], //伺服器ip地址  16             "port": "22",            //登錄埠  17             "ref": "origin/master",     //git倉庫對應的項目目錄  18             "repo": "git@gitee.com:qjnugede/ice.git",  19             "path": "/www/ice/production",  //要部署到伺服器哪個位置,如果沒有會自動創建  20             "ssh_options": "StrictHostKeyChecking=no",  21             //構建在發布  22             // "post-deploy": "npm install --registry=https://registry.npm.taobao.org && grunt build && pm2 startOrRestart ecosystem.json --env production",  23        "pre-deploy-local":"echo 'Deploy Done!'",  //提示發布進程  24             "env": {  25                 "NODE_ENV": "production"  26             }  27       }}  28  }
  1.  還是把server.js程式碼粘貼過來吧
 1 const http = require('http');   2   3 const hostname = '127.0.0.1';   4 const port = 3000;   5   6 const server = http.createServer((req, res) => {   7   res.statusCode = 200;   8   res.setHeader('Content-Type', 'text/plain');   9   res.end('Hello finaishn');  10 });  11  12 server.listen(port, hostname, () => {  13   console.log(`Server running at http://${hostname}:${port}/`);  14 });
  1. 到這裡我們終於可以進行程式碼發布了。
  • 執行程式碼進行發布前的初始化配置,配置以後,以後程式碼發布就無需再執行此步。執行成功效果圖如下:
1  pm2 deploy ecosystem.json production setup
  • 如果沒報錯,ok直接部署我們的程式碼。

如果報錯繼續往下看跳過此步驟,報錯請看錯誤類型這裡提供了 bash: pm2: command not found 的解決方法,報錯圖如下:

 pm2 deploy ecosystem.json production 
  • 解決方案:我們在安裝node.js的時候也出現過這個錯誤,在我之前的部落格Ubuntu下安裝node.js提到過,大家可以回去看一下,當時我們處理的方法是在.bash_profile文件中添加我們的環境變數程式碼: 配置好以後,系統會自動將變數添加到我們的系統總環境變數.bashrc裡面,只不過被添加到了最後一行,這也是我們我們問題的出處。進入到root 目錄,打開.bashrc找到關於node.js環境變數的程式碼,將其添加到第一行即可解決問題,最後文件如圖:
1 export NVM_DIR="$HOME/.nvm"  2 [ -s "$NVM_DIR/nvm.sh" ] && . "$NVM_DIR/nvm.sh"  # This loads nvm  3 [ -s "$NVM_DIR/bash_completion" ] && . "$NVM_DIR/bash_completion"  # This loads nv
  • 附一張伺服器成功以後的測試圖,測試之前現在伺服器端停掉pm2的服務,
pm2 delete server

到這裡我們的自動化部署教程就結束了,謝謝觀看。

Exit mobile version