利用 Jenkins
做自动化构建是方便又省时的,只需简单的配置就能够完成前后端项目的部署。
1、报错提示:
ERROR: Exception when publishing, exception message [Exec timed out or was interrupted after 120,004 ms]
2、报错原因
参考博客
使用 Jenkins
做部署任务时,以前端项目举例,一般会有如下几个步骤:
git
相应的分支拉取代码 (npm install or cnpm install or yarn install)
(npm run build or cnpm run build)
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
首页将命令分段
如果第二步目录或文件筛选不到,那么第三步的删除操作就不能执行,所以会报如下错误信息
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 一次,再添加这条命令就没问题。