Jenkins Slave 问题 - 无效的流标头:099EACED

2024-02-04

Jenkins 2.7.4 安装在 RedHat 服务器中,并且通过选择“通过在主服务器上执行命令来启动代理”选项来配置 Linux 从站。我们创建了一个 Shell 脚本,它在 Jenkins 版本 2.7.4 中运行良好。

现在我们将 Jenkins 升级到 2.121.1。现在相同的脚本会抛出错误

线程“main”中出现异常 java.io.StreamCorruptedException:无效的流标头:099EACED at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808) 在 java.io.ObjectInputStream.(ObjectInputStream.java:301) 处 hudson.remoting.ObjectInputStreamEx。(ObjectInputStreamEx.java:48) 在 hudson.remoting.ChannelBuilder.makeTransport(ChannelBuilder.java:478) 在 hudson.remoting.ChannelBuilder.negotiate(ChannelBuilder.java:433) 在 hudson.remoting.ChannelBuilder.build(ChannelBuilder.java:354) 处 hudson.remoting.Launcher.main(Launcher.java:743) 在 hudson.remoting.Launcher.runWithStdinStdout(Launcher.java:691)在 hudson.remoting.Launcher.run(Launcher.java:373) 在 hudson.remoting.Launcher.main(Launcher.java:283) 错误:连接 终止错误:启动代理时出现意外错误。这是 可能是 Jenkins java.io.IOException 中的错误:意外的 EOF at hudson.remoting.ChunkedInputStream.readUntilBreak(ChunkedInputStream.java:99) 在 hudson.remoting.ChunkedCommandTransport.readBlock(ChunkedCommandTransport.java:39) 在 hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:35) 在 hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:63) 错误:进程终止,退出代码 1 java.io.IOException: 意外的 EOF 位于 hudson.remoting.ChunkedInputStream.readUntilBreak(ChunkedInputStream.java:99) 在 hudson.remoting.ChunkedCommandTransport.readBlock(ChunkedCommandTransport.java:39) 在 hudson.remoting.AbstractSynchronousByteArrayCommandTransport.read(AbstractSynchronousByteArrayCommandTransport.java:35) 在 hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:63) 另外: hudson.remoting.Channel$CallSiteStackTrace:远程调用 rtt-ci-euhrhd0036vdeas 位于 hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1741) 在 hudson.remoting.Request.call(Request.java:202) 处 hudson.remoting.Channel.call(Channel.java:954) 在 hudson.slaves.SlaveComputer.setChannel(SlaveComputer.java:549) 在 hudson.slaves.SlaveComputer.setChannel(SlaveComputer.java:416) 在 hudson.slaves.CommandLauncher.launch(CommandLauncher.java:153) 在 hudson.slaves.SlaveComputer$1.call(SlaveComputer.java:288) 在 jenkins.util.ContextResettingExecutorService$2.call(ContextResettingExecutorService.java:46) 在 jenkins.security.ImpersonatingExecutorService$2.call(ImpersonatingExecutorService.java:71) 在 java.util.concurrent.FutureTask.run(来源未知) java.util.concurrent.ThreadPoolExecutor.runWorker(来源未知)位于 java.util.concurrent.ThreadPoolExecutor$Worker.run(来源未知) 在 java.lang.Thread.run(来源不明) 原因: hudson.remoting.RequestAbortedException 在 hudson.remoting.Request.abort(Request.java:340) 在 hudson.remoting.Channel.terminate(Channel.java:1038) 在 hudson.remoting.SynchronousCommandTransport$ReaderThread.run(SynchronousCommandTransport.java:96)

如果我在管理 Jenkins -> 配置安全性中禁用 SSHD 端口,那么我就可以启动我的从站。但在我的脚本中,我将使用 Jenkins-cli.jar 触发一项作业,将二进制文件从主服务器复制到从服务器。java -jar jenkins-cli.jar -s http://localhost:8080 --ssh -user username -i ~/.ssh/id_rsa build RTT/RTT-CI-Tools/RTT-CI-Tools-Distribute -s -p SLAVE_REGEX=slave name我收到一条消息

