Jenkins Pipeline中如何获取匹配规则文件的父目录名称
问题根因
findFiles是Pipeline Utility Steps插件提供的内置步骤,返回的文件对象没有公开的directory属性。Groovy在CPS沙箱环境下访问对象不存在的属性时,不会抛出MissingPropertyException,会默认返回false,这就是你日志里输出false的核心原因。
解决方案
以下两种方法都是Pipeline原生兼容写法,不会触发CPS序列化错误,不需要额外安装插件。
方法1:调用文件对象自带的父目录API(推荐)
findFiles返回的每个文件实例都内置了parent属性(对应getParent()方法),可以直接拿到父目录的完整相对路径,如果你只需要父目录本身的名称(而非完整路径),再做简单字符串切割即可:
def coverageReportFiles = findFiles(glob: 'coverage/**/coverage-summary.json') for(file in coverageReportFiles ){ // 获取父目录相对工作区的完整路径 def parentFullPath = file.parent // 提取直接父目录的名称,例如coverage/payment/的直接父目录名是payment def parentDirName = parentFullPath.tokenize('/').last() echo "匹配文件路径:${file.path},对应父目录名:${parentDirName}" }
方法2:通过文件全路径自行拆分(兼容所有插件版本)
如果你使用的Pipeline Utility Steps插件版本过旧,无法正常读取parent属性,可以直接读取文件的path属性拿到完整文件路径,用Groovy原生字符串方法拆分得到父目录:
def coverageReportFiles = findFiles(glob: 'coverage/**/coverage-summary.json') for(file in coverageReportFiles ){ def pathSegments = file.path.tokenize('/') // 路径最后一段是文件名,倒数第二段就是文件的直接父目录名称 def parentDirName = pathSegments[-2] // 拼接得到父目录完整路径 def parentFullPath = pathSegments[0..-2].join('/') echo "匹配文件路径:${file.path},对应父目录名:${parentDirName}" }
避坑提示:不要用
new File(file.path).getParent()这种Java原生File类的写法处理工作区文件,Pipeline的CPS沙箱会对非序列化对象抛出异常,在分布式构建场景下也会拿到错误的节点本地路径。
内容的提问来源于stack exchange,提问作者mindparse
相关产品推荐
相关产品推荐

