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

同一Jenkinsfile阶段:sh检测文件存在,Groovy脚本却检测不到?

问题解答

为啥会出现这种矛盾?核心是执行环境不一样

  • 你用sh步骤创建文件时,这个命令是跑在**Jenkins构建节点(Agent)**的工作目录里,文件实际存在于Agent机器的磁盘上。
  • 但Groovy里的new File()代码,是在**Jenkins主节点(Controller)**的JVM里执行的,它读的是主节点的文件系统,根本找不到Agent上的文件。

所以就出现了:

  • sh命令检测到文件存在(因为在Agent上找),返回true
  • Groovy的file.exists()返回false(因为在主节点找,根本没这个文件)

怎么解决?用Jenkins提供的正确方式操作Agent文件

别用Java的File类,改用这些方法:

1. 用readFile读文件内容(官方推荐)

这是Jenkins专门用来读取Agent工作目录文件的步骤:

script {
    def content = readFile 'test_sec_fail.txt'
    println "文件内容:${content}"
}

2. 用sh命令传递文件状态到Groovy

如果要判断存在性、获取文件属性,都可以通过sh的返回值拿到:

script {
    def isExists = sh(script: 'test -e test_sec_fail.txt && echo "true" || echo "false"', returnStdout: true).trim()
    println "Agent上文件是否存在:${isExists}"
    
    // 举个例子,获取文件大小
    def fileSize = sh(script: 'stat -c %s test_sec_fail.txt', returnStdout: true).trim()
    println "文件大小:${fileSize}字节"
}

3. 用Jenkins内置的fileExists步骤

直接检测Agent工作目录的文件,比自己写sh更简洁:

script {
    def exists = fileExists 'test_sec_fail.txt'
    println "文件是否存在:${exists}"
}

重要提醒

Pipeline里的Groovy代码默认都是在Jenkins主节点跑的,只有sh、readFile、fileExists这类步骤才会派发到Agent执行。所以但凡要操作Agent上的文件,都得用Jenkins提供的Pipeline步骤,别直接用Java的IO类,不然肯定踩坑。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.22 16:14:58