Jenkins声明性流水线中如何定义变量

88次阅读
没有评论

问题描述

在Jenkins声明性流水线脚本中定义了一个变量,但在简单变量声明时遇到了问题。以下是他的脚本:

pipeline {
    agent none
    stages {
        stage("first") {
            def foo = "foo" // 失败,显示"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"    ^

解决方案

请注意以下操作注意版本差异及修改前做好备份。

方案1

在Jenkins声明性流水线中,变量必须在script部分中定义。
以下是修改后的脚本:

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

在上面的示例中,我们将变量定义移动到了script部分中。这样就可以成功定义变量并使用它了。

方案2

请注意以下操作注意版本差异及修改前做好备份。
你还可以使用environment块来注入环境变量。
以下是使用environment块定义环境变量的示例:

pipeline {
    agent none
    environment {
        FOO = "bar"
    }
    stages {
        stage("first") {
            steps {
                echo "${env.FOO}"
                // 或者 echo "${FOO}"
            }
        }
    }
}

在上面的示例中,我们使用environment块定义了一个名为FOO的环境变量,并将其值设置为bar。然后,在steps部分中,我们可以使用${env.FOO}${FOO}来引用该环境变量。

你甚至可以在stage块内部定义环境变量,以限制其作用域:

pipeline {
    agent none
    stages {
        stage("first") {
            environment {
                FOO = "bar"
            }
            steps {
                // 输出 "bar"
                echo "${env.FOO}"
                // 或者 echo "${FOO}"
            }
        }
        stage("second") {
            steps {
                // 输出 "null"
                echo "${env.FOO}"
                // 或者 echo "${FOO}",此处流水线将失败
            }
        }
    }
}

在上面的示例中,我们在first阶段的environment块内部定义了一个名为FOO的环境变量,并将其值设置为bar。然后,在first阶段的steps部分中,我们可以使用${env.FOO}${FOO}来引用该环境变量。在second阶段中,我们尝试引用FOO环境变量,但由于其作用域仅限于first阶段,所以输出为null,并且流水线将失败。

请注意,你可以在environment块中使用动态代码来设置环境变量。

以上是在Jenkins声明性流水线中定义变量的两种方法。根据你的需求选择适合的方法即可。

正文完