我正在尝试创建一个声明性的Jenkins管道脚本,但是遇到了简单变量声明的问题。
这是我的剧本:
pipeline {
agent none
stages {
stage("first") {
def foo = "foo" // fails with "WorkflowScript: 5: Expected a step @ line 5, column 13."
sh "echo ${foo}"
}
}
}
然而,我收到此错误:
org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
def foo = "foo"
^
我正在使用Jenkins 2.7.4和Pipeline 2.4。
答案 0 :(得分:73)
Jenkins管道的声明式模型具有允许在stage
块中使用的语法的有限子集 - see the syntax guide for more info。您可以通过将步骤包含在script { ... }
块中来绕过该限制,但结果是,您将失去script
块中语法,参数等的验证。
答案 1 :(得分:41)
我认为错误不是来自指定的行,而是来自前3行。试试这个:
node {
stage("first") {
def foo = "foo"
sh "echo ${foo}"
}
}
我认为你有一些无效的额外行......
编辑
从声明pipeline model documentation开始,您似乎必须使用environment
声明块来声明您的变量,例如:
pipeline {
environment {
FOO = "foo"
}
agent none
stages {
stage("first") {
sh "echo ${FOO}"
}
}
}
答案 2 :(得分:17)
同意@ Pom12,@ yoger。要完成答案,您需要添加脚本块
尝试这样的事情:
pipeline {
agent any
environment {
ENV_NAME = "${env.BRANCH_NAME}"
}
// ----------------
stages {
stage('Build Container') {
steps {
echo 'Building Container..'
script {
if (ENVIRONMENT_NAME == 'development') {
ENV_NAME = 'Development'
} else if (ENVIRONMENT_NAME == 'release') {
ENV_NAME = 'Production'
}
}
echo 'Building Branch: ' + env.BRANCH_NAME
echo 'Build Number: ' + env.BUILD_NUMBER
echo 'Building Environment: ' + ENV_NAME
echo "Running your service with environemnt ${ENV_NAME} now"
}
}
}
}
答案 3 :(得分:3)
在詹金斯2.138.3中,有两种不同类型的管道。
声明性和脚本化管道。
“声明性管道是管道DSL的新扩展(基本上是只有一步的管道脚本,带有参数的管道步骤(称为指令),这些指令应遵循特定的语法。这种新格式的要点在于它更加严格,因此对于管道新手来说应该更容易,允许进行图形编辑等等。 脚本化管道是高级需求的后备。”
jenkins pipeline: agent vs node?
这里是在声明性管道中使用环境和全局变量的示例。据我所知,环境在设置之后是静态的。
def browser = 'Unknown'
pipeline {
agent any
environment {
//Use Pipeline Utility Steps plugin to read information from pom.xml into env variables
IMAGE = readMavenPom().getArtifactId()
VERSION = readMavenPom().getVersion()
}
stages {
stage('Example') {
steps {
script {
browser = sh(returnStdout: true, script: 'echo Chrome')
}
}
}
stage('SNAPSHOT') {
when {
expression {
return !env.JOB_NAME.equals("PROD") && !env.VERSION.contains("RELEASE")
}
}
steps {
echo "SNAPSHOT"
echo "${browser}"
}
}
stage('RELEASE') {
when {
expression {
return !env.JOB_NAME.equals("TEST") && !env.VERSION.contains("RELEASE")
}
}
steps {
echo "RELEASE"
echo "${browser}"
}
}
}//end of stages
}//end of pipeline
答案 4 :(得分:2)
您可以定义变量 global ,但使用该变量时必须写在脚本块中。
def foo="foo"
pipeline {
agent none
stages {
stage("first") {
script{
sh "echo ${foo}"
}
}
}
}
答案 5 :(得分:0)
您使用的Declarative Pipeline需要执行脚本步骤才能执行Groovy代码。与Scripted Pipeline相比,这是不必要的。
脚本步骤需要一段脚本管道,并执行该脚本 在声明式管道中。
pipeline {
agent none
stages {
stage("first") {
script {
def foo = "foo"
sh "echo ${foo}"
}
}
}
}