Jenkins 点击构建前端项目时,无限加载没有任何响应,求助。

2019-07-18 10:30:14 +08:00
 jmyz0455

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 能不能捕获更多构建时的信息?

我该如何去排查这个前端项目的构建问题?

9034 次点击
所在节点    程序员
23 条回复
rbe
2019-07-24 18:24:13 +08:00
在 jenkins 容器映射出来的本地目录, 如 ~/jenkins_home 下,找 ~/jenkins_home/jobs/[project_name]/builds/[build_id]/log 文件,这是每次构建输出的日志
w516322644
2019-07-24 18:41:29 +08:00
把 13m 的 js (记得保存)删除下,构建下,有问题没有。没有的话,就是有的地方有大小限制,超时设置?
jmyz0455
2019-07-24 18:55:59 +08:00
@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 的问题
jmyz0455
2019-07-24 18:56:33 +08:00
@w516322644 现在把那个 js 删了,依旧不行
version
2019-07-24 18:59:19 +08:00
cross-env NODE_ENV=development
试试改变下 nodejs 环境变量,最近服务器直接升级 node 子进程有点问题,开发模式就没问题,正式服环境严格了很多,搭配 webpack 可能容易报错或者卡住不动
jmyz0455
2019-07-24 19:05:03 +08:00
@version 这里有个问题,我完全摸不着 Jenkins 是怎么配置 node 和 npm 环境的,我在页面上看过插件列表,就只有一个 Pipeline: Nodes and Processes,感觉不关事吧。

我也希望把 Docker Jenkins 里的 node 和 npm 版本弄成跟我本地一样的好去掉干扰项,但是目前不知道怎么搞。
请问如何改变 Docker Jenkins 里的 nodejs 环境变量和 node、npm 版本?宿主环境是没有装 node npm java 环境的。
sodatea
2019-07-24 19:32:27 +08:00
提供几个可能的排查方向:
1. 目录权限问题
2. 环境变量问题,说不定有什么预定义的奇怪的环境变量导致运行出错
3. lockfile 和 cache 问题,确认一下 lockfile 的内容是最新的(以免碰到旧版本的 bug ),确认一下 CI 环境安装依赖用的命令是 `npm ci`
shangsharon
2019-07-24 20:26:11 +08:00
这种没有任何输出又必须要手动终止的情况,多半是命令执行过程中弹出了提示,等待确认才能下步的,要看最后一步执行的命令是什么,会不会产生等待输入 /响应的情况。比如 cp a b,文件 b 存在那就会等你确认了,至于日志里会不会输出提示确认的信息就不确定了。最近在弄系统自动化部署的时候遇到过这个情况,覆盖文件的时候没有提示,放着一晚上没动静,只能手动终止。后面一步一步看命令才排查出来的
moocean
2019-07-24 21:17:16 +08:00
我曾经碰见过:
1.我的前端项目( vue )在我电脑上是可以打包构建的,但是在 jenkins 上,构建会一直失败,后来直接把项目放到服务器里构建(发现报错)
2.之前有个项目,jenkins 构建之后,不会更新,还是之前缓存的,将 jenkins 缓存全删了就可以
建议:
自己搞一个虚拟机,部署一个新的 jenkins,这个应该很快的,配置一下前端 git 地址分支,在部署试试看,
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 容器中进行本地构建
francis59
2019-07-24 21:54:23 +08:00
@jmyz0455 #6 构建脚本里加个 node -v 看看 docker 容器里用的哪个版本,再在本地装 nvm 或 nvm-windows,在本地切换成那个版本试试构建
xuanbg
2019-07-24 22:23:01 +08:00
我觉得是不是没有磁盘空间了? df 命令查看一下?
jakezh
2019-07-24 22:29:39 +08:00
如果是 node 版本问题的话 看这里 https://wiki.jenkins.io/display/JENKINS/NodeJS+Plugin

官方图解

也可以用自己的 build 命令, 不用 jenkins 自带的 node, 在 build 命令里面用本地 node 的绝对路径
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 文件引入方式上,是不是引入时候需要确认权限之类的
Sasasu
2019-07-25 09:35:48 +08:00
虽然可能没有关系,但我还是说一下
linux 输出时程序可以检测输出的目的地是否为一个终端,如果不是终端程序可以不输出或者少输出,防止爆掉日志

这个程序可以强制 app 认为目的地是一个终端 https://github.com/Sasasu/ColorThis
原理 https://sasasu.github.io/diary/fuck_go_syscall/
iehp
2019-07-25 09:57:19 +08:00
之前遇到过类似一直 loading 的问题是在发布过程中,某些旧的即将被更新的文件正被占用中。killd 掉相应的进程就 OK 了。
mikuazusa
2019-07-25 10:20:23 +08:00
关键还是日志,这种情况,你要进去构建节点容器里面去,单独执行构建命令看前台打印的日志返回信息。
hell0v2
2019-07-25 11:15:31 +08:00
看下 jenkinsfile ,不行就去里面打日志调试啊 感觉没那么复杂吧
version
2019-07-25 15:28:21 +08:00
@jmyz0455 有可能 8 楼所说的是你 npm 安装依赖提示需要确认才能下一步,可以把项目的依赖版本降低些,例如 webpack 那些,因为最近也需要需要确认提示的情况,我是服务器自动部署,不过我是自己写脚本,没用 jenkins
xwhxbg
2019-07-25 16:44:57 +08:00
vue-cli 的问题吧,应该是每次构建的时候用的都是容器里装的那个 vue,可以试试先重装全局的 vue-cli 然后再构建

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/584034

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX