无需插件在Jenkins的fileExists()函数中处理通配符的方法
解决Jenkins声明式流水线中带动态时间戳的文件存在性检查问题
由于fileExists步骤不支持通配符匹配,且你无法使用额外插件,以下两种原生方案可以解决动态文件名的存在性检查需求,同时修正你原代码中逻辑颠倒的问题(原代码是文件存在则中止,实际需求是文件不存在则中止):
方案一:使用Shell命令匹配文件
通过Shell的通配符查找匹配的文件,判断是否存在:
stage('Check if file exists') { steps { script { // 定义带通配符的文件路径,*匹配任意时间戳部分 def targetPattern = './path/to/file/name_*.tar.gz' // 执行shell命令,获取第一个匹配的文件名(无匹配则输出为空) def matchedFile = sh( script: "ls -1 ${targetPattern} | head -1", returnStdout: true ).trim() if (matchedFile.isEmpty()) { currentBuild.result = "ABORTED" error('Could not find file matching pattern name_*.tar.gz!') } else { echo "Successfully found target file: ${matchedFile}" } } } }
说明:
ls -1 ${targetPattern}列出所有匹配的文件,head -1只取第一个结果(只要存在至少一个符合的文件即可)- 通过
trim()去除输出中的换行和空格,若结果为空则判定无匹配文件,中止当前阶段
方案二:使用Groovy原生文件查找
纯Groovy实现,无需依赖Shell环境:
stage('Check if file exists') { steps { script { def workspacePath = pwd() // 获取Jenkins工作空间的绝对路径 def targetDir = new File("${workspacePath}/path/to/file") // 用正则表达式匹配文件名:name_后跟数字时间戳,后缀为.tar.gz def matchingFiles = targetDir.listFiles({ file -> file.name ==~ /name_\d+\.tar\.gz/ } as FilenameFilter) if (!matchingFiles || matchingFiles.length == 0) { currentBuild.result = "ABORTED" error('Could not find file with timestamp pattern!') } else { echo "Found ${matchingFiles.length} matching files. First file: ${matchingFiles[0].name}" } } } }
说明:
- 利用Groovy的
File类遍历目标目录,通过正则表达式name_\d+\.tar\.gz精准匹配带数字时间戳的文件名 - 若返回的匹配文件数组为空,则判定无目标文件,触发中止逻辑
内容的提问来源于stack exchange,提问作者schande
相关产品推荐
相关产品推荐

