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



我正在尝试将我的大型多核心詹金斯(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

我的问题是,当我尝试在第13行上构建build_test_configs字典的部分时,${compilers[j]$configs[i]是不确定的。看来,第8行上的支票工作正常。h3>更新

我本身没有错误消息。该脚本不会产生任何运行时错误。意外的输出是阶段的名称为:

  • 构建测试node001 null null
  • 构建测试node001 null null
  • 构建test node002 null null

nightly.sh脚本也通过null参数。

我认为这是预期的行为:Jenkins Pipeline脚本是用Groovy编写的,但实际执行的是对此的转换(他们使用的术语是"持续通过的样式转换"((。例如,某些部分将在主机上运行,其中一些零件在从属节点上。

这涉及很多魔术,这些魔法超过了我的头顶,但在我们的水平上,这意味着我们必须在语法中处理约束。我们使用的构造。

请参阅本文的"基本原理"段落:

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

  1. 除了步骤本身,所有管道逻辑,在主人上执行凹槽条件,循环等。无论简单或复杂!甚至在节点块内!
  2. 步骤可以使用执行者在适当的情况下进行工作,但是每个步骤也都有一个小型船上的开销。
  3. 管道代码写为groovy,但执行模型在编译时进行了从根本上转换为延续通过样式(CPS(。
  4. 这种转变提供了宝贵的安全性和耐用性可以保证管道,但随之而来权衡:步骤可以调用Java并快速有效地执行,但是Groovy的运行速度要慢得多。Groovy逻辑需要更多的内存,因为保留了基于对象的语法/块树在内存中。
  5. 管道经常将程序及其状态持续存在能够在主人的失败中生存。

还请参见Jenkins-41335讨论脚本上变量的支持。

编辑:啊,是的,正如评论中指出的那样,新的声明模型允许定义一个带有变量的环境,这些变量将通过您需要的方式来通过...不知道在没有jenkins的脚本管道中如何做到这一点-41335,但似乎进一步的演变将在声明的土地上发生:/

最新更新