Как создать блок тела для пользовательского шага конвейера Дженкинса в коде Java моего плагина Дженкинса?


Контекст

Я создаю плагин Jenkins, который добавляет пользовательский шаг конвейера.

Я успешно получил Java-код для выполнения, когда Мой Шаг (dostuff) используется в скрипте конвейера, например

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"
    }
  ])
}

И, что важно, будет правильно отображаться в представлении "шаги конвейера" веб-интерфейса Дженкинса, и таким образом параллельные потоки будут правильно отображаться в веб-интерфейсе Blue Ocean.

Пока я видел как выполнить блок тела, который передается на пользовательский шаг, определенный в плагине, из сценария конвейера (например ), я не могу понять идиому для создания блока тела в коде Java.

Я не хочу/не могу сделать это в чистом Groovy, потому что

  1. "реальная" логика, которую я хочу написать, будет зависеть от классов в нескольких не-Jenkins Jar, которые по умолчанию не находятся на пути к классу, из нескольких репозиториев Maven (и поэтому не могут быть imported (хотя они может быть, это @Grab ' d))
  2. "Реальная" логика, которую я хочу написать, будет использовать библиотеки параллелизма, включая Java synchronized, и, насколько я могу судить, сценарии конвейера не поддерживают это. "Реальная" логика, которую я хочу написать, хотела бы поделиться состоянием во всех экземплярах логики в JVM, и, насколько я могу судить, сценарии конвейера не могут взаимодействовать с другими запущенными сценариями конвейера.

Вопрос (ы)

  1. возможно ли / должно ли быть возможно создать блок тела конвейера в Java, и должен ли пользовательский шаг конвейера выполнить этот блок?
  2. есть ли плагины, которые делают это, что я мог бы посмотреть?
1 2

1 ответ:

Я говорил с Эндрю Байером-инженером, работающим над pipeline for CloudBees-на Jenkins World 2017,и он подтвердил, что архитектурно невозможно составить шаг конвейера из других шагов конвейера из чистой Java в плагине Jenkins.