并行矩阵和全局变量没有竞争条件?

问题描述 投票:0回答:1

我有以下声明性管道,我在并行矩阵期间写入全局

build
变量,阶段Build Detection中的
write
可能(我不清楚)竞争条件但我不确定。我对以下简单管道有 3 个问题:

  1. 由于
    Build-Detection
    使用相同的代理(仅注意
    Build
    使用不同的代理),这肯定是竞争条件,这是否正确?
  2. 如果我为每条平行线配备一个代理,那么这不会是竞争条件,因为每个代理的全局
    build
    都不同?
  3. 有没有办法在舞台内制作
    build
    的变量副本,使其不再是全局的?
  4. 我们应该如何处理全局变量通信内容(对于
    when
    步骤等)和并行
    matrix
    功能?

Map<String,Boolean> build

pipeline {
  stages {
    stage('Test') {
      failFast false
      matrix {
        axes {
          axis {
            name 'CONTAINER'
            values 'A', 'B'
          }
        }
        stages {
          stage('Build Detection') {
            steps {
              script {
                build[CONTAINER] = CONATAINER == 'A'
                echo "Should Build: ${build[CONTAINER]}"
              }
            }
          }
          stage('Build') {
            agent {
              kubernetes {
                yamlFile '.jenkins/pods/build-kaniko.yaml'
              }
            }
            when {
              beforeAgent true
              expression { return build[CONTAINER] }
            }
            steps {
                echo "BUILDING....."
            }
          }
        }
      }
    }
  }
}

jenkins groovy jenkins-groovy
1个回答
3
投票
  1. 不,它与构建代理无关。执行编译后的 groovy 代码的 JVM 运行在 Jenkins master 上,而不是构建代理上。因此,使用全局变量是由 Jenkins 主 JVM 中运行的每个线程共享的。是否存在可能的竞争条件与使用相同或不同构建代理的阶段无关。

  2. 与1相同的答案。

  3. 是的,只需使用“def”或阶段脚本块中的特定类型定义变量即可。请确保不要引用没有类型的新变量,因为在 Groovy 中这会导致它被全局声明。

  4. 像您一样使用带有特定于每个线程的键的映射对我来说似乎是一个好方法。如果您确实想确保不可能有两个不安全的线程操作同时修改映射,那么请确保使用线程安全映射。您可以打印出映射的类来找出正在实例化的实现。我希望它是像 ConcurrentHashMap 这样的线程安全的东西。

© www.soinside.com 2019 - 2024. All rights reserved.