Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/jenkins/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jenkins:无法在管道阶段定义变量_Jenkins_Groovy_Jenkins Pipeline - Fatal编程技术网

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

Jenkins:无法在管道阶段定义变量,jenkins,groovy,jenkins-pipeline,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}" } } }

我试图创建一个声明性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。我认为错误不是来自指定的行,而是来自前3行。请尝试以下方法:

node {
   stage("first") {
     def foo = "foo"
     sh "echo ${foo}"
   }
}
我想你有一些多余的行是无效的

在Declarative中,似乎必须使用
环境
声明块来声明变量,例如:

pipeline {
   environment {
     FOO = "foo"
   }

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

Jenkins管道的声明性模型在
阶段
块中有一个有限的语法子集。您可以通过将步骤包装在
脚本{…}
块中来绕过该限制,但结果是,您将丢失
脚本
块中语法、参数等的验证。

同意。要完成回答,您需要添加脚本块

试着这样做:

管道{
任何代理人
环境{
环境名称=“${ENV.BRANCH\u NAME}”
}
// ----------------
舞台{
阶段('生成容器'){
台阶{
echo“构建容器…”
剧本{
如果(环境名称=‘开发’){
环境名称=‘发展’
}else if(环境名称=='release'){
环境名称='生产'
}
}
回音“建筑分行:”+环境分行名称
回显“版本号:”+环境版本号
echo“建筑环境:”+环境名称
echo“立即使用Environment${ENV_NAME}运行您的服务”
}
}
}
}

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

声明性和脚本化管道

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

下面是一个在声明性管道中使用环境变量和全局变量的示例。根据我所知,环境在设置之后是静态的

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
您使用的是需要脚本步骤来执行Groovy代码的。这与不需要的脚本步骤相比有很大的不同

报告说:

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


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

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

请注意,此示例假定已经定义了一个环境变量“environment_NAME”jenkins可访问。脚本块能否更改环境值?是的,您可以在de脚本块内更改环境值。如果我想在脚本块外使用该变量,该怎么办?要在脚本块外使用变量,请选中此复选框,您还可以将环境块添加到阶段中(例如,如果您的变量依赖于前面步骤中完成的某项操作),我从上面的代码中得到以下错误:[Pipeline]管道的开始[Pipeline]readMavenPom[Pipeline]管道结束org.jenkinsci.plugins.workflow.steps.MissingContextVariableException:缺少必需的上下文类hudson.FilePath可能您忘记了在代码中使用提供此功能的步骤,例如:nodeNo,它按原样工作。它是一个声明性管道。代理可以在任何情况下工作node@pitchblack408,你是对的我的管道顶部有[agent none]。不确定您的意思是:环境在设置后是静态的?它们可以在脚本中更改,例如脚本{IMAGE=“newVal}例如,看看图像。它不是可以或应该通过管道更改的变量。我的理解是,在定义为环境的一部分后,它将被视为一个静态值。如何在一个阶段中操作变量?例如,如果我想在
stage(
foo
中指定
“bar”
值,该怎么办首先“
def foo="foo"
pipeline {
agent none
stages {
   stage("first") {
      script{
          sh "echo ${foo}"
      }
    }
  }
}