Jenkins:无法在管道阶段定义变量

时间:2016-10-03 13:29:21

标签: jenkins groovy jenkins-pipeline

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

6 个答案:

答案 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相比,这是不必要的。

official documentation说:

脚本步骤需要一段脚本管道,并执行该脚本 在声明式管道中。

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