【发布时间】:2021-06-04 00:03:12
【问题描述】:
我正在尝试了解 Groovy/Jenkinsfiles/声明性语法中围绕变量的规则。
通用 webhook 触发器捕获 HTTP POST 内容并将它们作为变量提供给您的 Jenkinsfile。例如:
pipeline {
agent any
triggers {
GenericTrigger (
genericVariables: [
[ key: "POST_actor_name", value: "\$.actor.name" ]
],
token: "foo"
)
}
stages {
stage( "Set up" ) {
steps {
script {
echo "env var ${env.actor_name}"
echo "global var ${actor_name}"
}
}
}
}
如果 HTTP POST 内容包含一个带有 actor_name 字段值为“foo”的 JSON 对象,则打印如下:
env var foo
global var foo
如果 HTTP POST 内容不包含 JSON 字段 actor_name,则打印出来
env var null
...然后断言/中止并出现No such property 错误。
Jenkins 作业也有一个“这个项目是参数化的”设置,这似乎引入了另一种将变量注入到 Jenkinsfile 中的方法。下面的 Jenkinsfile 打印一个填充的、参数化的构建变量、一个未填充的变量和一个故意不存在的变量:
pipeline {
agent any
stages {
stage( "Set up" ) {
steps {
script {
echo "1 [${env.populated_var}]"
echo "2 [${env.unpopulated_var}]"
echo "3 [${env.dontexist}]"
echo "4 [${params.populated_var}]"
echo "5 [${params.unpopulated_var}]"
echo "6 [${params.dontexist}]"
echo "7 [${populated_var}]"
echo "8 [${unpopulated_var}]"
echo "9 [${dontexist}]"
}
}
}
}
}
结果是:
1 [foo]
2 []
3 [null]
4 [foo]
5 []
6 [null]
7 [foo]
8 []
...然后断言/中止并出现No such property 错误。
我能确定的模式是:
-
env.-scoped 变量如果来自未填充的 HTTP POST 内容,则将为 NULL。 -
env.-scoped 变量如果来自未填充的参数化构建变量,则它们将是空字符串。 -
如果参数化构建变量中不存在
env.-scoped 变量,则该变量将为 NULL。 - 如果引用全局范围的变量来自未填充的 HTTP POST 内容,则会断言它们。
- 如果引用全局范围的变量来自未填充的参数化构建变量,则它们将为空字符串。
-
params.-scoped 变量如果在参数化构建变量中不存在,则它们将为 NULL。 -
params.-scoped 变量如果来自未填充的参数化构建变量,则它们将是空字符串。
我对此有几个问题 - 我相信它们是合理相关的,所以我将它们包括在这篇文章中:
- 当变量为 NULL 且为空字符串时,其背后的基本模式/逻辑是什么?
- 为什么变量在不同的“范围”中可用:
env.、params.和全局,它们之间的关系是什么(为什么它们不总是 1:1)? - 有没有办法让参数化构建中的未填充值成为 Jenkinsfile 中的空值变量而不是空字符串?
上下文:在我的第一个 Jenkinsfile 项目中,我使用了由 HTTP POST 内容填充的变量。通过这个,我将一个值的缺失与相应的.env 变量的空值联系起来。现在,我正在处理来自参数化构建值的变量,当未填充值时,对应的.env 变量不为空——它是一个空字符串。因此,我想了解这些变量何时以及为何为空而不为空背后的模式,以便我可以编写可靠而简单的代码来处理来自 HTTP POST 内容和参数化构建值的值的缺失/未填充。
【问题讨论】:
标签: jenkins groovy jenkins-pipeline jenkins-declarative-pipeline