Jenkins Pipeline 访问环境变量

Jenkins Pipeline accessing environment variables

我正在尝试在 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

我以为我遵循了 these directions,他们提到 JOB_NAME 作为变量之一。

我决定试试:

sh 'env'

在我的 DSL 中,打印出来:

JOB_NAME = foo-bar

这是我所期望的。

另一个blog mentions:

Usage of environment variables
We have two ways to get their value. The properties passed by -D= during the startup we could read as System.getProperty("key") thanks to the Groovy's strong relation with Java.

Reading normal environment variables in Java way is the 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.

的多分支管道

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

确实只是使用${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 配置中的环境变量如下所示:

我遇到了无法正常工作的问题。全局设置的 properties/environment 变量仅在 node 步骤中可用。这是 Pipeline 插件 2.4 版中的一个错误。如果您遇到此问题,请升级到 2.5,您的全局属性将在脚本中的任何位置可用。我已经使用我使用的测试脚本将其发布到 Jenkins wiki here

好吧,这让我今天很烦恼。最终,我被几件事搞定了:

  • Groovy 中的单引号字符串与 bash
  • 中的意思相同 "don't evaluate variables,"
  • 如果您只是引用变量,则完全没有必要使用 $ 插值,因此您可以直接执行 env.JOB_NAME.

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