无法在管道阶段定义变量

我正在尝试创建一个声明性 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"
^

我在詹金斯2.7.4和管道2.4上。

283901 次浏览

我认为错误不是来自指定的行,而是来自前3行。试试这个:

node {
stage("first") {
def foo = "foo"
sh "echo ${foo}"
}
}

我认为你有一些额外的行,是无效的..。

从声明式 管道模型文档来看,似乎必须使用 environment声明块来声明变量,例如:

pipeline {
environment {
FOO = "foo"
}


agent none
stages {
stage("first") {
sh "echo ${FOO}"
}
}
}

Jenkins 管道的 Declarative 模型在 stage块 -有关更多信息,请参见语法指南中允许有一个受限制的语法子集。您可以通过将步骤封装在 script { ... }块中来绕过这个限制,但是结果是,您将失去对 script块中的语法、参数等的验证。

同意 @ Pom12@ abayer。要完成的答案,你需要添加脚本块

试试这样:

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"
}
}
}
}

在 Jenkins 2.138.3中有两种不同类型的管道。

声明管道和脚本管道。

”声明性管道是管道 DSL 的一个新扩展(它基本上是一个只有一个步骤的管道脚本,一个带参数的管道步骤(称为指令) ,这些指令应该遵循特定的语法。这种新格式的要点是它更加严格,因此对于那些刚接触管道的人来说应该更加容易,允许图形编辑等等。 脚本管道是高级需求的备用方案。”

Jenkins 管道: 代理 VS 节点?

下面是在声明管道中使用环境和全局变量的示例。据我所知,环境是静止的,在它们被设置之后。

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

您正在使用一个 声明管道,它需要一个 Script-step来执行 Groovy 代码。这是一个巨大的差异相比,在 脚本管道,这是不必要的。

正式文件表示:

脚本步骤获取一个脚本管道块并执行该块 在声明性管道中。

pipeline {
agent none
stages {
stage("first") {
script {
def foo = "foo"
sh "echo ${foo}"
}
}
}
}

您可以定义变量 global,但是在使用此变量时必须在脚本块中写入。

def foo="foo"
pipeline {
agent none
stages {
stage("first") {
script{
sh "echo ${foo}"
}
}
}
}

尝试这个声明性管道,它可以工作

pipeline {
agent any
stages {
stage("first") {
steps{
script {
def foo = "foo"
sh "echo ${foo}"
}
}
}
}
}