gpt4 book ai didi

具有 undefined variable 的 Jenkins 管道/Groovy 脚本

转载 作者:行者123 更新时间:2023-12-02 01:13:32 27 4
gpt4 key购买 nike

我正在尝试将我的大型多配置 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

我的问题是 ${compilers[j]$configs[i] 在我尝试构建一个第 13 行 build_test_configs 的字典。看起来第 8 行的检查工作正常。

更新

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

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

并且 nightly.sh 脚本也传递了 null 参数。

最佳答案

我认为这是预期的行为:Jenkins Pipeline 脚本是用 Groovy 编写的,但实际执行的是 Groovy 的转换(他们使用的术语是“连续传递样式转换”)。例如,有些部分会运行在主节点上,有些会运行在从节点上。

这涉及很多超出我想象的魔法,但在我们的层面上,这意味着我们必须在我们使用的语法和结构中使用约束。

参见 "fundamentals" paragraph of this article :

To understand Pipeline behavior you must understand a few points about how it executes.

  1. 除了步骤本身,所有的流水线逻辑,Groovy 条件、循环等在 master 上执行。无论简单或复杂!甚至在节点 block 内!
  2. 步骤可能会在适当的时候使用执行器来完成工作,但每个步骤也有一个小的 on-master 开销。
  3. 管道代码是用 Groovy 编写的,但是执行模型在编译时彻底转换为 Continuation传球风格 (CPS)。
  4. 这种转变提供了宝贵的安全保障和管道的耐久性保证,但它附带权衡:步骤可以调用 Java 并快速高效地执行,但是 Groovy 的运行速度比正常情况慢得多。 Groovy 逻辑需要更多内存,因为保留了基于对象的语法/ block 树在内存中。
  5. 流水线将程序及其状态频繁保存到能够经受住主人的失败。

另见 JENKINS-41335讨论跨脚本变量的支持。

编辑:啊,是的,正如评论中所指出的,新的声明模型允许定义一个 environment变量将按照您需要的方式传递...不知道如何在没有 JENKINS-41335 的情况下在脚本管道中执行此操作,但似乎在声明性领域现在将发生进一步的演变:/

关于具有 undefined variable 的 Jenkins 管道/Groovy 脚本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43805481/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com