Jenkins升级至2.361.2后Ubuntu节点Groovy脚本执行失败求助
Jenkins升级后Ubuntu节点Groovy脚本读取文件失败问题解决
问题场景
Jenkins运行于Windows 2016服务器,部署有Ubuntu 20.04及Windows Server 2019节点,所有实例均使用Java 11。从2.346.2版本升级至2.361.2后,下述Groovy脚本在Ubuntu节点执行失败,但Windows节点可正常运行(Windows脚本使用反斜杠处理文件名)。
原执行脚本
import hudson.model.* import hudson.util.* def build = Thread.currentThread().executable def workspace = build.getWorkspace() println workspace def channel = null if (workspace.isRemote()) { channel = workspace.channel } println channel fp = new hudson.FilePath(channel, build.workspace.toString() + "/Version.h") println fp contents = "" if (fp != null) { contents = fp.readToString() }
错误输出
/home/jenkins/workspace/Build hudson.remoting.Channel@5c9b8918:Dizzy-Linux /home/jenkins/workspace/Version.h FATAL: Input length = 1 Also: hudson.remoting.Channel$CallSiteStackTrace: Remote call to Dizzy-Linux at hudson.remoting.Channel.attachCallSiteStackTrace(Channel.java:1784) at hudson.remoting.UserRequest$ExceptionResponse.retrieve(UserRequest.java:356) at hudson.remoting.Channel.call(Channel.java:1000) at hudson.FilePath.act(FilePath.java:1186) at hudson.FilePath.act(FilePath.java:1175) at hudson.FilePath.readToString(FilePath.java:2369) at hudson.FilePath$readToString$1.call(Unknown Source) at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:47)
已确认文件/home/jenkins/workspace/Build/Version.h实际存在,更新Groovy插件后问题仍未解决。
问题原因
手动拼接路径字符串的方式忽略了Jenkins对远程节点路径的处理逻辑,Jenkins 2.361.2版本升级后,remoting层的路径解析逻辑发生变化,导致手动拼接的路径无法被远程节点正确识别。此外,直接使用build.workspace.toString()拼接路径可能出现路径格式不兼容的问题。
解决方案
使用FilePath类提供的child()方法构建子文件路径,该方法会自动适配节点的路径分隔符,并正确处理远程节点的路径传输逻辑。修改后的脚本如下:
import hudson.model.* import hudson.util.* def build = Thread.currentThread().executable def workspace = build.getWorkspace() println workspace // 使用child方法构建子文件路径,自动适配节点环境 def fp = workspace.child("Version.h") println fp def contents = "" // 增加文件存在性检查,避免无效读取 if (fp != null && fp.exists()) { contents = fp.readToString() }
说明
child()方法是JenkinsFilePath类的标准路径构建方式,能兼容Windows和Linux节点的路径格式- 增加
fp.exists()检查可以提前确认文件状态,减少无意义的异常抛出 - 无需手动处理远程节点的
channel,workspace本身已包含远程节点的连接信息,child()方法会自动复用
内容的提问来源于stack exchange,提问作者M3Driver
相关产品推荐
相关产品推荐

