Jenkinsfile中的Jenkins全局环境变量

25

我怎样在Jenkinsfile中调用全局环境变量?
例如,如果我有一个变量 -

 name:credentialsId 
 value:xxxx-xxxx-xxxxx-xxxxxxxxx

我该如何在Groovy脚本中使用它?

我尝试过${credentialsId},但它并没有起作用。 它只会产生错误:

java.lang.NoSuchMethodError: No such DSL method '$' found among steps [ArtifactoryGradleBuild, ........
5个回答

48
在 Jenkinsfile 中,你可以看到 "Working with the Environment",其中提到:

Jenkins Pipeline 内部可访问的所有环境变量列表在 localhost:8080/pipeline-syntax/globals#env 上有记录,

语法为 ${env.xxx},例如:

node {
    echo "Running ${env.BUILD_ID} on ${env.JENKINS_URL}"
}

另请参见 "管理环境"

我如何将全局变量传递到Jenkinsfile中?
当我说全局变量时 - 我的意思是

Jenkins -> Manage Jenkins -> Configure System -> Global properties -> Environment variables

请查看 "设置环境变量"

在Jenkins Pipeline中设置环境变量可以使用withEnv步骤,它允许覆盖给定Pipeline脚本块的指定环境变量,例如:

Jenkinsfile(Pipeline脚本)

node {
    /* .. snip .. */
    withEnv(["NAME=value"]) {
        ... your job
    }
}

如果我需要使用另一个环境变量初始化环境变量,withEnv的语法是什么?
如果您想在Jenkinsfile中使用现有变量引用来初始化环境变量的值,可以使用env对象。以下是一个示例:
node {
    withEnv(["NEW_VAR=${env.OLD_VAR}"]) {
        echo "New variable: ${env.NEW_VAR}"
    }
}

在这个例子中,NEW_VAR 是一个新的环境变量,它的值来自于一个已存在的环境变量 OLD_VAR
然后,echo 步骤会将 NEW_VAR 的值打印到控制台。

如果我需要使用另一个环境变量初始化环境变量,withEnv的语法是什么? - Lonli-Lokli
1
@Lonli-Lokli 我已经编辑了答案以回应您的评论。请让我知道我是否正确解释了它。 - VonC

4
获取所有环境变量值的方式包括 env.VAR、env['VAR']、env.getProperty('VAR')。
目前唯一安全的设置环境变量的方式是使用 withEnv。如果尝试将值分配给 env.VAR,可能在某些情况下无法正常工作,例如并行流水线中(如 JENKINS-59871)。

1
Alexander,感谢你的报告。我一直在尝试调试这个确切的问题。很奇怪自从你提出来以后没有任何关于这个问题的评论。 - Fruch

3

在Groovy范围中引用env时,只需使用env.VARIABLE_NAME,例如将上游作业的BUILD_NUMBER传递到触发的作业:

stage ('Starting job') {
    build job: 'TriggerTest', parameters: [
        [$class: 'StringParameterValue', name: 'upstream_build_number', value: env.BUILD_NUMBER]
    ]
}

3

编写脚本的流程

要读取已知名称的环境变量,请使用env.NAME

要读取直到运行时才知道名称的环境变量,请使用env.getProperty(name)

例如,来自 YAML 配置文件的值表示环境变量名称:

config.yaml(位于工作区中)

myconfig:
  key: JOB_DISPLAY_URL

Jenkinsfile

node {
    println("Running job ${env.JOB_NAME}")
    def config = readYaml(file:'config.yaml')
    def value = env.getProperty(config.myconfig.key)
    println("Value of property ${config.myconfig.key} is ${value}")
}

-3
另一种语法是 $ENV:xxxx。
node {
echo "Running $ENV.BUILD_ID on $ENV.JENKINS_URL" }

这对我有用


它与VonC的建议有些相似。 - dildeepak
这对我有效,所以我建议这种方式,虽然两种方式几乎相同,只是语法上有些差异。 - Ankit Gupta
但是我想在Jenkins中定义自己的全局环境变量,而不是在Jenkinsfile中定义它。 - ezlee
在配置Jenkins时,可以尝试在“全局属性”->“环境变量”中设置。 - Ankit Gupta

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接