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

Jenkins Pipeline文件参数仅返回文件名,如何保存至工作区?

Jenkins Pipeline File参数:文件存工作区方案及readFile原理

不依赖插件,把上传文件存到工作区的方法

Jenkins原生的File参数上传的文件不会直接放到流水线工作区,而是存在Jenkins节点的临时目录里。要把它复制到工作区,有两种实用方法:

方法1:用shell/batch命令复制

根据节点操作系统选对应的复制命令,跨平台兼容的写法如下:

pipeline {
    agent any
    parameters {
        file(name:'FILE', description: '上传Excel文件')
    }

    stages {
        stage('保存文件到工作区') {
            steps {
                script {
                    // 先验证文件能被读取
                    def content = readFile(FILE)
                    echo "文件大小:${content.length()}字节"
                    
                    // 复制到工作区
                    if (isUnix()) {
                        sh "cp \"${FILE}\" \"${env.WORKSPACE}\""
                    } else {
                        bat "copy \"${FILE}\" \"${env.WORKSPACE}\""
                    }
                    
                    // 检查工作区是否存在目标文件
                    def targetPath = "${env.WORKSPACE}/${FILE}"
                    if (fileExists(targetPath)) {
                        echo "文件已保存到:${targetPath}"
                    } else {
                        echo "文件保存失败"
                    }
                }
            }
        }
    }
}

方法2:用Jenkins内置copyFile步骤

如果想更简洁的跨平台操作,用Jenkins自带的copyFile步骤:

pipeline {
    agent any
    parameters {
        file(name:'FILE', description: '上传Excel文件')
    }

    stages {
        stage('保存文件到工作区') {
            steps {
                script {
                    def targetPath = "${env.WORKSPACE}/${FILE}"
                    copyFile(source: FILE, target: targetPath)
                    
                    if (fileExists(targetPath)) {
                        echo "文件已成功保存到工作区:${targetPath}"
                    }
                }
            }
        }
    }
}

为什么readFile能读取到文件?

Jenkins处理File参数时,会把上传的文件存在节点的临时工作目录(不是流水线的主工作区)。而Jenkins的内置步骤(比如readFile、fileExists)在处理文件名参数时,会自动搜索两个路径:

  • 当前流水线的工作区
  • File参数对应的临时存储目录

所以直接写readFile(FILE)时,Jenkins会先查工作区,找不到就去临时目录找,自然能读到。但你手动拼接工作区路径时,只会去主工作区找,肯定找不到。

另外,params.FILE为null是因为原生File参数的变量不会被加入params对象,只能直接用变量名(比如FILE)获取文件名。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.26 09:42:53