为什么Jenkins管道中有特殊的环境变量(例如NODE_NAME)?

时间:2018-03-19 16:53:05

标签: jenkins jenkins-pipeline

考虑以下简单的Jenkins管道:

node( label: 'myNodeName' ) {
  println env.NODE_NAME // successfully prints the node name
  env.getEnvironment().each{k,v ->
    println "${k}:${v}" // results do not include NODE_NAME!
  }
}

如果env.NODE_NAME的结果中未显示NODE_NAME变量,为什么env.getEnvironment()语句有效?这是某种特殊属性,还是我做错了什么?如果它很特殊,我在哪里可以得到这些非环境变量的列表?

我正在尝试将我的环境转储出来用于日志记录,我很惊讶发现NODE_NAME未被包含在内。

1 个答案:

答案 0 :(得分:1)

看起来该属性和其他几个(WORKSPACECOOKIE_VAREXECUTOR_NUMBERNODE_LABELS)被特别处理(look at this code)。我猜这里的原因是,这些只是在node步骤中填充(与所有其他变量不同)。

现在,这并不能解释为什么变量在env.getEnvironment()中不可用。但是,在快速查看the implementation之后,很清楚为什么the implementation of getEnvironment()仅查看执行和用户设置环境,而env.getProperty()(在执行属性查找时使用,例如: env.NODE_NAME)查看其他几个环境集:

EnvironmentExpander.getEffectiveEnvironment(getEnvironment(), t.getContextVariable(EnvVars.class), t.getContextVariable(EnvironmentExpander.class))

我看不出为什么这两个没有相同的实现支持,可能是错误或故意的设计决定。