"WARNING: No header 'X-SSH-Endpoint' returned by Jenkins" 

并且构建没有被触发。我还尝试在 jenkins-cli.jar 命令中将 -ssh 替换为 -http ,

java -jar jenkins-cli.jar -s http://localhost:8080 -http -auth username:60b3450a883a2519592af84cdcd0d224 build $CI_JOB -s -p SLAVE_REGEX=$SLAVEHOST

它触发了工作。再次无法启动从机,

线程“main”中出现异常 java.io.StreamCorruptedException:无效的流头:099FACED at java.io.ObjectInputStream.readStreamHeader(ObjectInputStream.java:808) 在 java.io.ObjectInputStream.(ObjectInputStream.java:301) 处 hudson.remoting.ObjectInputStreamEx。(ObjectInputStreamEx.java:48) 在 hudson.remoting.ChannelBuilder.makeTransport(ChannelBuilder.java:478) 在 hudson.remoting.ChannelBuilder.negotiate(ChannelBuilder.java:433) 在 hudson.remoting.ChannelBuilder.build(ChannelBuilder.java:354) 处 hudson.remoting.Launcher.main(Launcher.java:743) 在 hudson.remoting.Launcher.runWithStdinStdout(Launcher.java:691)在 hudson.remoting.Launcher.run(Launcher.java:373) 在 hudson.remoting.Launcher.main(Launcher.java:283) 用法:ssh [-1246AaCfgKkMNnqsTtVvXxYy] [-b 绑定地址] [-c 密码规范] [-D [bind_address:]端口] [-e escape_char] [-F 配置文件] [-i 身份文件] [-L [绑定地址:]端口:主机:主机端口] [-l 登录名] [-m mac_spec] [-O ctl_cmd] [-o 选项] [-p 端口] [-R [bind_address:]端口:主机:主机端口] [-S ctl_path] [-W 主机:端口] [-w local_tun[:remote_tun]] [用户@]主机名[命令]错误:启动代理时出现意外错误。这可能是 Jenkins 错误中的一个错误: 连接终止 java.io.IOException:意外的 EOF

如何解决此问题


未改变的标准输入,未改变的标准输出

我相信您的脚本中的某些内容正在篡改标准输入。

你的脚本应该通过完整的、未改变的stdin 流到 Jenkins 代理进程。

通用解决方案

OP 建立 Jenkins 会话的命令与我的不同,但无论如何,您应该将启动脚本分为 3 个主要部分:

Set up:这部分中没有篡改标准输入或标准输出。

建立 Jenkins 会话: java -jar jenkins-cli.jar ...

拆除:这部分中没有篡改标准输入或标准输出。

#!/bin/bash

function set_up {
    # your set-up code here
}

function tear_down {
    # your tear-down code here
}

function main {
    # set-up (no stdin, no stdout)
    set_up "$@" < /dev/null > /dev/null || exit $?
    # establish Jenkins session
    java -jar jenkins-cli.jar -blah -blah -blah
    # tear-down (no stdin, no stdout)
    tear_down "$@" < /dev/null > /dev/null || exit $?
}
main "$@"

但为什么?

启动脚本的工作是在主服务器和构建代理之间建立一个未被篡改的通信通道(通过标准输入和标准输出)。

              +------------+
"Hello Agent" |            |
   _ _    ----+            +----
    v               Hello Agent  ->
          ----+            +----
              |            |
              |            |  "Hello Master"
          ----+            +----   _ _
       <-  Hello Master             v
          ----+            +----
              |            |
              +------------+
                  launch
                  script

如果这个沟通渠道被篡改,Jenkins 将无法工作。

              +------------+
