我正在处理以下命令,该命令直接在目标计算机中运行得非常好(它返回
SomePath
中早于 14 天的文件,不包括 SomeFolder
):
find SomePath -mtime +14 -not -path "SomePath/SomeFolder/*" -not -path "SomePath/SomeFolder/" -print
当我尝试在管道内的某些 Jenkins 节点 (
SomeNodeName
) 上运行它时,过滤不起作用(它还返回来自 SomeFolder
的文件)。阶段代码:
steps {
script {
groovy_script = '''#!/bin/bash
println "find SomePath -mtime +14 -not -path \\"SomePath/SomeFolder/*\\" -not -path \\"SomePath/SomeFolder\\" -print".execute().text
'''.trim()
Jenkins.instance.slaves.find { agent ->
agent.name == SomeNodeName
}.with { agent ->
nodeOutput = RemotingDiagnostics.executeGroovy(groovy_script, agent.getChannel())
}
println nodeOutput
}
}
为什么在管道内执行时结果没有被过滤以及应该如何完成?
您绝对应该使用您在其上“执行”的列表,正如有人提到的那样。 另外,您应该显式调用 shell,无论是 powershell 还是 bash 或其他任何命令来显式显示执行发生的位置。 就命令而言:您正在使用 groovy 脚本,因此您应该只放入 groovy 内容并删除不需要的 linux shell 内容,正如其他 stackoverflower 提到的那样。另外,您应该尽可能避免使用撇号(单引号和双引号),以便在阅读时清楚地表明 - 幸运的是,这是 Groovy,因此您可以在此处使用美元斜线字符串(美元斜线信息链接)。
结果可能如下所示:
groovy_script = $/["sh", "-c", "find SomePath -mtime +14 -not -path SomePath/SomeFolder/*"].execute().text/$
最重要的是,我不会像您在这里那样创建如此复杂且容易出错的结构,而是会考虑一些更简单的问题解决方案。