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
相关产品推荐
相关产品推荐

