我正在尝试将我的大型多核心詹金斯(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编写的,但实际执行的是对此的转换(他们使用的术语是"持续通过的样式转换"((。例如,某些部分将在主机上运行,其中一些零件在从属节点上。
这涉及很多魔术,这些魔法超过了我的头顶,但在我们的水平上,这意味着我们必须在语法中处理约束。我们使用的构造。
请参阅本文的"基本原理"段落:
要了解管道行为,您必须了解有关其执行方式的几点。
- 除了步骤本身,所有管道逻辑,在主人上执行凹槽条件,循环等。无论简单或复杂!甚至在节点块内!
- 步骤可以使用执行者在适当的情况下进行工作,但是每个步骤也都有一个小型船上的开销。
- 管道代码写为groovy,但执行模型在编译时进行了从根本上转换为延续通过样式(CPS(。
- 这种转变提供了宝贵的安全性和耐用性可以保证管道,但随之而来权衡:步骤可以调用Java并快速有效地执行,但是Groovy的运行速度要慢得多。Groovy逻辑需要更多的内存,因为保留了基于对象的语法/块树在内存中。
- 管道经常将程序及其状态持续存在能够在主人的失败中生存。
还请参见Jenkins-41335讨论脚本上变量的支持。
编辑:啊,是的,正如评论中指出的那样,新的声明模型允许定义一个带有变量的环境,这些变量将通过您需要的方式来通过...不知道在没有jenkins的脚本管道中如何做到这一点-41335,但似乎进一步的演变将在声明的土地上发生:/