我希望能够在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,它没有metaClass:
groovy.lang.MissingPropertyException: No such property: metaClass for class: groovy.lang.Binding
我仍在学习Groovy和Jenkins Pipeline的工作方式,所以也许我只是缺少一些东西。
答案 0 :(得分:3)
我不熟悉元类的概念,但我认为解决您的问题的简单方法是将包装阶段定义为函数。 这是如何定义此类功能的示例:
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'
}
您将返回null
。
请注意,在我的示例中,我不打印args,因为我理解stage
的方式仅需要2个参数;阶段名称及其应运行的闭包。阶段的名称已经在日志中打印了,我不知道从打印将要执行的代码中可以得到多少价值,但是如果您要这样做,请看一下{ {3}}。
如果您要包装的内容有更具体的情况,可以在包装器中添加更多参数,并通过这些额外的参数打印所需的所有信息。