Jenkins:无法在管道阶段定义变量
我试图创建一个声明性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}" } } }
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}"
}
}
}
}