【问题标题】:Why does this groovy code work differently in jenkins pipeline script为什么这个 groovy 代码在詹金斯管道脚本中的工作方式不同
【发布时间】:2019-05-03 09:06:27
【问题描述】:

我有一段代码在我所知道的所有 groovy 解释器中都能完美运行,包括 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

这两个结果都是使用以下 groovy 版本获得的:2.4.12。 (虽然,在管道脚本之外,我也尝试了2.4.62.4.15 版本,并且总是得到预期的结果)

请注意,我对解决方法不感兴趣。我只想了解为什么行为会从普通的 groovy 变为管道脚本。

【问题讨论】:

    标签: jenkins groovy pipeline


    【解决方案1】:

    发生这种情况是因为 Jenkins 管道代码实际上并未直接运行此 Groovy 代码,而是使用解析器对其进行解释,以应用脚本安全性以保持 Jenkins 系统的安全。引用“管道代码是用 Groovy 编写的,但执行模型在编译时被彻底转换为持续传递样式 (CPS)。” - 参见最佳实践https://jenkins.io/blog/2017/02/01/pipeline-scalability-best-practice/。简而言之,不要在管道中编写复杂的 Groovy 代码 - 尝试使用管道 DSL 或插件提供的标准步骤。然而,脚本部分中的简单 Groovy 代码在某些情况下可能很有用。现在,我将一些更复杂的东西放在提供自定义步骤的插件中。

    【讨论】:

    • 我想可能是这样。我还是很惊讶。无论如何,非常感谢!
    • 是的,它抓住了我很多次!
    猜你喜欢
    • 1970-01-01
    • 2019-01-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多