jenkins - 脚本化管道:包装阶段
问题描述
我希望能够在 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 的工作原理,所以也许我只是遗漏了一些东西。
解决方案
我不熟悉元类概念,但我认为解决问题的一个简单方法是将包装阶段定义为函数。这是一个如何定义此类函数的示例:
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 个参数;舞台名称和它应该运行的关闭。阶段的名称已经打印在日志中,我不知道打印您将要执行的代码会获得多少价值,但如果这是您想做的事情,请看一下这个.
如果您对要包装的内容有更具体的想法,您可以向包装器添加更多参数,并通过这些额外参数打印您想要的所有信息。
推荐阅读
- php - php pdo 执行失败并出现执行错误
- javascript - 如何在Javascript中添加前面带0的数字?
- python - 在 Gurobi Python 中向目标函数添加多个二次项
- excel - 根据一系列条件删除行(复数)
- laravel - Travis CI:从 PHPUnit 和 Laravel Dusk 拆分构建
- ionic-framework - 来自特定页面的 Ionic 4 导航
- jquery - 从 ID 表单获取输入值
- r - 为时间戳绘制带有 x 轴偏移量的条形图
- c++ - 为什么只包含简单单例类的程序不适合我的 STM32F030 的闪存?
- python - 在现有图像上使用有界矩形绘制轮廓