考虑以下简单的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未被包含在内。
答案 0 :(得分:1)
看起来该属性和其他几个(WORKSPACE
,COOKIE_VAR
,EXECUTOR_NUMBER
和NODE_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))
我看不出为什么这两个没有相同的实现支持,可能是错误或故意的设计决定。