仅在詹金斯出现破损的管道

仅在詹金斯出现破损的管道

我有一个在本地运行良好的脚本。但是当我在詹金斯中运行它时,我得到了Error: writing output failed: Broken pipe

我的问题是如何解决这个问题以在詹金斯中工作?

现在通过上下文来帮助回答这个问题。实际的管道是somevar=$(jq --arg host "${HOSTNAME}" --arg id "${ID}"'.[] | select((.hostname==$host) and (.port==XXXX)).serviceId = $id' <<<"${MYJSON}" | jq -s)

詹金斯版本 2.164.3

詹金斯 bash 版本 4.2

詹金斯操作系统 CentOS 7

本地 bash 版本 5

本地操作系统 Arch 内核版本 5.0

我还成功地在 docker 容器中运行了这个脚本,符合以下规格;

容器操作系统 Ubuntu 18.04

重击 4.4

因此,如果您无法回答我的问题,也许您可​​以解释为什么这可以在其他环境中工作,但不能在 Jenkins 中工作。或者您可以建议解决此问题的方法吗?我目前正在考虑使用trap来获取更多信息?但我不确定我该如何做到这一点。

答案1

找到调用您的脚本的程序将SIGPIPE信号处理程序设置为忽略。 (寻找trap '' PIPE,等等)。信号的“忽略”处理由子进程继承。

在任何类似的管道中,... | head -5管道的左侧SIGPIPE因此干净而安静地退出并退出是绝对正常的。如果它忽略或捕获SIGPIPEwrite()系统调用将返回错误EPIPE,或翻译为“管道损坏”。

许多蹩脚的程序不会检查 a 是否write()成功——这意味着SIGPIPE在调用 setuid 可执行文件时设置为忽略可能是一个攻击媒介。

但情况并非如此jq,它会及时通知您意外情况(这很可能不会使其输出有所不同)。

但我不使用也不喜欢詹金斯,所以我无法进一步帮助你。尽管我非常怀疑这是詹金斯的错。

相关内容