我有一个在本地运行良好的脚本。但是当我在詹金斯中运行它时,我得到了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
因此干净而安静地退出并退出是绝对正常的。如果它忽略或捕获SIGPIPE
,write()
系统调用将返回错误EPIPE
,或翻译为“管道损坏”。
许多蹩脚的程序不会检查 a 是否write()
成功——这意味着SIGPIPE
在调用 setuid 可执行文件时设置为忽略可能是一个攻击媒介。
但情况并非如此jq
,它会及时通知您意外情况(这很可能不会使其输出有所不同)。
但我不使用也不喜欢詹金斯,所以我无法进一步帮助你。尽管我非常怀疑这是詹金斯的错。