V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
jmyz0455
V2EX  ›  程序员

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

  •  
  •   jmyz0455 · 2019-07-18 10:30:14 +08:00 · 8998 次点击
    这是一个创建于 1716 天前的主题,其中的信息可能已经有所发展或是发生改变。

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

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

    23 条回复    2019-12-10 22:15:26 +08:00
    rbe
        1
    rbe  
       2019-07-24 18:24:13 +08:00
    在 jenkins 容器映射出来的本地目录, 如 ~/jenkins_home 下,找 ~/jenkins_home/jobs/[project_name]/builds/[build_id]/log 文件,这是每次构建输出的日志
    w516322644
        2
    w516322644  
       2019-07-24 18:41:29 +08:00
    把 13m 的 js (记得保存)删除下,构建下,有问题没有。没有的话,就是有的地方有大小限制,超时设置?
    jmyz0455
        3
    jmyz0455  
    OP
       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
        4
    jmyz0455  
    OP
       2019-07-24 18:56:33 +08:00
    @w516322644 现在把那个 js 删了,依旧不行
    version
        5
    version  
       2019-07-24 18:59:19 +08:00 via iPhone
    cross-env NODE_ENV=development
    试试改变下 nodejs 环境变量,最近服务器直接升级 node 子进程有点问题,开发模式就没问题,正式服环境严格了很多,搭配 webpack 可能容易报错或者卡住不动
    jmyz0455
        6
    jmyz0455  
    OP
       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
        7
    sodatea  
       2019-07-24 19:32:27 +08:00
    提供几个可能的排查方向:
    1. 目录权限问题
    2. 环境变量问题,说不定有什么预定义的奇怪的环境变量导致运行出错
    3. lockfile 和 cache 问题,确认一下 lockfile 的内容是最新的(以免碰到旧版本的 bug ),确认一下 CI 环境安装依赖用的命令是 `npm ci`
    shangsharon
        8
    shangsharon  
       2019-07-24 20:26:11 +08:00 via Android
    这种没有任何输出又必须要手动终止的情况,多半是命令执行过程中弹出了提示,等待确认才能下步的,要看最后一步执行的命令是什么,会不会产生等待输入 /响应的情况。比如 cp a b,文件 b 存在那就会等你确认了,至于日志里会不会输出提示确认的信息就不确定了。最近在弄系统自动化部署的时候遇到过这个情况,覆盖文件的时候没有提示,放着一晚上没动静,只能手动终止。后面一步一步看命令才排查出来的
    moocean
        9
    moocean  
       2019-07-24 21:17:16 +08:00
    我曾经碰见过:
    1.我的前端项目( vue )在我电脑上是可以打包构建的,但是在 jenkins 上,构建会一直失败,后来直接把项目放到服务器里构建(发现报错)
    2.之前有个项目,jenkins 构建之后,不会更新,还是之前缓存的,将 jenkins 缓存全删了就可以
    建议:
    自己搞一个虚拟机,部署一个新的 jenkins,这个应该很快的,配置一下前端 git 地址分支,在部署试试看,
    francis59
        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 容器中进行本地构建
    francis59
        11
    francis59  
       2019-07-24 21:54:23 +08:00
    @jmyz0455 #6 构建脚本里加个 node -v 看看 docker 容器里用的哪个版本,再在本地装 nvm 或 nvm-windows,在本地切换成那个版本试试构建
    xuanbg
        12
    xuanbg  
       2019-07-24 22:23:01 +08:00
    我觉得是不是没有磁盘空间了? df 命令查看一下?
    jakezh
        13
    jakezh  
       2019-07-24 22:29:39 +08:00
    如果是 node 版本问题的话 看这里 https://wiki.jenkins.io/display/JENKINS/NodeJS+Plugin

    官方图解

    也可以用自己的 build 命令, 不用 jenkins 自带的 node, 在 build 命令里面用本地 node 的绝对路径
    rbe
        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 文件引入方式上,是不是引入时候需要确认权限之类的
    Sasasu
        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/
    iehp
        16
    iehp  
       2019-07-25 09:57:19 +08:00
    之前遇到过类似一直 loading 的问题是在发布过程中,某些旧的即将被更新的文件正被占用中。killd 掉相应的进程就 OK 了。
    mikuazusa
        17
    mikuazusa  
       2019-07-25 10:20:23 +08:00
    关键还是日志,这种情况,你要进去构建节点容器里面去,单独执行构建命令看前台打印的日志返回信息。
    hell0v2
        18
    hell0v2  
       2019-07-25 11:15:31 +08:00
    看下 jenkinsfile ,不行就去里面打日志调试啊 感觉没那么复杂吧
    version
        19
    version  
       2019-07-25 15:28:21 +08:00 via iPhone
    @jmyz0455 有可能 8 楼所说的是你 npm 安装依赖提示需要确认才能下一步,可以把项目的依赖版本降低些,例如 webpack 那些,因为最近也需要需要确认提示的情况,我是服务器自动部署,不过我是自己写脚本,没用 jenkins
    xwhxbg
        20
    xwhxbg  
       2019-07-25 16:44:57 +08:00
    vue-cli 的问题吧,应该是每次构建的时候用的都是容器里装的那个 vue,可以试试先重装全局的 vue-cli 然后再构建
    defunct9
        21
    defunct9  
       2019-07-26 11:40:51 +08:00
    @jmyz0455 请问楼主问题解决了吗?楼上的各位兄弟的的分析都试过了吗?
    jmyz0455
        22
    jmyz0455  
    OP
       2019-07-26 16:48:36 +08:00
    @defunct9 暂时还没,这几天很忙,我有空了先试试各位的办法,还是不行再打搅您吧,当伸手党有点不太好意思哈哈。
    benbenTW
        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。
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   我们的愿景   ·   实用小工具   ·   5212 人在线   最高记录 6543   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 29ms · UTC 07:21 · PVG 15:21 · LAX 00:21 · JFK 03:21
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.