3

语境

我正在创建一个添加自定义管道步骤的 Jenkins 插件。

当我的步骤 ( ) 用于管道脚本时,我已成功执行 Java 代码dostuff,例如

脚本1

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

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

脚本2

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

我想把它减少到

脚本3

node {
  dostuff()
}

在哪里dostuff()会做相当于

脚本4

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 中正确呈现。

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

我不想/不能在纯 Groovy 中这样做,因为

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

问题)

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

1 回答 1

0

我在 2017 年 Jenkins World 上与为 CloudBees 开发管道的工程师 Andrew Bayer 进行了交谈,他确认在 Jenkins 插件中从纯 Java 组成其他管道步骤的管道步骤在架构上是不可能的。

于 2017-10-13T20:49:11.510 回答