"Hello Agent" |            |
   _ _    ----+            +-----------
    v            Hel PLZ SEND HELP!! t  ->
          ----+            +-----------
              |            |
              |            |  
          ----+            +----   | |
                                    ^
          ----+            +----
              |            |
              +------------+
                  launch
                  script

如果您没有将任何内容通过管道传输到某些 Unix 命令中,某些 Unix 命令可能会“吞掉”启动脚本的标准输入,从而“破坏”通信通道。考虑以下脚本。

#!/bin/bash

function keep_stdin_intact {
    printf 'I do not consume any stdin, ' >&2
    echo 'and I do not alter the original stdout.' >&2
}

function swallow_stdin {
    echo 'I swallow stdin. Did you see any hexdump below?' >&2
    read yn  # read consumed some stdin
}

echo 'yes' | { keep_stdin_intact; cat -; } | xxd
echo 'yes' | { swallow_stdin; cat -; } | xxd

echo "no you can't now :P" | { swallow_stdin < /dev/null; cat -; } | xxd
  • 首先yes被输出并被十六进制转储,因为keep_stdin_intact没有篡改标准输入,在本例中是“yes”流。

  • 第二yes消失了,因为swallow_stdin消耗了它,所以cat没有什么可猫的xdd没有什么可读的。

  • 通过管道/dev/null对于吞咽标准输入的命令,我们保护自己的标准输入。

ssh 是怎么回事?

ssh是吞噬你的标准输入的邪恶命令之一。

假设您之前想要删除构建代理上的一些文件agent.jar正在运行。如果没有样板,您可能会想写:

ssh $OPTIONS "$remote" 'sudo rm -rf /var/log/nginx/*'
ssh $OPTIONS "$remote" 'cd $HOME && java -jar agent.jar'

^ 但这是错误的!首先ssh命令将吞噬您的标准输入,并且 Jenkins 会话将没有任何内容可读取。

首先ssh必须“沉默”。经过/dev/null作为它的标准输入。

