带有未定义变量的Jenkins Pipeline / Groovy Script

时间:2017-05-05 12:51:52

标签: jenkins groovy jenkins-pipeline

我正在尝试将我的大型多配置Jenkins作业转换为管道语法,因此除其他外,我可以将它分割为多个节点,并将我的多个阶段合并为一个作业。这是我遇到麻烦的部分:

   $meta_tbl = $wpdb->prefix.'postmeta';
   foreach ($_POST['loop'] as $loop_k => $loop_v) {
        $wpdb->update(
            $meta_tbl,
                array( 'meta_value' => $loop_v['price'] ),
                array( 'meta_id' => $loop_v['price_meta_id'] ),
                array( '%d' )
            );
        $wpdb->update(
            $meta_tbl,
                array( 'meta_value' => $loop_v['regular_price'] ),
                array( 'meta_id' => $loop_v['regular_price_meta_id'] ),
                array( '%d' )
            );
        $wpdb->update(
            $meta_tbl,
                array( 'meta_value' => $loop_v['sale_price'] ),
                array( 'meta_id' => $loop_v['sale_price_meta_id'] ),
                array( '%d' )
            );
  }

我的问题是,当我到达第13行的window.interface.GetTile( row , col ,level, function(returnValue) { alert(returnValue); }); 字典时,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 ${compilers[j]未定义。看来,第8行的检查工作正常。

更新

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

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

$configs[i]脚本也会传递build_test_configs个参数。

1 个答案:

答案 0 :(得分:2)

我认为这是预期的行为:Jenkins Pipeline脚本是用Groovy编写的,但实际执行的是对它的转换(他们使用的术语是&#34;继续传递样式转换&#34;)。例如,某些部分将在主服务器上运行,某些部件在从服务器节点上运行。

这涉及到很多魔法,但是在我们的水平上,这意味着我们必须处理语法中的约束。我们使用的构造。

请参阅"fundamentals" paragraph of this article

  

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

  1. 除了步骤本身,所有的管道逻辑, Groovy条件,循环等在主服务器上执行。是否 简单或复杂!甚至在节点块内!
  2. 步骤可以使用执行程序在适当的地方进行工作,但每个步骤也有一个小的主时开销。
  3. 管道代码写为Groovy但执行 模型在编译时从根本上转换为Continuation 传球风格(CPS)。
  4. 这种转变提供了宝贵的安全性 和管道的耐用性保证,但它附带 权衡:步骤可以调用Java并快速有效地执行, 但Groovy比正常运行慢得多。 Groovy逻辑需要 更多的内存,因为保留了基于对象的语法/块树 在记忆中。
  5. 管道持续保存程序及其状态 能够在主人的失败中幸存下来。
  6. 另见JENKINS-41335讨论对脚本中变量的支持。

    编辑:嗯,是的,正如评论中所指出的,新的声明性模型允许定义一个environment变量,这些变量将以您需要的方式传递...不知道该怎么做在没有JENKINS-41335的脚本管道中,但似乎进一步的演变现在将在声明性的土地上发生:/