如何在我的 Jenkins 插件的 Java 代码中为自定义 Jenkins 管道步骤创建主体块?

How do I create a Body block for a custom Jenkins Pipeline Step in the Java code of my Jenkins plugin?

上下文

我正在创建一个 adds a custom pipeline step.

的 Jenkins 插件

当我的步骤 (dostuff) 在管道脚本中使用时,我已成功获得要执行的 Java 代码,例如

script1

node {
  stage( 'doingstuff' ) {
    dostuff()
  }
}

但是,我希望我的自定义步骤在 Jenkins WebUI 可视化中呈现一些 阶段 并行流 ,所以我想在我的插件中做相当于 parallel([...])stage( ... ) { ... } 甚至 node { ... } 块的事情。例如,如果以下是我的预期管道:

script2

node {
  stage( 'one' ) {
    parallel([
      "stream one": {
        sh "echo hi from stream one"
      },
      "stream two": {
        sh "echo hi from stream two"
      }
    ])
  }
}

我想减少到

script3

node {
  dostuff()
}

其中 dostuff() 相当于

script4

stage( 'one' ) {
  parallel([
    "stream one": {
      sh "echo hi from stream one"
    },
    "stream two": {
      sh "echo hi from stream two"
    }
  ])
}

并且,重要的是,将在 Jenkins WebUI 的 "Pipeline Steps" 视图中正确呈现,这样并行流将在 Blue Ocean Web UI 中正确呈现。

虽然我已经看到如何从管道脚本 (for example) 执行传递给插件中定义的自定义步骤的正文块,但我无法弄清楚 在 Java 代码中创建 主体块。

我不希望 to/cannot 纯 Groovy 这样做,因为

  1. 我想写的 "real" 逻辑将依赖于 类 在几个默认情况下不在类路径上的非 Jenkins JAR,来自几个 Maven 存储库(因此不能 imported(尽管他们可能 @Grab'd))
  2. 我想写的 "real" 逻辑将使用并发库,包括 Java 的 synchronized,据我所知管道脚本不支持这个。
  3. 我想编写的 "real" 逻辑希望在 JVM 中的所有逻辑实例之间共享状态,据我所知,管道脚本无法与其他 运行 管道通信脚本。

问题

  1. it/should是否可以在 Java 中创建管道主体块,并让自定义管道步骤执行该块?
  2. 有没有我可以查看的执行此操作的插件?

我在 Jenkins World 2017 上与 Andrew Bayer(为 CloudBees 管道工作的工程师)交谈,他确认在 Jenkins 插件中从纯 Java 组成其他管道步骤的管道步骤在架构上是不可能的-英寸