配置 PM2 實現代碼自動發佈

參考文檔

先期準備

PM2 的代碼自動發佈依賴 GitHub 或相似功能的網站,因此須要先在 GitHub 上添加我的電腦和遠程服務器的 SSH 祕鑰。javascript

大致流程以下( Mac 和 Linux 系列的系統直接在終端中執行指令,Windows 須要先安裝 Git 客戶端):java

  1. 檢查本機是否有現成的 SSH 祕鑰
  2. 沒有祕鑰的話,生成一個新的祕鑰並添加到本機的 ssh-agent 中。若是已經有祕鑰了,則直接添加到本機的 ssh-agent 中
  3. 將 SSH 祕鑰添加到 GitHub 帳號中
  4. 測試 SSH 鏈接,這裏必定要測試成功才行。鏈接成功的,能看到下面這段文字:
Hi XXX! You've successfully authenticated, but GitHub does not provide shell access.

要注意,本身的我的電腦和遠程服務器都要作這一整套操做,這樣纔可以在本機發布代碼到 GitHub 上以後,再讓遠程服務器把最新的代碼更新過去。node

安裝 PM2

在本機和服務器都全局安裝 PM2,用 npmyarn 都可,若是下載速度慢,記得先切換成淘寶的 npm 源git

注意,若是兩邊電腦上的 Git 不是最新版,務必更新到最新版。否則可能有代碼沒法及時同步的問題,服務器始終沒法 pull 到最新版本的代碼,很鬧心。當前的最新版是 2.16.3 版本,2018 年 3 月 22 號發佈。github

本機配置 PM2

在本機的終端環境中,用 pm2 ecosystem 命令生成一份原始的 PM2 配置文件 ecosystem.confi.js。注意,官網文檔和實際操做的結果不一致,文檔上說執行這個命令會生成 ecosystem.json 這個文件,但本身操做的時候並非這樣,你們也要注意一下。web

爲了方便你們參考,把本身修改後的配置文件內容貼了上來,只貼了重要的部分,別的地方根據本身的須要修改。shell

module.exports = {
  apps : [
    // 目前只用 PM2 管理一個項目,因此這裏刪除了多餘的內容
    {
      name      : 'RMS',
      // 這裏是項目的啓動文件,不過本身沒用上
      script    : './dist/bin/www',
      env: {
        COMMON_VARIABLE: 'true'
      },
      env_production : {
        NODE_ENV: 'dev'
      }
    }
  ],

  // 部署環境的設置,本身只用到了開發環境,須要修改完代碼以後馬上看到結果,因此就沒有生產環境的配置
  deploy : {
    dev : {
      // 服務器上進行平常操做的用戶
      user : 'www',
      // 服務器的 IP
      host : '1.2.3.4',
      ref  : 'origin/master',
      repo : 'git@github.com:Dream4ever/rms.git',
      // 項目要部署到服務器上的位置,PM2 默認會部署到該路徑的 source 子文件夾下
      path : '/home/www/websites/rms',
      // 服務器下載到最新的代碼以後要執行的命令,把 npm 命令改爲了 yarn
      'post-deploy' : 'yarn && pm2 reload ecosystem.config.js --env dev',
      env  : {
        NODE_ENV: 'dev'
      }
    }
  }
};

部署項目

配置完成以後,就要開始把項目經過 PM2 自動部署到服務器上了。npm

這裏有一點要注意:須要先把本機項目的最新版,也就是保存並提交了全部修改的版本發佈到 GitHub 上去,而後再進行後面的部署操做。json

若是以前沒有經過 SSH 鏈接過服務器,就須要先在本機執行 ssh-copy-id www@1.2.3.4 這個命令(www 是前面配置的服務器的用戶,@ 後面是 IP),把本機的 SSH 祕鑰信息添加到服務器上,這個配置成功以後,之後就不須要再執行這條 SSH 命令了。windows

