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

是否可以在共享库(Jenkins)的声明性管道中包含调用?

赵雅懿
2023-03-14

正如您所知道的,在Jenkins的共享库中,可以在Jenkinsfile中调用vars文件夹中文件的内容。

例如,在共享库的vars文件夹中,我们可以有一个名为build的文件。groovy在Jenkins文件中,我们可以通过以下方式调用它:

build{parameter1=“some param1”parameter2=“some param2”}

如本节所述。使用groovy文件并使用Jenkins文件中的call()方法调用它们,我没有任何问题。

但是我想定制一个管道,并使其尽可能通用。所以我想调用包含在vars文件夹中但在同一管道中的groovy文件:调用泛型tage.groovy在共享库中包含在相同vars文件夹中的其他文件中。

所以我在vars文件夹中有一个groovy文件:genericStage。groovy我拥有的是:

Pipeline{
 agent{label myNode}

 stages{

  stage("init"){
   //steps

  }

  genericStage{
   parameter1 = "some param"
  }

 }

}

在一般阶段:

def call(Closure body) {
def config = [:]
body.resolveStrategy = Closure.DELEGATE_FIRST
body.delegate = config
body()

stage(config.parameter1){
    steps{
        //steps
    }
}   

}

但是我得到了错误:

Expected a stage @ line 125, column 6.
                genericStage{
    ^

1 error

at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:310)
at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1085)

那么,如何在同一个共享库中调用Jenkins文件呢?

共有1个答案

阎元徽
2023-03-14

在像这样定义DSL风格步骤的共享库方法中,您可以定义一块步骤和脚本,这些步骤和脚本执行一些您需要在作业或整个管道中的作业或阶段之间共享的公共处理。所以你的通用舞台。groovy只能包含“//steps”注释后面的内容,不能包含这样的阶段和步骤定义。我用这里的风格做了很多这种类型的库自定义步骤,但没有尝试在其中定义stage/步骤,效果很好。这里发生的情况是,管道验证/解析器在处理自定义步骤之前就已经无法使用主管道语法,因为您没有将其包装在stage和steps定义中。

如果您阅读了最后的文档链接,其中有一节介绍如何在共享库中定义完整的声明性管道。最后,它说“到目前为止,只有整个管道s可以在共享库中定义。这只能在vars/*.groovy中完成,并且只能在调用方法中完成。在单个构建中只能执行一个声明性管道,如果您尝试执行第二个管道,您的构建将因此失败。”这意味着像您这样的部分管道将无法工作,您应该只有步骤/脚本或完整的管道。

 类似资料:
  • Jenkins共享管道库是否支持文件? 这会引发错误: groovy.lang.缺少属性异常:没有这样的属性:类的结果:groovy.lang.绑定在groovy.lang.Binding.get变量(Binding.java:63)在org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.Sandbox Interceptor.onGetPrope

  • 基本上,我希望我的Jenkins文件看起来像这样: 然后我的共享库(/vars/description ptivePipeline.groovy)会像这样: 我想集中管道配置,这样我就不必担心Jenkinsfile蔓延。声明式管道可以做到这一点吗?

  • 我们试图切换到jenkins管道,但我在groovy/java的低水平阻止了我们建立一个共享库。 这里是我的共享库(位于bitbucket中git repo的{root}/src/com/pipeline.groovy中)我必须承认,我在这里做什么都不知道,因为我不知道包裹的定义 Jenkins的管道看起来 通过所有这些设置,我最终得到了错误: 我怀疑我的漂亮包裹的定义,但我坚持这样做。 非常欢迎

  • 我将我的Jenkins Pipeline存储为Jenkins共享库中的Groovy脚本。我想为不同的工作使用不同的版本。我的共享库脚本称为如下: 我已将sharedLib repo中的不同版本标记为。万一我想用v1。0,我用注释引用了它,如下所示。 在我的工作中,我通过调用groovy脚本访问了共享库,并使用了上面的注释,如图所示: 我运行这项工作时出错了。以下是我看到的错误。 当我使用。我哪里出

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

  • 问题内容: 我正在尝试做这样的事情: 但这给了我这个例外: 是否可以将阶段定义为外部闭包? 问题答案: 您不能在声明式管道之外定义阶段。声明性管道的主要目的是提供经过简化且自以为是的语法,因此您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。 如果您对更灵活的管道实现方式感兴趣,可以选择“ 脚本化管道”方法,该语法在语法方面并不严格-仅受Groovy和CPS执行模块的限制。 您的示例