Jenkins 脚本化管道:包装阶段
我希望能够在Jenkins中包装一个“stage”,这样我就可以在stage的开始和结束时执行自定义代码,比如: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
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个参数;阶段名称及其应运行的闭包。阶段的名称已经打印在日志中,我不知道打印您将要执行的代码会有多大价值,但是如果这是您想要做的事情,请查看
如果您对要包装的内容有更具体的考虑,那么可以向包装器添加更多参数,并通过这些额外参数打印所有需要的信息