为什么该声明式管道在我的共享库中失败?

时间:2019-04-17 13:34:08

标签: jenkins jenkins-pipeline

我有一个共享库,其中包含在回购Jenkinsfile中使用的声明性管道(实际上是通过中间层调用的):Jenkinsfile-> bupJavadocApiPipeline.groovy-> bupMavenPipeline.groovy

Jenkinsfile(共享库是隐式的):

bupJavadocApiPipeline {}

bupJavadocApiPipeline.groovy:

def call(body, Map defaults = [:]) {
    if (defaults.mavenGoals == null) defaults.mavenGoals = 'javadoc:javadoc package'
    bupMavenPipeline(body,defaults)
}

bupMavenPipeline.groovy(bupParameters执行DELEGATE_FIRST技巧):

def call(body, defaults = [:]) {

if (defaults.maven == null) defaults.maven='MVN3'
if (defaults.mavenGoals == null) defaults.mavenGoals='package'
if (defaults.jdk == null) defaults.jdk='JDK8'
if (defaults.buildsToKeep == null) defaults.buildsToKeep='10'

def parameters = bupParameters(body,defaults)

pipeline {
    options {
        timestamps()
        buildDiscarder(logRotator(numToKeepStr: "${parameters.buildsToKeep}"))
    }
    agent ('docker') {
    tools {
        maven "${parameters.maven}"
        jdk "${parameters.maven}"
    }
    stages {    
        stage ('Build') {
            steps {
                sh "mvn -Dmaven.test.failure.ignore=true clean ${parameters.mavenGoals}"
            }
            post {
                success {
                    junit '**/target/surefire-report/**/*.xml'                  
                }
            }
        }
    }
    }
}

}       

此操作失败,并显示以下信息:

[Pipeline] Start of Pipeline
[Pipeline] End of Pipeline
java.lang.NoSuchMethodError: No such DSL method 'options' found among steps [...

版本是Jenkins 2.162和Pipeline 2.6,但是许多Web资源都说自2017年9月以来就支持该功能! 如果仅在bupMavenPipeline.groovy中执行脚本化的管道,我就可以使所有工作都可行,但是我喜欢声明式的“安全性”(在脚本化的内容上似乎还有更多的资源)。

您能看到是什么使我绊倒吗?

1 个答案:

答案 0 :(得分:0)

通过插入实际的Jenkinsfile,Jenkins可以帮助我确定问题所在:

agent('docker'){...}

应该是

代理{标签'docker'}