groovy 无法在管道阶段定义变量

u4dcyp6a  于 2022-11-01  发布在  其他
关注(0)|答案(7)|浏览(198)

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

我在Jenkins2.7.4和管道2.4上。

t1rydlwq

t1rydlwq1#

Jenkins Pipelines的宣告式模型在stage区块中允许使用受限的语法子集-请参阅语法指南以取得更多信息。您可以将步骤 Package 在script { ... }区块中,以绕过该限制,但结果会遗失script区块中的语法、参数等验证。

doinxwow

doinxwow2#

我认为错误不是来自指定的行,而是来自前3行。请尝试以下方法:

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

我认为您有一些无效的额外行...
从declaractive pipeline model documentation来看,似乎必须使用environment声明块来声明变量,例如:

pipeline {
   environment {
     FOO = "foo"
   }

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

31moq8wy3#

同意@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"
            }
        }
    }
}
db2dz4w8

db2dz4w84#

在Jenkins 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
1aaf6o9v

1aaf6o9v5#

您正在使用需要script-step来执行Groovy代码的声明性管道。这与脚本管道相比是一个巨大的区别,脚本管道不需要。
官方文件如下:
指令码步骤会取得指令码管缐的区块,并在宣告式管缐中执行。

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

4xy9mtcn6#

你可以定义变量global,但是在使用这个变量时必须写入脚本块。

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

trnvg8h37#

试试这个声明性管道,它的工作

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

相关问题