Jenkins 構建 Exec timeout!

littleLane發表於2018-05-16

利用 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 一次,再新增這條命令就沒問題。

相關文章