Jenkins 本身是用 Docker 部署在服务器上,以前在网页端打开具体前端项目,点击 “立即构建” Jenkins 就会在 git 上把项目文件更新然后用 npm 命令进行构建,以前一直没问题。直到最近因项目需求,某个项目需要引入一个 13M 的特殊 js 文件后,构建就没成功过。
具体情况是点击 “立即构建” 后,网页上能输出 console output,在输出中看到 git 的更新文件功能是正常的,但是一旦跑到前端的 npm 命令时,就会停在 loading 中(加载效果一直在转),没有任何反应,直至手动终止构建。
为了保证该项目本身是没有问题的,我在 git 上把项目拉取下来,放在任何一个电脑上,都能成功在电脑本地构建,同时可以确保的是,仓库上分支和代码版本是一致的,本地的 node/npm 版本和 npm 命令与 Jenkins 里的设置也是一致的。
前端构建的命令是 npm run limit && npm run build,对应的脚本是 cross-env LIMIT=4096 increase-memory-limit 和 vue-cli-service build。其中 limit 命令是项目构建失败了之后,经过搜索怀疑是 node 构建时对单文件大小有限制,所以使用了 limit 命令进行解除限制的处理。但是仍然没有任何效果。
更奇怪的是我把 Jenkins 构建命令换成 npx vue-cli-service build --verbose,依然构建不成功,也没有输出更多有效的日志。但是我发现只要不是跑 vue-cli-service build,而是 npm audit、npm run limit 等打包命令时,Jenkins 的输出是正常的(不卡住)。
由于 Jenkins 构建前端项目时没有任何有效的打印,所以请问 Jenkins 对于某个 jobs 是否可以有更详细的本地日志?使用 Jenkins CLI 或者打开 Jenkins Docker 能不能捕获更多构建时的信息?
我该如何去排查这个前端项目的构建问题?
1
rbe 2019-07-24 18:24:13 +08:00
在 jenkins 容器映射出来的本地目录, 如 ~/jenkins_home 下,找 ~/jenkins_home/jobs/[project_name]/builds/[build_id]/log 文件,这是每次构建输出的日志
|
2
w516322644 2019-07-24 18:41:29 +08:00
把 13m 的 js (记得保存)删除下,构建下,有问题没有。没有的话,就是有的地方有大小限制,超时设置?
|
3
jmyz0455 OP @rbe 这个日志我有看到,这样的,就是无论是网页里点击构建还是 Jenkins CLI 构建,命令都会卡住没有任何输出,只能在网页里手动点停止。
然后你说的这个日志跟网页上看到的一样,是: Terminated Build was aborted Aborted by fe Finished: ABORTED 我也尝试过直接到 ~/jenkins_home/workspace/[project_name]/ 里直接 npx vue-cli-service build --verbose,依旧卡住没输出,我不知道是什么问题了,可能我拿自己的服务器在非 Docker 环境里跑一下试试,可能不是 Jenkins 的问题 |
4
jmyz0455 OP @w516322644 现在把那个 js 删了,依旧不行
|
5
version 2019-07-24 18:59:19 +08:00 via iPhone
cross-env NODE_ENV=development
试试改变下 nodejs 环境变量,最近服务器直接升级 node 子进程有点问题,开发模式就没问题,正式服环境严格了很多,搭配 webpack 可能容易报错或者卡住不动 |
6
jmyz0455 OP @version 这里有个问题,我完全摸不着 Jenkins 是怎么配置 node 和 npm 环境的,我在页面上看过插件列表,就只有一个 Pipeline: Nodes and Processes,感觉不关事吧。
我也希望把 Docker Jenkins 里的 node 和 npm 版本弄成跟我本地一样的好去掉干扰项,但是目前不知道怎么搞。 请问如何改变 Docker Jenkins 里的 nodejs 环境变量和 node、npm 版本?宿主环境是没有装 node npm java 环境的。 |
7
sodatea 2019-07-24 19:32:27 +08:00
提供几个可能的排查方向:
1. 目录权限问题 2. 环境变量问题,说不定有什么预定义的奇怪的环境变量导致运行出错 3. lockfile 和 cache 问题,确认一下 lockfile 的内容是最新的(以免碰到旧版本的 bug ),确认一下 CI 环境安装依赖用的命令是 `npm ci` |
8
shangsharon 2019-07-24 20:26:11 +08:00 via Android
这种没有任何输出又必须要手动终止的情况,多半是命令执行过程中弹出了提示,等待确认才能下步的,要看最后一步执行的命令是什么,会不会产生等待输入 /响应的情况。比如 cp a b,文件 b 存在那就会等你确认了,至于日志里会不会输出提示确认的信息就不确定了。最近在弄系统自动化部署的时候遇到过这个情况,覆盖文件的时候没有提示,放着一晚上没动静,只能手动终止。后面一步一步看命令才排查出来的
|
9
moocean 2019-07-24 21:17:16 +08:00
我曾经碰见过:
1.我的前端项目( vue )在我电脑上是可以打包构建的,但是在 jenkins 上,构建会一直失败,后来直接把项目放到服务器里构建(发现报错) 2.之前有个项目,jenkins 构建之后,不会更新,还是之前缓存的,将 jenkins 缓存全删了就可以 建议: 自己搞一个虚拟机,部署一个新的 jenkins,这个应该很快的,配置一下前端 git 地址分支,在部署试试看, |
10
francis59 2019-07-24 21:49:27 +08:00
@jmyz0455 #6 看看 Jenkins 是不是装了 NodeJS 插件,如果是的话,到 Manage Jenkins -> Global Tool Configuration 里面看看 NodeJS installations,
还可以进入那个 Jenkins 的 docker 容器,安装 git + nvm,用 nvm 安装 nodejs,把代码 clone 到 docker 容器中进行本地构建 |
11
francis59 2019-07-24 21:54:23 +08:00
@jmyz0455 #6 构建脚本里加个 node -v 看看 docker 容器里用的哪个版本,再在本地装 nvm 或 nvm-windows,在本地切换成那个版本试试构建
|
12
xuanbg 2019-07-24 22:23:01 +08:00
我觉得是不是没有磁盘空间了? df 命令查看一下?
|
13
jakezh 2019-07-24 22:29:39 +08:00
如果是 node 版本问题的话 看这里 https://wiki.jenkins.io/display/JENKINS/NodeJS+Plugin
官方图解 也可以用自己的 build 命令, 不用 jenkins 自带的 node, 在 build 命令里面用本地 node 的绝对路径 |
14
rbe 2019-07-24 23:33:41 +08:00
@jmyz0455 #6 配置 Node 和 Npm,要看你是一个流水线项目还是 freestyle project.
我个人经验的话,流水线用 agent 引入的 node docker 镜像; freestyle project 的话是使用的 Node.js Plugin 同意 8 楼说的,多半是执行过程中弹出了需要确认的提示,比如在 execute shell script 的时候使用了 scp 之类的指令,即使把公钥加进目标机器的 authorized_keys 了,第一次还是需要手动在 cli 下执行一下,否则会卡在那个 fingerprint 的确认那里,没有什么明显的报错,把输出 2>&1 也没有用 所以问题可能在你这个 13m 的 js 文件引入方式上,是不是引入时候需要确认权限之类的 |
15
Sasasu 2019-07-25 09:35:48 +08:00
虽然可能没有关系,但我还是说一下
linux 输出时程序可以检测输出的目的地是否为一个终端,如果不是终端程序可以不输出或者少输出,防止爆掉日志 这个程序可以强制 app 认为目的地是一个终端 https://github.com/Sasasu/ColorThis 原理 https://sasasu.github.io/diary/fuck_go_syscall/ |
16
iehp 2019-07-25 09:57:19 +08:00
之前遇到过类似一直 loading 的问题是在发布过程中,某些旧的即将被更新的文件正被占用中。killd 掉相应的进程就 OK 了。
|
17
mikuazusa 2019-07-25 10:20:23 +08:00
关键还是日志,这种情况,你要进去构建节点容器里面去,单独执行构建命令看前台打印的日志返回信息。
|
18
hell0v2 2019-07-25 11:15:31 +08:00
看下 jenkinsfile ,不行就去里面打日志调试啊 感觉没那么复杂吧
|
19
version 2019-07-25 15:28:21 +08:00 via iPhone
@jmyz0455 有可能 8 楼所说的是你 npm 安装依赖提示需要确认才能下一步,可以把项目的依赖版本降低些,例如 webpack 那些,因为最近也需要需要确认提示的情况,我是服务器自动部署,不过我是自己写脚本,没用 jenkins
|
20
xwhxbg 2019-07-25 16:44:57 +08:00
vue-cli 的问题吧,应该是每次构建的时候用的都是容器里装的那个 vue,可以试试先重装全局的 vue-cli 然后再构建
|
22
jmyz0455 OP @defunct9 暂时还没,这几天很忙,我有空了先试试各位的办法,还是不行再打搅您吧,当伸手党有点不太好意思哈哈。
|
23
benbenTW 2019-12-10 22:15:26 +08:00
遇到了相同的问题。
我们的 docker 中,使用了 docker-chromium-xvfb。vue-cli-service 是 4.1.0 版本。在 vue-cli-service build 的时候,卡住。 但是在 vue-cli-service 是 3 版本的时候,没有问题。 最后发现是 vue-cli-service 4.1.0 版本,检查了 docker 中的 chrome 版本。chrome --version 之后没有返回。 解决办法是修改 vue-cli-service 中的脚本,跳过 chrome --version。 |