npm install 在 jenkins 构建作业上总是失败(错误代码 EPIPE)

npm install alway failed on jenkins build job (error code EPIPE)

很奇怪,因为它只是工作了很长时间,但是现在当我触发构建作业时,它总是失败。但是当我通过 ssh 连接到 jenkins 主机并通过命令行构建时,它可以正常工作

我的詹金斯配置:

cd pic-frontend
npm install --verbose
npm run build-staging

npm install

失败

这是詹金斯日志:

Started by user root
Rebuilds build #155
Running as SYSTEM
[EnvInject] - Loading node environment variables.
Building on master in workspace /var/lib/jenkins/workspace/PIC-Staging-Deployment
using credential aaa
 > /usr/bin/git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > /usr/bin/git config remote.origin.url git@gitlab.com:epic4/pic-backend.git # timeout=10
Fetching upstream changes from git@gitlab.com:epic4/pic-backend.git
 > /usr/bin/git --version # timeout=10
using GIT_SSH to set credentials aaa
 > /usr/bin/git fetch --tags --progress -- git@gitlab.com:epic4/pic-backend.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > /usr/bin/git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > /usr/bin/git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision ef4181ffa267fa10e8ca074a81048bb1ac18e0f6 (refs/remotes/origin/master)
 > /usr/bin/git config core.sparsecheckout # timeout=10
 > /usr/bin/git checkout -f ef4181ffa267fa10e8ca074a81048bb1ac18e0f6 # timeout=10
Commit message: "Merge branch 'busy-time' into 'master'"
 > /usr/bin/git rev-list --no-walk ef4181ffa267fa10e8ca074a81048bb1ac18e0f6 # timeout=10
using credential aaa
 > /usr/bin/git rev-parse --is-inside-work-tree # timeout=10
Fetching changes from the remote Git repository
 > /usr/bin/git config remote.origin.url git@gitlab.com:epic4/pic-frontend.git # timeout=10
Fetching upstream changes from git@gitlab.com:epic4/pic-frontend.git
 > /usr/bin/git --version # timeout=10
using GIT_SSH to set credentials aaa
 > /usr/bin/git fetch --tags --progress -- git@gitlab.com:epic4/pic-frontend.git +refs/heads/*:refs/remotes/origin/* # timeout=10
 > /usr/bin/git rev-parse refs/remotes/origin/master^{commit} # timeout=10
 > /usr/bin/git rev-parse refs/remotes/origin/origin/master^{commit} # timeout=10
Checking out Revision 28f5e1eaa374f407738e7aaf8254e9a22bcd1627 (refs/remotes/origin/master)
 > /usr/bin/git config core.sparsecheckout # timeout=10
 > /usr/bin/git checkout -f 28f5e1eaa374f407738e7aaf8254e9a22bcd1627 # timeout=10
Commit message: "Merge branch 'Ql-dao-tao' into 'master'"
 > /usr/bin/git rev-list --no-walk 28f5e1eaa374f407738e7aaf8254e9a22bcd1627 # timeout=10
[PIC-Staging-Deployment] $ /bin/sh -xe /tmp/jenkins7625098248618834599.sh
+ cd pic-frontend
+ npm install --verbose
npmBuild step 'Execute shell' marked build as failure
Finished: FAILURE

和 npm 日志:

0 info it worked if it ends with ok
1 verbose cli [ '/usr/bin/node', '/usr/bin/npm', 'install', '--verbose' ]
2 info using npm@6.14.13
3 info using node@v14.17.0
4 verbose npm-session 34549561e0a4df44
5 silly install runPreinstallTopLevelLifecycles
6 verbose stack Error: write EPIPE
6 verbose stack     at afterWriteDispatched (internal/stream_base_commons.js:156:25)
6 verbose stack     at writeGeneric (internal/stream_base_commons.js:147:3)
6 verbose stack     at Socket._writeGeneric (net.js:785:11)
6 verbose stack     at Socket._write (net.js:797:8)
6 verbose stack     at writeOrBuffer (internal/streams/writable.js:358:12)
6 verbose stack     at Socket.Writable.write (internal/streams/writable.js:303:10)
6 verbose stack     at EventEmitter.log.write (/usr/lib/node_modules/npm/node_modules/npmlog/log.js:271:10)
6 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npmlog/log.js:235:12)
6 verbose stack     at Array.forEach (<anonymous>)
6 verbose stack     at EventEmitter.log.emitLog (/usr/lib/node_modules/npm/node_modules/npmlog/log.js:232:28)
6 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npmlog/log.js:214:8)
6 verbose stack     at EventEmitter.<anonymous> (/usr/lib/node_modules/npm/node_modules/npmlog/log.js:286:23)
6 verbose stack     at Object.<anonymous> (/usr/lib/node_modules/npm/lib/config/figgy-config.js:13:5)
6 verbose stack     at Module._compile (internal/modules/cjs/loader.js:1068:30)
6 verbose stack     at Object.Module._extensions..js (internal/modules/cjs/loader.js:1097:10)
6 verbose stack     at Module.load (internal/modules/cjs/loader.js:933:32)
7 verbose cwd /var/lib/jenkins/workspace/PIC-Staging-Deployment/pic-frontend
8 verbose Linux 3.10.0-957.21.3.el7.x86_64
9 verbose argv "/usr/bin/node" "/usr/bin/npm" "install" "--verbose"
10 verbose node v14.17.0
11 verbose npm  v6.14.13
12 error code EPIPE
13 error syscall write
14 error errno -32
15 error write EPIPE
16 verbose exit [ -32, true ]

很难提供一个答案,所以这里有几种可能的解决方案。请按照下一个顺序测试每一个,并评论什么对你有用。

  1. CI npm 安装
    cd pic-frontend
    npm ci
    npm run build-staging
    
  2. 添加权限标志(ref
    cd pic-frontend
    npm install --unsafe-perm=true --allow-root --verbose
    npm run build-staging
    

如果问题仍然重现,请提供下一个信息:

  • 你在 Jenkins 上有什么节点和 npm 版本?请通过两种方式检查:运行 CI 和通过 ssh 连接。
  • 你在 Jenkins 上为 node_modules 使用缓存吗?