我使用以下命令,该命令按预期工作
def before(Map<String, String> params) {
sh """
make ${params.get('arg')}
"""
}
现在我需要对其进行一些修改以使用循环运行,并且出现并发症错误
def before(Map<String, String> params) {
sh """
params.each{ k, v -> make ${v} }
"""
}
任何想法如何解决?我尝试添加{
}
失败
答案 0 :(得分:2)
您会看到一个编译错误,因为传递给sh
步骤的字符串的正文包含bash无法识别的部分(此部分:params.each{ k, v -> make ${v} }
)。
您可以从不同的角度解决此问题:您可以将所有映射条目收集到make ${arg}
命令列表中,并在使用换行符{加入所有命令后将其传递到sh
步骤{1}}。考虑以下示例:
\n
在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
"""
块中执行多个命令如果您想应用前面在"""
块中显示的解决方案,则可以尝试使用以下方法:
"""
这种方法将允许您在执行一系列命令之类的命令之前放置任何bash命令
def before(Map<String, String> map) {
sh """
# Run any command beforehand
${map.collect { k,v -> "make ${v}" }.join(" && ")}
"""
}
您可以使用与make foo && make bar && make 123
不同的连接符(例如,像上一个示例中的&&
)。但是,用\n
链接命令可能会更好,因为如果其中一个失败,则会阻止下一个命令运行。