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

2023-12-04

我有以下声明性管道,我在其中编写全局build并行矩阵中的变量,write在阶段Build Detection可能是(我不清楚)竞争条件但我不确定。我对以下简单管道有 3 个问题:

  1. 这是正确的吗?Build-Detection使用相同的代理(仅注意Build使用不同的代理),这绝对是一个竞争条件?
  2. 如果我为每条平行线配备一个代理,那么它就不会成为全局竞争条件build每个agent不一样吗?
  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....."
            }
          }
        }
      }
    }
  }
}


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

  2. 与1相同的答案。

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

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

并行矩阵和全局变量没有竞争条件? 的相关文章

随机推荐