Скриптовый конвейер: этап обмотки - PullRequest
0 голосов
/ 28 июня 2018

Я бы хотел иметь возможность обернуть «стадию» в Jenkins, чтобы я мог выполнять собственный код в начале и в конце стадии, например что-то вроде:

myStage('foo') {
}

Я думал, что смогу сделать это, используя metaClass:

           //Wrap stages to automatically trace
           def originalMethod = this.metaClass.getMetaMethod("stage", null)
           this.metaClass.myStage = { args ->
                   println "Beginning of stage"
                   println "Args: " + args
                   def result = originalMethod.invoke(delegate, args)
                   println "End of stage"
                   return result
           }

Но, похоже, сам скрипт Groovy является Binding, у которого нет метакласса:

groovy.lang.MissingPropertyException: No such property: metaClass for class: groovy.lang.Binding

Я все еще изучаю, как работают Groovy и Jenkins Pipeline, так что, возможно, я просто что-то упускаю.

1 Ответ

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

Я не знаком с концепцией метакласса, но я думаю, что простое решение вашей проблемы - определить упакованный этап как функцию. Вот пример того, как бы вы определили такую ​​функцию:

def wrappedStage(name, Closure closure) {
    stage(name) {
        echo "Beginning of stage"
        def result = closure.call()
        echo "End of stage"
        return result
    }
}

и вот как вы бы это назвали:

wrappedStage('myStage') {
    echo 'hi'
}

Возвращаемое значение wrappedStage имеет смысл только тогда, когда тело вашей сцены действительно что-то возвращает, например:

  1. Если вы звоните на другую работу, например:

    wrappedStage('myStage') {
        build job: 'myJob'
    }
    

    вы получите обратно org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper, который вы можете использовать для доступа к информации о работе, которую вы выполняете, например, результат, переменные и т. Д.

  2. Если вы печатаете что-то на консоли, например:

    wrappedStage('myStage') {
        echo 'hi'
    }
    

    ты вернешься null.

Обратите внимание, что в моем примере я не печатаю аргументы, потому что, как я понимаю stage, он принимает только 2 аргумента; сценическое имя и закрытие, которое это должно бежать. Название этапа уже будет напечатано в журнале, и я не знаю, какую выгоду вы получите от печати кода, который собираетесь выполнить, но если это то, что вы хотите сделать, посмотрите на это .

Если у вас есть более конкретный пример того, что вы хотите обернуть, вы можете добавить дополнительные параметры в обертку и распечатать всю необходимую информацию через эти дополнительные параметры.

...