ssh $OPTIONS "$remote" 'sudo rm -rf /var/log/nginx/*' < /dev/null
ssh $OPTIONS "$remote" 'cd $HOME && java -jar agent.jar'
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Jenkins Slave 问题 - 无效的流标头:099EACED 的相关文章

  • 怎样才能使 Windows 成为一个开箱即用的 POSIX 兼容操作系统?

    这个问题的动机是我的一个牵强的梦想 即 nix 平台上可用的许多优秀软件可以轻松移植到 Windows 微软最近对开源和开放性采取了不同的方法 所以我真的很想知道如果微软有这样的倾向 这样的事情会有多可行 我很好奇的一些更具体的事情是 是否
  • 如何使用AWK脚本检查表的所有列数据类型? [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 在这里 我正在检查表中第一列的数据类型 但我想知道AWK中表的所有列数据类型 我尝试过 但只能获得一列数据类型 例如 Column 1
  • 如何替换“docker run”命令中的变量值

    我正在使用 bash 脚本并尝试分配指纹值 如下所示 export FINGERPRINT D0 19 C5 80 42 66 56 AC 6F docker run rm i v var run docker sock var run d
  • gentoo crontab:为什么这个简单的 crontab 不起作用?

    我使用 GENTOO 发行版 crontab e 35 12 root php5 home www cron php 当我手动运行时 php5 php5 home www cron php 这有效 它向我发送了一封电子邮件 然后我检查日期
  • 为什么减法返回 - 符号

    我对简单的减法有疑问 但我不明白出了什么问题 我的代码 start date s N cut b1 13 Treatment end date s N cut b1 13 delta expr end start echo delta de
  • 如何在 Xcode 4.2 中创建 Shell 脚本目标?

    我想知道是否有人知道 XCode 4 1 如何创建 shell 脚本 该选项不存在 但在最新版本中可能会被称为其他名称 塔 在导航器中选择您的项目 单击 添加目标 为空目标选择 聚合 添加构建阶段 gt 添加运行脚本 单击构建阶段并编辑运行
  • 如何不断刷新屏幕并实时更新[关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我想在linux上写一个C程序 不断刷新屏幕并实时更新 例如类似于top终端中的命令 谁能指出我正确的方向 为了保持它跨终端类型的可移
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 无需 cron 在后台发送邮件

    我想知道是否有一种方法可以运行 PHP 循环 以便在后台向订阅者发送几百封电子邮件 我的目标是格式化新闻通讯 单击发送 然后关闭浏览器或更改页面 当然 发送电子邮件的实际过程将在后台运行 不会因浏览器关闭而中断 我知道这可以通过 cron
  • 劫持系统调用

    我正在编写一个内核模块 我需要劫持 包装一些系统调用 我正在暴力破解 sys call table 地址 并使用 cr0 来禁用 启用页面保护 到目前为止一切顺利 一旦完成 我将公开整个代码 因此如果有人愿意 我可以更新这个问题 无论如何
  • 如何将 bash 脚本的整个输出保存到文件

    我正在尝试将 bash 脚本的整个输出保存到文件中 我目前在代码开头有一个参数 ip 地址 如下所示 bin bash USAGE Usage 0
  • Jenkins git 插件 - 有时太慢

    以下内容摘自 Jenkins 日志 00 00 03 135 gt git fetch tags progress email protected cdn cgi l email protection some org some repo
  • Linux 桌面快捷方式和安装图标

    我需要添加什么到我的 spec文件来创建桌面快捷方式并在安装过程中为快捷方式分配一个图标 rpm 如果需要脚本 一个示例将非常有帮助 您在 Linux 下使用 desktop 文件作为图标 图标放置的位置取决于您使用的发行版和桌面环境 由于
  • 归档文件系统或格式

    我正在寻找一种文件类型来存储已退役系统的档案 目前 我们主要使用 tar gz 但从 200GB tar gz 存档中查找并提取几个文件是很麻烦的 因为 tar gz 不支持任何类型的随机访问读取规定 在你明白之前 使用 FUSE 安装 t
  • bash 变量中的 Linux 鞭尾/对话框参数错误

    有人可以解释为什么下面的代码不起作用吗 我要疯狂地想找出答案 bin bash TEST M1 1 wire Interface ON echo TEST RESULT dialog title Config Modules State c
  • Apache 反向代理的基本身份验证问题

    我想为在 Ubuntu 服务器 12 04 1 上运行的 Apache 反向代理站点添加基本身份验证 网络应用程序是Jenkins http jenkins ci org运行在 Java EE 容器上 我在中添加了以下配置httpd con
  • 如何在 Jenkins 中安排构建?

    如何安排 Jenkins 构建 使其只能在每天的特定时间进行构建 例如下午 4 点开始 0 16 1 7 我理解为 每个月周一到周日下午 0 分钟 下午 4 点 但是它每分钟都会构建 如果有任何建议 我将不胜感激 谢谢 Update 请阅读
  • arm-linux-gnueabi 编译器选项

    我在用 ARM Linux gnueabi gcc在 Linux 中为 ARM 处理器编译 C 程序 但是 我不确定它编译的默认 ARM 模式是什么 例如 对于 C 代码 test c unsigned int main return 0x
  • GCC 和 ld 找不到导出的符号...但它们在那里

    我有一个 C 库和一个 C 应用程序 尝试使用从该库导出的函数和类 该库构建良好 应用程序可以编译 但无法链接 我得到的错误遵循以下形式 app source file cpp text 0x2fdb 对 lib namespace Get
  • 嵌入式Linux poll()不断返回

    我有一个特别的问题 当我知道没有什么可读时 民意调查不断返回 因此设置如下 我有 2 个文件描述符 它们构成fd设置民意调查监视 一种用于引脚从高到低的变化 GPIO 另一个用于代理输入 代理输入出现问题 处理的顺序是 启动main函数 然

随机推荐