Jenkins Pipeline访问环境变量

Dav*_* W. 29 jenkins jenkins-workflow jenkins-pipeline

我正在尝试在Jenkins中使用DSL管道.我认为如果我可以将项目名称作为我脚本的一部分,那就太好了.

git credentialsId: 'ffffffff-ffff-ffff-ffff-ffffffffffffff',\
url: "${repo_root}/${JOB_NAME}.git"
Run Code Online (Sandbox Code Playgroud)

我收到错误:

groovy.lang.MissingPropertyException: \
No such property: JOB_NAME for class: groovy.lang.Binding
Run Code Online (Sandbox Code Playgroud)

我以为我遵循了这些指示,他们提到JOB_NAME了变量之一.

我决定尝试:

sh 'env'
Run Code Online (Sandbox Code Playgroud)

在我的DSL中,打印出来:

JOB_NAME = foo-bar
Run Code Online (Sandbox Code Playgroud)

这是我所期待的.

一篇博客提到:

使用环境变量
我们有两种方法来获取它们的价值.-D=在启动期间传递的属性我们可以阅读,System.getProperty("key")这要归功于Groovy与Java的强大关系.

用Java方式读取常规环境变量是System.getenv("VARIABLE")......

我们试试这个:

println "JOB_NAME = " + System.getenv('JOB_NAME'); 
Run Code Online (Sandbox Code Playgroud)

现在,我得到:

java.lang.NullPointerException: Cannot get property 'System' on null object
Run Code Online (Sandbox Code Playgroud)

空物体?但是,我可以看到这JOB_NAME是一个环境变量!

如何$JOB_NAME在Pipeline作业中读入DSL脚本.我正在尝试一个管道工作,当我得到它的工作将使这个多分支管道与Jenkinsfile.

Krz*_*soń 59

所有环境变量都可以使用env,例如${env.JOB_NAME}.


Tim*_*ing 13

好吧,今天真的让我烦恼了一会儿.最终,我做了几件事:

  • Groovy中的单引号字符串意味着"不评估变量",就像它在bash中一样
  • 如果你只是引用变量,那么使用$ interpolation是完全没必要的,所以你可以这样做env.JOB_NAME.

这个问题被证明是帮助我破解代码的问题:Jenkins Workflow Checkout访问BRANCH_NAME和GIT_COMMIT

  • 单身和双人报价让我的一天!这实际上解决了我的问题.非常感谢! (9认同)

Pom*_*m12 6

实际上只是${env.JOB_NAME}用来访问一个已知变量。

但是,如果您需要访问由另一个变量指定名称的环境变量(动态访问),只需使用env["your-env-variable"].

我在配置 3 个环境变量(在 中Jenkins -> Administer -> Configure System -> Environment variables)时遇到了问题,让我们将它们命名为ENV_VAR_1, ENV_VAR_2, ENV_VAR_3。现在我想动态访问它们,我可以这样做:

def envVarName = "ENV_VAR_" + count  // Suppose count is initialized in a loop somewhere above...

def value = env[envVarName]  // Will be resolved to env["ENV_VAR_1"] depending on count value
Run Code Online (Sandbox Code Playgroud)

我在 Jenkins 配置中的环境变量如下所示:

在此处输入图片说明

  • 这不起作用,只是测试了它。请提供更多详细信息@Pom12。 (2认同)