首页 > 解决方案 > 脚本化管道:包装阶段

问题描述

我希望能够在 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 脚本本身是一个绑定,它没有元类:

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

我仍在学习 Groovy 和 Jenkins Pipeline 的工作原理,所以也许我只是遗漏了一些东西。

标签: jenkinsgroovyjenkins-pipeline

解决方案


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

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 个参数;舞台名称和它应该运行的关闭。阶段的名称已经打印在日志中,我不知道打印您将要执行的代码会获得多少价值,但如果这是您想做的事情,请看一下这个.

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


推荐阅读