脚本化管道:包装阶段

时间:2018-06-28 07:33:55

标签: jenkins groovy jenkins-pipeline

我希望能够在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的工作方式,所以也许我只是缺少一些东西。

1 个答案:

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

  1. 如果您要转职,例如:

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

    您将返回org.jenkinsci.plugins.workflow.support.steps.build.RunWrapper,可用于访问所运行作业的信息,例如结果,变量等

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

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

    您将返回null

请注意,在我的示例中,我不打印args,因为我理解stage的方式仅需要2个参数;阶段名称及其应运行的闭包。阶段的名称已经在日志中打印了,我不知道从打印将要执行的代码中可以得到多少价值,但是如果您要这样做,请看一下{ {3}}。

如果您要包装的内容有更具体的情况,可以在包装器中添加更多参数,并通过这些额外的参数打印所需的所有信息。