Jenkins中如何将Git差异输出处理为纯净的文件路径数组
问题描述
我使用以下Jenkins流水线代码获取当前提交与master分支间的变更文件列表:
gitOutput = bat script: "git diff-tree -r --no-commit-id --name-only HEAD origin/master", returnStdout: true changedFiles = gitOutput.split("\n") echo changedFiles.toString()
实际输出结果包含了命令行本身和空元素:
[ , D:\home\jenkins\myjob>git diff-tree -r --no-commit-id --name-only HEAD origin/master , Jenkinsfile, MyData/Program.cs]
我期望得到的干净输出是:
[Jenkinsfile, MyData/Program.cs]
尝试给数组调用.trim()方法时,出现了如下错误:
No signature of method: [Ljava.lang.String;.trim() is applicable for argument types: () values: []
不清楚如何移除数组中的命令行内容及空元素,特此求助。
解决方法
问题根源有两个:一是bat命令默认会把执行的命令本身输出到标准输出;二是你错误地给字符串数组调用了仅适用于单个字符串的trim()方法。以下是两种可行的解决方式:
方式一:抑制命令行输出+过滤空元素
给bat命令添加quiet: true参数屏蔽命令行本身的输出,再对结果做整体清理和空元素过滤:
gitOutput = bat script: "git diff-tree -r --no-commit-id --name-only HEAD origin/master", returnStdout: true, quiet: true changedFiles = gitOutput.trim().split("\n").findAll { it.trim() != "" } echo changedFiles.toString()
关键细节:
quiet: true:阻止bat输出执行的命令行,仅返回git命令的有效结果gitOutput.trim():先清理整个输出内容的首尾空白(包括多余换行)findAll { it.trim() != "" }:过滤掉分割后产生的空字符串或仅含空白的无效行
方式二:过滤无效行(无需修改bat参数)
如果不想修改bat的参数,可以直接在分割后过滤掉包含命令行的行和空元素:
gitOutput = bat script: "git diff-tree -r --no-commit-id --name-only HEAD origin/master", returnStdout: true changedFiles = gitOutput.split("\n").findAll { def line = it.trim() line != "" && !line.startsWith("git diff-tree") } echo changedFiles.toString()
这种方式通过判断行内容来排除命令行本身,同时清理空元素,也能得到干净的结果。
内容的提问来源于stack exchange,提问作者DevOps QA
相关产品推荐
相关产品推荐

