You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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()方法是Jenkins FilePath类的标准路径构建方式,能兼容Windows和Linux节点的路径格式
  • 增加fp.exists()检查可以提前确认文件状态,减少无意义的异常抛出
  • 无需手动处理远程节点的channel,workspace本身已包含远程节点的连接信息,child()方法会自动复用

内容的提问来源于stack exchange,提问作者M3Driver

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.16 20:05:33