groovy Jenkins Pipeline访问环境变量

a5g8bdjr  于 2023-03-11  发布在  Jenkins
关注(0)|答案(4)|浏览(309)

我正尝试在Jenkins中使用DSL管道。我想如果我可以使用项目名称作为脚本的一部分,那会很好。

git credentialsId: 'ffffffff-ffff-ffff-ffff-ffffffffffffff',\
url: "${repo_root}/${JOB_NAME}.git"

我得到错误:

groovy.lang.MissingPropertyException: \
No such property: JOB_NAME for class: groovy.lang.Binding

我以为我遵循了这些方向,他们提到JOB_NAME是变量之一。
我决定试试:

sh 'env'

在我的DSL中,打印出来:

JOB_NAME = foo-bar

这正是我所期待的。
另一个blog mentions

环境变量的用法

我们有两种方法来获取它们的值:由于Groovy与Java的紧密联系,-D=在启动时传递的属性可以读作System.getProperty("key")
以Java方式阅读常规环境变量是System.getenv("VARIABLE")...
我们试试看:

println "JOB_NAME = " + System.getenv('JOB_NAME');

现在,我得到:

java.lang.NullPointerException: Cannot get property 'System' on null object

空对象?但是,我可以看到JOB_NAME是一个环境变量!
如何在管道作业中将$JOB_NAME读入DSL脚本。我正在尝试管道作业,当我开始工作时,将使其成为具有Jenkinsfile的多分支管道。

nom7f22z

nom7f22z1#

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

6vl6ewon

6vl6ewon2#

好吧,今天这真的让我烦恼了一段时间。最终,我被几件事搞砸了:

  • Groovy中的单引号字符串表示“不对变量求值”,就像它在bash中一样
  • 如果你只是引用变量,那么使用$ interpolation是完全不必要的,所以你可以只使用env.JOB_NAME

这个问题证明是一个帮助我破解代码:Jenkins Workflow Checkout Accessing BRANCH_NAME and GIT_COMMIT

ujv3wf0j

ujv3wf0j3#

实际上,只需使用${env.JOB_NAME}来访问一个已知变量。
但是,如果您需要访问由另一个变量提供名称的环境变量(动态访问),只需使用env["your-env-variable"]
我在配置3个环境变量时遇到了问题(在Jenkins -> Administer -> Configure System -> Environment variables中),让我们将它们命名为ENV_VAR_1ENV_VAR_2ENV_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

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

vpfxa7rd

vpfxa7rd4#

我遇到了一个问题。全局设置的属性/环境变量只在node步骤中可用。这是Pipeline插件2.4版本中的一个bug。如果你遇到这个问题,请升级到2.5版本,你的全局属性将在脚本中的任何地方可用。我已经将这个问题与我使用的测试脚本一起发布到Jenkins wiki。

相关问题