Могу ли я использовать Closure, чтобы определить этап в декларативном конвейере Jenkins? - PullRequest
0 голосов
/ 01 июня 2018

Я пытаюсь сделать что-то вроде этого:

def makeStage = {
  stage('a') {
    steps {
      echo 'Hello World'
    }
  }
} 
pipeline {
  agent none
  stages {
    makeStage()
  }
}

Но это дает мне исключение:

WorkflowScript: 11: Expected a stage @ line 11, column 5.
   makeStage()
   ^

Можно ли определить этап как внешнее закрытие иесли так - как?

Ответы [ 2 ]

0 голосов
/ 11 апреля 2019

Очень поздно, но в случае, если кто-то столкнется с этой проблемой, возможное решение будет заключаться в том, чтобы обернуть ваш сгенерированный этап вокруг декларативного сценария и вызвать .call на сгенерированном этапе.

Так что для вас:

def makeStage = {
  return {
    stage('a') {
      echo 'Hello World'
    }
  }
}

pipeline {
  agent none
  stages {
    stage ('hello world') {
      steps {
        script {
          makeStage().call()
        }      
      }
    }
  }
}

Упс.отредактированный, у меня были "шаги" внутри на моей стадии ('a') в декларации makeStage.«steps» - это декларативная конвейерная директива, поэтому она выдает ошибку внутри блока скрипта.

0 голосов
/ 01 июня 2018

Нельзя определить этапы вне декларативного конвейера.Основная цель декларативного конвейера - предоставить упрощенный и продуманный синтаксис, чтобы вы могли сосредоточиться на том, что нужно сделать (используя некоторые из доступных шагов ), а не на том, как это сделать.

Если вас интересует более гибкий способ реализации конвейера, вы можете выбрать Scripted Pipeline подход, который не настолько строг, если говорить о синтаксисе - он ограничен только Groovy и CPS-модулем исполнения.

Рабочий (скриптовый) конвейер из вашего примера будет выглядеть следующим образом:

#!groovy

def makeStage = {
  stage('a') {
    echo 'Hello World'
  }
} 

node {
    makeStage()
}

Внимание : в скриптовом конвейере нет метода steps внутри stage,Если вы оставите его там, вы получите

java.lang.NoSuchMethodError: No such DSL method 'steps' found among 
    steps [archive, bat, build, catchError, checkout, deleteDir, dir, 
    dockerFingerprintFrom, ...

Сценарии в декларативном конвейере

Декларативный конвейер определяет script шаг , который позволяет вам поставитьблок скриптового конвейера.Однако это все еще не позволяет вам определять этап динамически и / или извлекать определение этапа в функцию или замыкание.script шаг выполняется внутри сцены, поэтому вы не можете контролировать внутри этого блока, если этап выполнен или нет.Однако в некоторых случаях этот шаг может быть очень полезен, если вы хотите сделать что-то более сложное, чем просто вызов предварительно определенного шага декларативного конвейера.

...