利用 Jenkins
做自動化構建是方便又省時的,只需簡單的配置就能夠完成前後端專案的部署。
1、報錯提示:
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,004 ms]
複製程式碼
2、報錯原因
參考部落格
使用 Jenkins
做部署任務時,以前端專案舉例,一般會有如下幾個步驟:
- 1、 從
git
相應的分支拉取程式碼 - 2、安裝專案的三方依賴包
(npm install or cnpm install or yarn install)
- 3、專案程式碼測試或生產環境編譯構建
(npm run build or cnpm run build)
- 4、啟動專案的服務 (這裡一般是
node server
)
其中的第 2、3 步是比較耗時的。這裡主要因為第 3 步的構建時間完全有可能超過 Jenkins
設定的構建時間(120000 ms),導致 Jenkins
構建超時而中斷。
我們再看看 Jenkins
的預設配置
每個構建步驟在沒有做手動設定的情況下預設是 120000 ms
的超時時間。一旦相應的構建步驟超時,構建就會中斷並丟擲如下錯誤資訊。
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,004 ms]
複製程式碼
3、解決方案
在可能超時的構建步驟那裡設定 Exec timeout(ms)
合理的時間,以防止構建步驟超時,同時勾選上 Exec in pty
讓控制檯及時輸出相關日誌資訊。
4、問題擴充套件
命令解析 cd deploy/merc && ls | grep -v node_modules | xargs rm -r
首頁將命令分段
- 1、cd deploy/merc 將當前目錄指向 deploy/merc
- 2、ls | grep -v node_modules 查詢目錄下除 node_modules 外的目錄或檔案
- 3、ls | grep -v node_modules | xargs rm -r 查詢並刪除目錄下除 node_modules 外的目錄或檔案
如果第二步目錄或檔案篩選不到,那麼第三步的刪除操作就不能執行,所以會報如下錯誤資訊
cd deploy/merc && ls | grep -v node_modules | xargs rm -r
rm: missing operand //操作物件不存在
Try `rm --help' for more information.
複製程式碼
第二行報錯:操作物件不存在。
這個命令的主要目的是:在 Jenkins 構建專案之前,會從配置的 git 地址拉取最新的程式碼,為了保證每次部署的程式碼都是最新的。那又為什麼要排除 node_modules 目錄呢?node_modules 是專案的第三方依賴包,檔案下載比較大且很慢,為了保證每次的專案構建時間,所以保留了這個目錄。這個命令也是非必要的,問題的解決方案就是先不執行這個命令,然後 build 一次,再新增這條命令就沒問題。