我使用背包Pro来拆分单元测试并并行运行它们,最近我注意到,有时它会将相同的节点索引分配给多个节点。
构建脚本如下所示(为简洁而修剪):
def num_nodes = 10;
def nodes = [:]
env.total_nodes = num_nodes
for (i in [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]) {
int index = i
nodes["ci_node_${i}"] = {
node('ec2-slave') {
...
env.new_index = index
stage('Build & run rspec') {
dir("$WORKSPACE") {
sh '''#!/bin/bash
cd $WORKSPACE
export NODE_ENV=production
export KNAPSACK_PRO_CI_NODE_TOTAL=${total_nodes}
export KNAPSACK_PRO_CI_NODE_BUILD_ID=${BUILD_TAG}
export KNAPSACK_PRO_CI_NODE_INDEX=${new_index}
export KNAPSACK_PRO_COMMIT_HASH=${commithash}
export KNAPSACK_PRO_BRANCH=${BRANCH_NAME}
export KNAPSACK_PRO_TEST_FILE_EXCLUDE_PATTERN="spec/smokes/*_spec.rb"
env
...
'''
}
}
}
}
}
try {
parallel nodes // run CI nodes in parallel
} catch (err) {
echo "Build Failed - ${err.getMessage()}"
} finally {
...
}但是,当我对由KNAPSACK_PRO_CI_NODE_INDEX打印的所有env值的日志进行grep时,我有时(但并不总是)看到这样的内容:
KNAPSACK_PRO_CI_NODE_INDEX=0
KNAPSACK_PRO_CI_NODE_INDEX=2
KNAPSACK_PRO_CI_NODE_INDEX=1
KNAPSACK_PRO_CI_NODE_INDEX=5
KNAPSACK_PRO_CI_NODE_INDEX=3
KNAPSACK_PRO_CI_NODE_INDEX=8
KNAPSACK_PRO_CI_NODE_INDEX=6
KNAPSACK_PRO_CI_NODE_INDEX=6
KNAPSACK_PRO_CI_NODE_INDEX=7
KNAPSACK_PRO_CI_NODE_INDEX=9节点4永远不被分配,节点6被分配两次。这是怎么回事?
注意:可怕的硬编码for-循环是试图解决这个问题,这可能与此相关:
发布于 2021-08-20 23:44:01
env.new_index = index
env是一个全局对象,它是主脚本的一部分。env.new_index是一个全局属性。
示例:
node {
env.VAR1 = "value"
}
println(env.VAR1)将打印
[Pipeline] Start of Pipeline
[Pipeline] node
[Pipeline] {
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
value
[Pipeline] End of Pipeline
Finished: SUCCESS如果要在每个节点定义env,那么最好使用withEnv
withEnv(["new_index=$index"]) {
stage('Build & run rspec') {
dir("$WORKSPACE") {
sh '''#!/bin/bash
cd $WORKSPACE
export NODE_ENV=production
export KNAPSACK_PRO_CI_NODE_TOTAL=${total_nodes}
export KNAPSACK_PRO_CI_NODE_BUILD_ID=${BUILD_TAG}
export KNAPSACK_PRO_CI_NODE_INDEX=${new_index}
export KNAPSACK_PRO_COMMIT_HASH=${commithash}
export KNAPSACK_PRO_BRANCH=${BRANCH_NAME}
export KNAPSACK_PRO_TEST_FILE_EXCLUDE_PATTERN="spec/smokes/*_spec.rb"
env
...
'''
}
}
}https://stackoverflow.com/questions/68867772
复制相似问题