【问题标题】:Getting a shell error code from curl in Jenkins while still displaying output in console从 Jenkins 中的 curl 获取 shell 错误代码,同时仍在控制台中显示输出
【发布时间】:2011-09-23 16:21:59
【问题描述】:

我在 Jenkins 中使用了一个 shell 脚本,它在某个时刻使用 curl 将文件上传到服务器。我想看看 curl 产生的任何输出,但还要检查它是否是我期望的输出。如果不是,那么我想将 shell 错误代码设置为 > 0,以便 Jenkins 知道脚本失败。

我首先尝试使用curl -f,但这会导致一旦上传失败,管道就会被切断,并且错误输出永远不会到达客户端。然后我尝试了这样的事情:

curl ...params... | tee /dev/tty | \
  xargs -I{} test "Expected output string" = '{}'

这适用于普通的 SSH shell,但在 Jenkins 控制台输出中我看到:

tee: /dev/tty: No such device or address

我不知道为什么会这样,因为我认为 Jenkins 正在使用普通的 SSH shell 与从站通信。无论如何,整个 xargs + test 的事情让我觉得有点像 hack。

有没有办法在 Jenkins 中完成此操作,以便我可以看到输出并测试它是否与特定字符串匹配?

【问题讨论】:

    标签: bash curl jenkins tee


    【解决方案1】:

    当 Jenkins 通过 SSH 与 slave 通信时,没有分配终端,因此该进程没有/dev/tty 设备。

    也许您可以将其发送至/dev/stderr?它将是交互式会话中的终端和非交互式会话中的一些日志文件。

    【讨论】:

    • 我仍然不明白为什么 /dev/stdout 不起作用,但谢谢,/dev/stderr 工作正常并写入 Jenkins 控制台。
    【解决方案2】:

    您是否考虑过使用 Publish over SSH Plugin 而不是 curl?可能会让你不那么头疼。

    如果您只是将文件从主机复制到从机,还有一个插件可以做到这一点,copy to slave Plugin

    还不能写任何cmets,所以我不得不发布它作为答案。

    【讨论】:

    • 我无法通过 SSH 发布,但如果有办法将其作为 HTTP POST 进行发布,那么这可能是一个有趣的选择。我查看了 Jenkins 插件列表,但没有任何反应。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-04
    • 1970-01-01
    • 2020-11-10
    • 1970-01-01
    • 2014-07-26
    相关资源
    最近更新 更多