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

Cru*_*mmy 89 groovy jenkins 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}"
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

但是,我收到此错误:

org.codehaus.groovy.control.MultipleCompilationErrorsException: startup failed:
WorkflowScript: 5: Expected a step @ line 5, column 13.
           def foo = "foo"
           ^
Run Code Online (Sandbox Code Playgroud)

我在Jenkins 2.7.4和Pipeline 2.4上.

小智 88

Jenkins管道的声明性模型具有允许在stage块中使用的有限语法子集- 有关详细信息,请参阅语法指南.您可以通过将步骤包装在一个script { ... }块中来绕过该限制,但结果是,您将失去对script块内语法,参数等的验证.

  • 如果我想在脚本块之外使用该变量怎么办? (5认同)
  • 有关在脚本块之外使用变量的信息,请查看以下/sf/ask/3071581341/ (3认同)

Pom*_*m12 51

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

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}
Run Code Online (Sandbox Code Playgroud)

我觉得你有一些额外的行无效......

编辑

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

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}
Run Code Online (Sandbox Code Playgroud)

  • 您还可以将环境块添加到阶段(例如,如果您的变量依赖于先前步骤中完成的某些操作)。 (2认同)

小智 27

同意@ 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"
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 请注意,此示例假定jenkins已经可以访问已定义的环境变量"ENVIRONMENT_NAME". (3认同)

pit*_*408 8

在詹金斯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
Run Code Online (Sandbox Code Playgroud)


归档时间:

查看次数:

156828 次

最近记录:

6 年,3 月 前