当前位置: 首页 > 知识库问答 >
问题:

脚本化管道:换行阶段

元修然
2023-03-14

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

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

我还在学习Groovy和Jenkins管道是如何工作的,所以也许我只是错过了一些东西。

共有1个答案

艾善
2023-03-14

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

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个参数;阶段名称及其应运行的闭包。阶段的名称已经打印在日志中,我不知道打印您将要执行的代码会有多大价值,但是如果这是您想要做的事情,请看一下这个。

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

 类似资料:
  • 问题内容: 我正在尝试在Jenkins脚本化管道中运行条件步骤,但是我不确定如何仅在上一步成功的情况下运行步骤。例如,在以下情况中,如果“测试”阶段成功,我只想运行“推送工件”阶段: 我知道声明性管道允许您使用“后”条件,但是我对Jenkins中的声明性管道与脚本化管道的理解是,脚本化管道提供了更大的灵活性。有没有一种方法可以基于脚本管道中其他阶段的成功来运行阶段? 问题答案: 在詹金斯管道中没有

  • 问题内容: 我们正在使用 Script Pipeline 语法,其中定义了很多阶段来构建和部署代码。我们有一个用例,如果我要执行 完整构建,则要 运行所有阶段,但是如果需要执行一些AWS路由,则只运行一个特定阶段。我知道我可以使用跳过阶段或运行阶段。问题是我不想将这个条件应用于我的每个阶段。 在新的 声明性管道 语法中,使用该选项很容易实现。我们的基础架构中使用了许多自定义的Groovy帮助器函数

  • 问题内容: 我正在尝试将旧样式的基于项目的工作流转换为基于Jenkins的管道。在浏览文档时,我发现有两种不同的语法分别命名为和。例如最近(2016年底)发布的Jenkins网络语法。尽管有一个新的语法版本,Jenkins仍然也支持脚本语法。 现在,我不确定这两种类型的哪种情况最合适。语法将很快被弃用吗?詹金斯管道的未来会是这样吗? 任何可以分享有关这两种语法类型的想法的人。 问题答案: 最初创建

  • 我们有一个Jenkins脚本管道,包含6个阶段。我需要在每个阶段结束时调用RESTAPI,将阶段的状态推送到Cassandra DB。在詹金斯管道中有没有一种有效的方法? 目前,我正在每个阶段结束时调用一个状态为的函数。我必须在所有阶段编写这段代码,即使阶段成功或失败。

  • 问题内容: 我有一个jenkins管道,该管道可以构建Java工件,将其复制到目录中,然后尝试执行外部脚本。 我在管道脚本中使用此语法来执行外部脚本 该脚本只是一个简单的Docker构建脚本,但是由于以下异常,构建将失败: 由于脚本不会创建任何目录,因此该错误令人困惑。它只是构建一个docker映像,并将新构建的java工件放置在该映像中。 如果我在jenkins中创建另一个作业,该作业执行外部脚

  • 问题内容: 我想在脚本化管道中使用选项。 可能吗 ? 问题答案: 您可以从这里尝试答案