当前位置: 首页 > 知识库问答 >
问题:

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

鱼旺
2023-03-14

我试图创建一个声明性詹金斯管道脚本,但有简单的变量声明问题。

以下是我的剧本:

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"
           ^

我在詹金斯2.7.4和管道2.4上。

共有3个答案

羊舌和安
2023-03-14

同意@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"
            }
        }
    }
}
隗和裕
2023-03-14

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

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

我想你有一些多余的行是无效的。。。

从Declarative pipeline模型文档来看,似乎必须使用环境声明块来声明变量,例如:

pipeline {
   environment {
     FOO = "foo"
   }

   agent none
   stages {
       stage("first") {
           sh "echo ${FOO}"
       }
   }
}
令狐凌
2023-03-14

Jenkins Pipelines的声明性模型有一个有限的语法子集,它允许在阶段块中使用该语法子集-有关更多信息,请参阅语法指南。通过将步骤包装在脚本{…}中,可以绕过该限制 块,但结果是,脚本块中的语法、参数等将丢失验证。

 类似资料:
  • 问题内容: 我正在尝试创建一个声明性的Jenkins管道脚本,但是简单变量声明存在问题。 这是我的脚本: 但是,我收到此错误: 我正在使用Jenkins 2.7.4和Pipeline 2.4。 问题答案: Jenkins Pipelines的Declarative模型具有受限制的语法子集,该子句允许在块中使用- 有关更多信息,请参见语法指南。您可以通过将步骤包装在一个块中来绕过该限制,但是结果,您

  • 我正在编写一个Groovy脚本,其中包含部署terraform的作业。我正在使用作业DSL并使种子作业由JCasC实现,一切正常。然后我有一个包含作业的Groovy文件的存储库。 如果我将Groovy文件保持为单个作业,它就可以正常工作。 然而,我希望能够构建具有构建阶段的管道。我知道我可以把管道写在詹金斯文件中 我有这个作为开始: 但是,我看到了这个错误: 我已经尝试了各种方法,并阅读了一堆文档

  • 我已经设置了一个Jenkins声明管道作业,它从Git中提取Jenkins文件。我有一个在另一个节点上运行的阶段(由标签选择),但它也试图从Git中检出Jenkinsfile。 我怎样才能阻止这种行为?这个特定的从属服务器位于防火墙的另一端,我只能通过SSH访问它。

  • 问题内容: 我正在尝试做这样的事情: 但这给了我这个例外: 是否可以将阶段定义为外部闭包? 问题答案: 您不能在声明式管道之外定义阶段。声明性管道的主要目的是提供经过简化且自以为是的语法,因此您可以专注于应该做什么(通过使用一些可用的步骤)而不是如何去做。 如果您对更灵活的管道实现方式感兴趣,可以选择“ 脚本化管道”方法,该语法在语法方面并不严格-仅受Groovy和CPS执行模块的限制。 您的示例

  • 我正在尝试创建一个定制的Jenkins管道,它将多个Jenkins作业生成的工件绑定在一起。每个作业都在不同的存储库上运行(基于它们自己的文件)。这些Jenkins文件的阶段完成了创建档案、编译代码等任务。 有人可能会说,我可以使用单个作业中的工件,然后将它们绑定在一起,但问题是这个高级管道将在特定的 ,因此它无法凭空创建存档。 由于我是詹金斯管道公司的新手,您对如何解决这个问题有什么建议吗? 最

  • 我正在使用詹金斯声明管道,不知道是否有任何方法可以定期触发特定阶段。 我的意思是,当我们签出SCM时,管道会触发,但阶段2对我们的一些项目来说太长了。因此,我不想等待这个阶段,我只想每天运行这个阶段,但仍然将这个阶段保存在Jenkins文件中。 有没有办法做到这一点?这样做的最佳方法是什么?