而後在本機初始化遠程服務器上的項目:pm2 deploy ecosystem.confi.js dev setup。命令中的 dev 指的是在上面配置文件中寫的部署環境的名稱,對於同時須要設置開發和生產環境的狀況,就根據本身須要初始化兩次吧,沒這個需求的就不用管了。

接着就是部署項目,通俗地說,也就是通知服務器把前面從本機 push 到 GitHub 上的最新代碼下載下來:pm2 deploy ecosystem.confi.js dev

在這兩個過程當中,均可以看到服務器上的操做指令和結果都顯示到本機的終端上了。

通常沒什麼問題的話,通過這幾步操做,就能部署成功了。

若是部署的是 Node.js 服務,固然還須要把它啓動起來才行。一種方式就是經過 PM2 的 exec 指令讓遠程服務器執行指定的命令,另外一種方式則是直接 SSH 登陸到服務器上執命令,各取所好吧。

若是在本機執行,就用這種方式:pm2 deploy production exec "pm2 start ./api/bin/www。若是登陸到服務器上執行的話,就直接執行 pm2 start ./api/bin/www 就行了。

對於在本機用 ES6 語法寫代碼的同窗,有一點要注意。由於本身在本機用的是 babel-preset,可是這一套指令不知道怎麼讓它在服務器上運行,因此用了 PM2 官網提供的方法,就是用 --interpreter babel-node 這個參數來執行。

pm2 deploy production exec "pm2 start ./api/bin/www --interpreter babel-node"

官網還提供了另外一種方法,是 PM2 做者我的比較喜歡的方式。就是用一個入口文件經過 require() 命令引用本來的入口文件,雖然會影響性能,可是也有它的好處。

文檔的地址:Using transpilers with PM2

管理項目

先列出官網提供的 CheatSheet,能夠用來速查。

本身在使用 PM2 的時候,有幾個經常使用的命令:

pm2 start xx.js --watch,以監控模式啓動項目,這樣就能和 nodemon、supervisor 同樣,在最新版的代碼部署到服務器以後,自動重啓服務。

這個 pm2 start 命令有一點須要注意:在第一次用它啓動某個項目的時候,若是沒有用 --name 爲項目指定名稱,在啓動項目以後能夠看到 PM2 本身爲項目指定了一個名稱,就是下面表格中的 Name 所對應的字段。以後再次啓動項目的時候,就能夠直接用 pm2 start www 啓動項目了,也就是經過項目名稱啓動。

┌──────┬──────┬─────────┬───┬─────┬────────┐
│ Name │ mode │ status  │ ↺ │ cpu │ memory │
├──────┼──────┼─────────┼───┼─────┼────────┤
│ www  │ fork │ stopped │ 0 │ 0%  │ 0 B    │
└──────┴──────┴─────────┴───┴─────┴────────┘

pm2 list 則會列出經過 PM2 來管理的全部項目的概況,也就是上面的這個表格。

還有就是 pm2 monit,用來在終端監控服務的運行狀況。

┌─ Process list ───────┐┌─ Global Logs ────────────────────────────────────────┐
│[ 0] www        Mem:  ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
│                      ││                                                      │
└──────────────────────┘└──────────────────────────────────────────────────────┘
┌─ Custom metrics     ─┐┌─ Metadata ───────────────────────────────────────────┐
│ (http://bit.ly/code- ││ App Name              www                            │
│ metrics)             ││ Restarts              0                              │
│                      ││ Uptime                0                              │
│                      ││ Script path           /Users/samsara/Code/rms/api/b  │
└──────────────────────┘└──────────────────────────────────────────────────────┘
 left/right: switch boards | up/down/mouse: scroll | Ctrl-C: exit         To go

另外還有一個指令就是 pm2 logs app,用來查看 app 這個項目的日誌。若是隻是執行 pm2 logs 的話,就會顯示全部項目的日誌,看着會比較亂。

好了,文檔到這裏就結束了,感興趣的話,就快試試吧!

相關文章
相關標籤/搜索