带有未定义变量的Jenkins管道/Groovy脚本
我正在尝试将我的大型多配置Jenkins作业转换为管道语法,以便除其他外,可以将其拆分为多个节点,并将我的多个阶段合并为一个作业。以下是我遇到麻烦的部分:带有未定义变量的Jenkins管道/Groovy脚本,jenkins,groovy,jenkins-pipeline,Jenkins,Groovy,Jenkins Pipeline,我正在尝试将我的大型多配置Jenkins作业转换为管道语法,以便除其他外,可以将其拆分为多个节点,并将我的多个阶段合并为一个作业。以下是我遇到麻烦的部分: def build_test_configs = [:] def compilers = ['gnu', 'icc'] def configs = ['debug', 'default', 'opt'] for (int i = 0; i < configs.size(); i++) { for (int j = 0; j &
def build_test_configs = [:]
def compilers = ['gnu', 'icc']
def configs = ['debug', 'default', 'opt']
for (int i = 0; i < configs.size(); i++) {
for (int j = 0; j < compilers.size(); j++) {
def node_name = ""
if ("${compilers[j]}" == "gnu") {
node_name = "node001"
} else {
node_name = "node002"
}
build_test_configs["${node_name} ${configs[i]}"] = {
node ("${node_name}") {
stage("Build Test ${node_name} ${compilers[j]} ${configs[i]}") {
unstash "${node_name}-tarball"
sh "$HOME/software/jenkins_scripts/nightly.sh ${configs[i]} ${compilers[j]} yes $WORKSPACE"
}
}
}
}
}
parallel build_test_configs
def build\u test\u configs=[:]
def编译器=['gnu','icc']
def configs=['debug','default','opt']
对于(int i=0;i
我的问题是,${compiler[j]
和$configs[i]
在我试图在第13行建立一个build\u test\u configs
字典时没有定义。第8行的检查似乎工作得很好
更新
我本身没有错误消息。脚本不会产生任何运行时错误。意外的输出是阶段的名称为:
- 生成测试节点001 null
- 生成测试节点001 null
- 生成测试节点002 null
而且
nightly.sh
脚本也传递了null
参数。我认为这是预期的行为:Jenkins管道脚本是用Groovy编写的,但实际执行的是它的转换(他们使用的术语是“继续传递样式转换”)。例如,一些部件将在主节点上运行,一些部件将在从节点上运行
这涉及到许多超出我想象的魔力,但在我们这个层次上,这意味着我们必须处理我们使用的语法和结构中的约束
见:
要理解管道行为,您必须了解有关其执行方式的几点
编辑:啊,是的,正如评论中所指出的,新的声明性模型允许定义一个带有变量的函数,这些变量将按您需要的方式传递……如果没有JENKINS-41335,我不知道如何在脚本化管道中做到这一点,但现在似乎在声明性领域将发生进一步的演变://好问题!可能在这里转储错误消息?Doh!Sor我不想在@KevinBurnett中省略这个问题。我已经更新了这个问题以包含输出。是的。我简化了我的脚本,但错过了那个。它已经被修复了。谢谢@HuguesMoreau。所以我的部分问题是我使用了“脚本化管道”语法而不是新的“声明性管道”语法。如果我能使用后者(特别是在查找文档方面),事情似乎会容易得多,但因为我需要按程序生成阶段列表并并行运行它们,“声明性管道”语法不是一个选项。嗯,也许我把事情弄混了一点?但在所有情况下,我认为你仍然被限制在
阶段
步骤中使用什么。也许我需要后退一步,重新思考我正在经历的整个过程。我很难找到将复杂的多配置作业转换为管道的建议。