Jenkins Pipeline 自定义类 - toString() 方法的处理不一致

Zor*_*rak 5 java groovy jenkins jenkins-pipeline

我有一个 Jenkins Pipeline 脚本,在其中创建了一个自定义类来表示 AWS AMI。此类扩展了 java.lang.Object 并重写了 java.lang.Object.toString()。明显的意图是我可以在创建字符串时直接引用该对象并获得表示该对象的有用字符串。

不幸的是,jenkins-pipeline 并不这么认为。它很高兴直接尊重对 toString() 方法的请求,但如果没有 toString,我的 println/echo 步骤将被悄悄删除或产生不一致的输出。

请参阅下面的代码片段,了解我正在谈论的内容,以及不同的类(例如 Map)如何精确地按预期工作。

此外,该代码在 Jenkins 脚本控制台中完美运行。但是在詹金斯管道工作中,即使禁用了沙盒;它不是。

public class Ami implements Serializable {
  private String nodetype
  private String id
  private String created
  private boolean related
  private boolean rebuild

  Ami(
    String nodetype,
    String id       = 'None',
    String created  = 'None',
    boolean related = false,
    boolean rebuild = false
  ) {
    this.nodetype = nodetype
    this.id       = id
    this.created  = created
    this.related  = related
    this.rebuild  = rebuild
  }

  @Override
  public String toString() {
    this.nodetype + '/' + this.id
  }
}

Ami newami = new Ami('foo')
println("Concat toString: " + newami.toString())
println("Concat normal: " + newami)
println("Templated toString: ${newami.toString()}")
println("Templated normal: ${newami}")

Map testmap = [:]
testmap = [foo: "bar", snizz: 'snooch']
println("Concat toString: " + testmap.toString())
println("Concat normal: " + testmap)
println("Templated toString: ${testmap.toString()}")
println("Templated normal: ${testmap}")
Run Code Online (Sandbox Code Playgroud)

脚本控制台输出(如预期):

Concat toString: foo/None
Concat normal: foo/None
Templated toString: foo/None
Templated normal: foo/None
Concat toString: [foo:bar, snizz:snooch]
Concat normal: [foo:bar, snizz:snooch]
Templated toString: [foo:bar, snizz:snooch]
Templated normal: [foo:bar, snizz:snooch]
Run Code Online (Sandbox Code Playgroud)

Jenkins Pipeline(沙盒已禁用)输出(完全出乎意料):

[Pipeline] echo
Concat toString: foo/None
[Pipeline] echo
foo/None
[Pipeline] echo
Templated toString: foo/None
[Pipeline] echo
Concat toString: [foo:bar, snizz:snooch]
[Pipeline] echo
Concat normal: [foo:bar, snizz:snooch]
[Pipeline] echo
Templated toString: [foo:bar, snizz:snooch]
[Pipeline] echo
Templated normal: [foo:bar, snizz:snooch]
[Pipeline] End of Pipeline
Finished: SUCCESS
Run Code Online (Sandbox Code Playgroud)