【发布时间】:2019-05-15 09:50:51
【问题描述】:
我有一个在 Ubuntu 16.04.2 x64 上运行的 jenkins 服务器,但最近在执行 shell 脚本时作业开始随机失败。我可以在服务器上手动执行脚本并且它可以工作,但是当 jenkins 执行时它会因为以下原因而失败:
失败 1
JavaProcess leaked file descriptors. See https://jenkins.io/redirect/troubleshooting/process-leaked-file-descriptors for more information
Build step 'Execute shell' marked build as failure
失败 2
# gradle script that downloads some jars..
Download https://jcenter.bintray.com/org/pegdown/pegdown/1.6.0/pegdown-1.6.0.jar
Build step 'Execute shell' marked build as failure
Skipped archiving because build is not successful
在Fail 2中下载失败并不总是同一个jar。
我已尝试将 jenkins 更新到最新版本 (2.164.2) 但仍然存在同样的问题。
我已经尝试过中提到的解决方案 Process leaked file descriptors error on JENKINS 对于 Fail 1 但没有成功,仍然以同样的方式失败。
更新 1
我已将我的 shell 脚本中的问题定位到这部分:
# Run script in docker container
chmod +x tmp.sh
docker run --entrypoint=/bin/bash -v $(pwd):/src --workdir=/build mydocker/myimage -c "/src/tmp.sh"
rm -f tmp.sh
因此,当 docker 通过 Jenkins “Execute shell”执行我的 tmp.sh 时,它会随机失败。
来自 docker journalctl -u docker.service的日志
May 21 10:33:23 jenkins dockerd[1332]: time="2019-05-21T10:33:23.886024261Z" level=error msg="attach: stdout: write unix /var/run/docker.sock->@: write: broken pipe"
May 21 10:33:25 jenkins dockerd[1332]: time="2019-05-21T10:33:25.186663914Z" level=error msg="attach: stderr: write unix /var/run/docker.sock->@: write: broken pipe"
May 21 10:33:25 jenkins dockerd[1332]: time="2019-05-21T10:33:25.186715731Z" level=error msg="attach failed with error: write unix /var/run/docker.sock->@: write: broken pipe"
来自 docker 容器docker container logs cranky_cori的日志
BUILD SUCCESSFUL
Total time: 38.273 secs
This build could be faster, please consider using the Gradle Daemon: https://docs.gradle.org/2.14/userguide/gradle_daemon.html
结论
到 stdout 和 stderr 的管道损坏,jenkins 将其报告为构建失败,但 docker 容器日志显示 docker 继续执行并成功完成了我的 gradle 脚本。
【问题讨论】:
-
尝试手动运行此命令并检查错误
-
@yarin 正如我在描述中所说的那样 - 我已经尝试手动运行该命令并且它没有失败
-
你尝试过作为 jenkins 用户吗?
-
感谢@yarin,我以 jenkins 用户和 root 身份尝试过 - 手动运行时它仍然有效。
-
@yarin 我已经更新了更多信息,请参阅 update1。您现在知道可能导致问题的原因吗?提前致谢!