我有以下声明性管道,我在并行矩阵期间写入全局
build
变量,阶段Build Detection
中的write可能(我不清楚)竞争条件但我不确定。我对以下简单管道有 3 个问题:
Build-Detection
使用相同的代理(仅注意Build
使用不同的代理),这肯定是竞争条件,这是否正确?build
都不同?build
的变量副本,使其不再是全局的?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....."
}
}
}
}
}
}
}
不,它与构建代理无关。执行编译后的 groovy 代码的 JVM 运行在 Jenkins master 上,而不是构建代理上。因此,使用全局变量是由 Jenkins 主 JVM 中运行的每个线程共享的。是否存在可能的竞争条件与使用相同或不同构建代理的阶段无关。
与1相同的答案。
是的,只需使用“def”或阶段脚本块中的特定类型定义变量即可。请确保不要引用没有类型的新变量,因为在 Groovy 中这会导致它被全局声明。
像您一样使用带有特定于每个线程的键的映射对我来说似乎是一个好方法。如果您确实想确保不可能有两个不安全的线程操作同时修改映射,那么请确保使用线程安全映射。您可以打印出映射的类来找出正在实例化的实现。我希望它是像 ConcurrentHashMap 这样的线程安全的东西。