您会看到编译错误,因为您传递给sh 步骤的字符串主体包含 bash 无法识别的部分(这部分:params.each{ k, v -> make ${v} })。
您可以从不同的角度解决此问题:您可以将所有映射条目收集到make ${arg} 命令列表中,并且可以在使用换行符\n 加入所有命令后将其传递给sh 步骤。考虑以下示例:
def before(Map<String, String> map) {
sh(map.collect { k,v -> "make ${v}" }.join("\n"))
}
before([arg1: "foo", arg2: "bar"])
在sh 步骤中执行的代码相当于这样:
sh """
make foo
make bar
"""
更新:在 """ 块内执行多个命令
如果您想在 """ 块中应用前面显示的解决方案,您可以尝试使用类似这样的东西:
def before(Map<String, String> map) {
sh """
# Run any command beforehand
${map.collect { k,v -> "make ${v}" }.join(" && ")}
"""
}
这种方法将允许您在执行一系列命令之前放置任何 bash 命令,例如
make foo && make bar && make 123
您可以使用与&& 不同的连接器(例如,\n,如上例所示)。但是,使用&& 链接命令可能会更好,因为如果其中一个失败,它将阻止下一个命令运行。