gpt4 book ai didi

jenkins - 脚本化管道: wrap stage

转载 作者:行者123 更新时间:2023-12-02 20:22:13 25 4
gpt4 key购买 nike

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

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 脚本本身是一个 Binding,它没有元类:

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

我仍在学习 Groovy 和 Jenkins 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 个参数;阶段名称和它应该运行的闭包。阶段的名称已经打印在日志中,我不知道打印要执行的代码会获得多少值(value),但如果这是您想要做的事情,请查看 this .

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

关于jenkins - 脚本化管道: wrap stage,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51077219/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com