我有一段代码可以在我所知道的所有常规解释器(包括Jenkins脚本控制台)中完美运行。但是,对于管道脚本,它的行为很奇怪。
def kvs = ['key1': 'value1', 'key2': 'value2']
println kvs
println kvs.inject(''){ s,k,v -> s+= "{'$k': '$v' } "}
首先,地图的打印方式不同:
[key1:value1, key2:value2]
{key1=value1, key2=value2}
那么,更多的问题是,得出的结果大不相同:
{'key1': 'value1' } {'key2': 'value2' }
null
这两个结果都是通过以下常规版本获得的:2.4.12
。
(不过,在管道脚本之外,我还尝试了2.4.6
和2.4.15
版本,并始终获得了预期的结果)
请注意,我对变通办法不感兴趣。我只想了解为什么行为从普通的常规更改为管道脚本。
答案 0 :(得分:1)
之所以发生这种情况,是因为Jenkins管道代码实际上并没有直接直接运行此Groovy代码,而是通过解析器对其进行解释,以应用脚本安全性来确保Jenkins系统的安全。引用“管道代码被编写为Groovy,但是执行模型在编译时已从根本上转换为Continuation Passing Style(CPS)。” -查看最佳做法https://jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/。简而言之,不要在管道中编写复杂的Groovy代码-尝试使用管道DSL或插件提供的标准步骤。但是,在某些情况下,脚本部分中的简单Groovy代码可能很有用。如今,我将一些更复杂的内容放入提供自定义步骤的插件中。