node實現自動化部署;
說明:由於本人做的前端,Java就不太會,但是node確實一個對於前端同學寫后端代碼的一個非常好的技術。個人的項目前端是
vue
寫的后端是Nodejs
,同時利用jenkjins
實現前后端自動化部署。
1、項目上傳;
前端項目這里就不在概括,以下內容都是node部署內容;注:Node項目寫完之后,不需要打包,直接把源碼上傳到你的遠程服務器就可以了,我的服務器用的是阿里雲Liunx服務器,下文提到的服務器皆為阿里雲服務器。
- 把你的Node項目進行打包。(node_modules文件不要打包)。
- 登錄你的服務器,然后新建一個文件夾。
- 把你的node代碼上傳到你的新建文件夾中。
- 把你的上傳的Node項目解壓縮到你的新建文件夾中。
2、jenkins
實現半自動化;
為什么這里說是半自動化,因為實現了push拉取代碼;但是Node並不會自動啟動;
-
登錄你的jenkins並新建立一個項目。
-
配置你的jenkins的shell命令。
-
具體的jenkins的git配置請查看我的另外一騙文章,傳送門。
-
我的jenkins配置文件;
#!/bin/bash cd /var/lib/jenkins/workspace/herolist #進入Jenkins工作空間下herolist項目目錄 tar -zcvf heroList.tar.gz * #把生成的項目打包成壓縮包,方便移動到項目部署目錄 cd /www/herolist # 進入node項目根目錄 mv /var/lib/jenkins/workspace/heroList/heroList.tar.gz ./ # 移動剛剛打包好的項目到web項目根目錄 tar -zxvf heroList.tar.gz # 解壓項目到本目錄 rm -rf heroList.tar.gz # 刪除壓縮包 npm install # 安裝項目中的依賴 # npm run dev # 項目啟動。
注意:當我們做到這里時,基本就算搞定了,但是還缺少重要的一步,就是node服務啟動。
當一切都感覺完好時,卻發現最后一行node服務啟動報錯,不過我沒解決掉,具體的報錯原因是:
Error: Cannot find module 'express'
。我的操作是在Liunx手動npm run dev
運行是完好的,但是帶來了另一個問題,遠程服務不能關閉,不然Node就掛了,在網上找了不少方法可以使用,nohup npm run dev >myout.file 2>&1 &
持續運行node並把信息輸出到指定的文件中,這樣啟動的Node服務就不會因為你退出終端而停止了。但是另一個問題便是,你用jjenkins進行新的構建時,node並不會重啟,來加載你的新代碼。看下文pm2解決;
3、jenkins + node + pm2
實現自動化;
條件:
- 已完成jenkins和git的配置,
- 已經可以成功部署實現自動化;
1、安裝pm2
;
npm install pm2 -g
測試;出現以下類似列表說明安裝成功;
[root@iZbp156pkpio44mis76wmxZ herolist]# pm2 list
┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐
│ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │
├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤
│ 0 │ npm │ default │ N/A │ fork │ 0 │ 0 │ 30 │ stopped │ 0% │ 0b │ root │ disabled │
└─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘
[root@iZbp156pkpio44mis76wmxZ herolist]# cd /
2、使用;
# 在你的Jenkins的項目配置文件的shell命令中在最后一行加上:
pm2 restart npm -- run dev # 重啟nodejs
3、測試;
[root@iZbp156pkpio44mis76wmxZ herolist]# ps -ef | grep node
root 8981 6550 0 22:29 pts/0 00:00:00 grep --color=auto node # node啟動前
[root@iZbp156pkpio44mis76wmxZ herolist]# ps -ef | grep node
root 9101 9088 0 22:29 ? 00:00:00 sh -c export NODE_ENV=production && node app.js
root 9102 9101 3 22:29 ? 00:00:00 node app.js # node啟動后
root 9126 6550 0 22:30 pts/0 00:00:00 grep --color=auto node
[root@iZbp156pkpio44mis76wmxZ herolist]#
4、常見pm2命令介紹;傳送門;
到此自動化部署結束;
4、問題;
-
jenkins執行pm2命令報錯;
pm2: command not found
;一般情況下,如果我們全局安裝了的話,在window上不會出現,但是liunx上好像不行,需要我們自己手動建立軟連接,類似與window創建的環境變量。部分用戶可能安裝上 連基礎的命令也不能使用,也是需要建立軟連接的;
......以上省略! [heroList] $ /bin/sh -xe /tmp/jenkins4753469389532234169.sh [heroList] $ /bin/sh -xe /tmp/jenkins259913818346979744.sh + pm2 start npm -- run dev /tmp/jenkins259913818346979744.sh: line 6: pm2: command not found Build step 'Execute shell' marked build as failure Finished: FAILURE
解決:
# 找到pm2的安裝根目錄;我的:/home/local/mynode/node-v12.18.2-linux-x64/bin/pm2 [root@iZbp156pkpio44mis76wmxZ herolist]# npm install -g pm2 npm WARN deprecated debug@4.1.1: Debug versions >=3.2.0 <3.2.7 || >=4 <4.3.1 have a low-severity ReDos regression when used in a Node.js environment. It is recommended you upgrade to 3.2.7 or 4.3.1. (https://github.com/visionmedia/debug/issues/797) /home/local/mynode/node-v12.18.2-linux-x64/bin/pm2 -> /home/local/mynode/node-v12.18.2-linux-x64/lib/node_modules/pm2/bin/pm2 /home/local/mynode/node-v12.18.2-linux-x64/bin/pm2-dev -> /home/local/mynode/node-v12.18.2-linux-x64/lib/node_modules/pm2/bin/pm2-dev /home/local/mynode/node-v12.18.2-linux-x64/bin/pm2-docker -> /home/local/mynode/node-v12.18.2-linux-x64/lib/node_modules/pm2/bin/pm2-docker /home/local/mynode/node-v12.18.2-linux-x64/bin/pm2-runtime -> /home/local/mynode/node-v12.18.2-linux-x64/lib/node_modules/pm2/bin/pm2-runtime npm WARN ws@7.2.5 requires a peer of bufferutil@^4.0.1 but none is installed. You must install peer dependencies yourself. npm WARN ws@7.2.5 requires a peer of utf-8-validate@^5.0.2 but none is installed. You must install peer dependencies yourself. npm WARN optional SKIPPING OPTIONAL DEPENDENCY: fsevents@2.3.1 (node_modules/pm2/node_modules/fsevents): npm WARN notsup SKIPPING OPTIONAL DEPENDENCY: Unsupported platform for fsevents@2.3.1: wanted {"os":"darwin","arch":"any"} (current: {"os":"linux","arch":"x64"}) + pm2@4.5.1 added 195 packages from 195 contributors in 9.346s [root@iZbp156pkpio44mis76wmxZ herolist]# # 找到環境變量路徑 %PATH; [root@iZbp156pkpio44mis76wmxZ /]# echo $PATH /usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/home/local/JDK/jdk1.8.0_251/bin:/home/local/mynode/node-v12.18.2-linux-x64/bin:/home/local/maven/apache-maven-3.6.3/bin:/root/bin [root@iZbp156pkpio44mis76wmxZ /]# # 建立軟連接; [root@iZbp156pkpio44mis76wmxZ /]# ln -s /home/local/mynode/node-v12.18.2-linux-x64/bin/pm2 /usr/local/bin/
注意:第一次建立軟連接后,我並沒有解決
pm2: command not found
。需要 /usr/local/bin/ 改為 /usr/bin/完整命令:
ln -s /home/local/mynode/node-v12.18.2-linux-x64/bin/pm2 /usr/bin/
-
測試;jenkins控制台輸出日志;
......以上省略! [heroList] $ /bin/sh -xe /tmp/jenkins4043641238157935034.sh [heroList] $ /bin/sh -xe /tmp/jenkins4997403699140616984.sh + pm2 start npm -- run dev [PM2] Applying action restartProcessId on app [npm](ids: [ 0 ]) [PM2] [npm](0) ✓ [PM2] Process successfully started ┌─────┬────────┬─────────────┬─────────┬─────────┬──────────┬────────┬──────┬───────────┬──────────┬──────────┬──────────┬──────────┐ │ id │ name │ namespace │ version │ mode │ pid │ uptime │ ↺ │ status │ cpu │ mem │ user │ watching │ ├─────┼────────┼─────────────┼─────────┼─────────┼──────────┼────────┼──────┼───────────┼──────────┼──────────┼──────────┼──────────┤ │ 0 │ npm │ default │ N/A │ fork │ 10506 │ 0s │ 30 │ online │ 0% │ 3.5mb │ root │ disabled │ └─────┴────────┴─────────────┴─────────┴─────────┴──────────┴────────┴──────┴───────────┴──────────┴──────────┴──────────┴──────────┘ Finished: SUCCESS