首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么这个Jenkins构建脚本两次分配相同的节点ID?

为什么这个Jenkins构建脚本两次分配相同的节点ID?
EN

Stack Overflow用户
提问于 2021-08-20 20:30:40
回答 1查看 51关注 0票数 0

我使用背包Pro来拆分单元测试并并行运行它们,最近我注意到,有时它会将相同的节点索引分配给多个节点。

构建脚本如下所示(为简洁而修剪):

代码语言:javascript
运行
复制
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时,我有时(但并不总是)看到这样的内容:

代码语言:javascript
运行
复制
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-循环是试图解决这个问题,这可能与此相关:

EN

Stack Overflow用户

回答已采纳

发布于 2021-08-20 23:44:01

env.new_index = index

env是一个全局对象,它是主脚本的一部分。env.new_index是一个全局属性。

示例:

代码语言:javascript
运行
复制
node {
    env.VAR1 = "value"
}

println(env.VAR1)

将打印

代码语言:javascript
运行
复制
[Pipeline] Start of Pipeline
[Pipeline] node
[Pipeline] {
[Pipeline] }
[Pipeline] // node
[Pipeline] echo
value
[Pipeline] End of Pipeline
Finished: SUCCESS

如果要在每个节点定义env,那么最好使用withEnv

代码语言:javascript
运行
复制
            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
                            ...
                        '''
                    }
                }
            }
票数 1
EN
查看全部 1 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68867772

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档