带有未定义变量的Jenkins管道/Groovy脚本

带有未定义变量的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 &

我正在尝试将我的大型多配置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 < 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编写的,但实际执行的是它的转换(他们使用的术语是“继续传递样式转换”)。例如,一些部件将在主节点上运行,一些部件将在从节点上运行

这涉及到许多超出我想象的魔力,但在我们这个层次上,这意味着我们必须处理我们使用的语法和结构中的约束

见:

要理解管道行为,您必须了解有关其执行方式的几点

  • 除了步骤本身,所有的管道逻辑 Groovy条件、循环等在主机上执行 简单或复杂!甚至在节点块内
  • 在适当的情况下,步骤可以使用执行器来执行工作,但每个步骤也有少量的主开销
  • 管道代码编写为Groovy,但执行 模型在编译时被彻底地转换为Continuation 传球风格(CPS)
  • 这种转换提供了宝贵的安全性 管道的耐久性保证,但它附带 权衡:步骤可以调用Java并快速高效地执行, 但是Groovy的运行速度比普通的慢得多 内存要多得多,因为保留了基于对象的语法/块树 在记忆中
  • 管道经常将程序及其状态保存到 能够经受住主人的失败
  • 另请参见讨论脚本中变量的支持


    编辑:啊,是的,正如评论中所指出的,新的声明性模型允许定义一个带有变量的函数,这些变量将按您需要的方式传递……如果没有JENKINS-41335,我不知道如何在脚本化管道中做到这一点,但现在似乎在声明性领域将发生进一步的演变://

    好问题!可能在这里转储错误消息?Doh!Sor我不想在@KevinBurnett中省略这个问题。我已经更新了这个问题以包含输出。是的。我简化了我的脚本,但错过了那个。它已经被修复了。谢谢@HuguesMoreau。所以我的部分问题是我使用了“脚本化管道”语法而不是新的“声明性管道”语法。如果我能使用后者(特别是在查找文档方面),事情似乎会容易得多,但因为我需要按程序生成阶段列表并并行运行它们,“声明性管道”语法不是一个选项。嗯,也许我把事情弄混了一点?但在所有情况下,我认为你仍然被限制在
    阶段
    步骤中使用什么。也许我需要后退一步,重新思考我正在经历的整个过程。我很难找到将复杂的多配置作业转换为管道的建议。