从 Jenkins 管道执行时,Bash 语句的工作方式不同

问题描述 投票:0回答:1

我正在处理以下命令,该命令直接在目标计算机中运行得非常好(它返回

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
    }
}

为什么在管道内执行时结果没有被过滤以及应该如何完成?

linux bash jenkins groovy pipeline
1个回答
0
投票

您绝对应该使用您在其上“执行”的列表,正如有人提到的那样。 另外,您应该显式调用 shell,无论是 powershell 还是 bash 或其他任何命令来显式显示执行发生的位置。 就命令而言:您正在使用 groovy 脚本,因此您应该只放入 groovy 内容并删除不需要的 linux shell 内容,正如其他 stackoverflower 提到的那样。另外,您应该尽可能避免使用撇号(单引号和双引号),以便在阅读时清楚地表明 - 幸运的是,这是 Groovy,因此您可以在此处使用美元斜线字符串(美元斜线信息链接)。

结果可能如下所示:

groovy_script = $/["sh", "-c", "find SomePath -mtime +14 -not -path SomePath/SomeFolder/*"].execute().text/$

最重要的是,我不会像您在这里那样创建如此复杂且容易出错的结构,而是会考虑一些更简单的问题解决方案。

© www.soinside.com 2019 - 2024. All rights reserved.