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

时间:2018-07-03 15:53:32

标签: jenkins groovy shared-libraries jenkins-pipeline

您在Jenkins的shared libraries中知道,可以在Jenkinsfile中调用vars文件夹中文件的内容。

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

build { parameter1 = "some param1" parameter2 = "some param2" }

this section中所述。 在使用groovy文件并在Jenkinsfile中使用call()方法调用它们时,我没有问题。

但是我想自定义管道并使其尽可能通用。 因此,我想调用包含在vars文件夹中但位于同一管道中的常规文件:调用共享库中同一vars文件夹中包含的其他文件中的genericStage.groovy

所以我拥有的是vars文件夹中的一个普通文件:genericStage.groovy 我所拥有的是:

Pipeline{
 agent{label myNode}

 stages{

  stage("init"){
   //steps

  }

  genericStage{
   parameter1 = "some param"
  }

 }

}

在genericStage中:

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)

那么如何在与我们的Jenkinsfile相同的共享库中进行调用?

1 个答案:

答案 0 :(得分:0)

在定义这种DSL样式步骤的共享库方法中,您可以定义一个步骤和脚本块,以执行一些需要在作业之间或作业中的阶段或整个完整管道中共享的一些通用处理。因此,您的genericStage.groovy只能包含“ //步骤”注释之后的内容,而不能包含这样的阶段和步骤定义。我以您在此处使用的样式执行了很多此类库自定义步骤,但没有尝试定义其中的阶段/步骤,因此效果很好。这里发生的事情是管道验证/解析器在处理自定义步骤之前使主要管道语法失败,因为您没有将其包装在阶段和步骤定义中。

如果您阅读文档链接的末尾,则有一节介绍如何在共享库中定义完整的声明性管道。它最后说:“只有整个管道s can be defined in shared libraries as of this time. This can only be done in vars / *。groovy,并且只能在调用方法中进行。在一个构建中只能执行一个声明性管道,如果您尝试执行第二个,则您的结果将导致构建失败。”这表明像您这样的部分管道将无法工作,您应该只有步骤/脚本或完整的管道。