Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins 脚本化管道:包装阶段_Jenkins_Groovy_Jenkins Pipeline - Fatal编程技术网

Jenkins 脚本化管道:包装阶段

Jenkins 脚本化管道:包装阶段,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我希望能够在Jenkins中包装一个“stage”,这样我就可以在stage的开始和结束时执行自定义代码,比如: myStage('foo') { } 我想我可以通过使用元类来做到这一点: //Wrap stages to automatically trace def originalMethod = this.metaClass.getMetaMethod("stage", null) this.metaClass.mySt

我希望能够在Jenkins中包装一个“stage”,这样我就可以在stage的开始和结束时执行自定义代码,比如:

myStage('foo') {
}
我想我可以通过使用元类来做到这一点:

           //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.lang.MissingPropertyException: No such property: metaClass for class: groovy.lang.Binding
但Groovy脚本本身似乎是一个绑定,它没有元类:

           //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.lang.MissingPropertyException: No such property: metaClass for class: groovy.lang.Binding

我还在学习Groovy和Jenkins管道是如何工作的,所以也许我只是缺少了一些东西。

我不熟悉元类的概念,但我认为解决问题的一个简单方法是将包装阶段定义为函数。 下面是如何定义此类函数的示例:

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的返回值只有在舞台主体实际返回某些内容时才有意义,例如:

如果你要求另一份工作,例如:

wrappedStage('myStage') {
    build job: 'myJob'
}
您将返回org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper,您可以使用它访问运行的作业的信息,如结果、变量等

如果您在控制台上打印某些内容,例如:

wrappedStage('myStage') {
    echo 'hi'
}
你会回来的

注意,在我的示例中,我没有打印args,因为我理解stage的方式,它只需要2个参数;阶段名称及其应运行的闭包。阶段的名称已经打印在日志中,我不知道打印您将要执行的代码会有多大价值,但是如果这是您想要做的事情,请查看

如果您对要包装的内容有更具体的考虑,那么可以向包装器添加更多参数,并通过这些额外参数打印所有需要的信息