我有一个共享库,其中包含在回购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中执行脚本化的管道,我就可以使所有工作都可行,但是我喜欢声明式的“安全性”(在脚本化的内容上似乎还有更多的资源)。
您能看到是什么使我绊倒吗?
答案 0 :(得分:0)
通过插入实际的Jenkinsfile,Jenkins可以帮助我确定问题所在:
agent('docker'){...}
应该是
代理{标签'docker'}