【问题标题】:Is it possible to include calls in Declarative Pipelines in the shared library (Jenkins)?是否可以在共享库(Jenkins)的声明性管道中包含调用?
【发布时间】:2018-07-03 15:53:31
【问题描述】:

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

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

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

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

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

所以我拥有的是vars 文件夹中的一个 groovy 文件: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 呢?

【问题讨论】:

标签: jenkins groovy shared-libraries jenkins-pipeline


【解决方案1】:

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多