Как синхронизируются обновления глобальных переменных в конвейере со сценариями Jenkins?
Вот упрощенный код, в котором глобальная переменная в mylist
def mylist = [] // Global Variable
def jobs = [:]
def joblist = [“A”, “B”]
joblist.each {it->
jobs[it] = {
node() {
stage(it) {
// lots of processing ...
mylist.add(it) // Global variable update in jobs running in parallel
}
}
}
}
parallel jobs
Я хочу, чтобы он содержал либо [A, B], либо [B, A], если задания выполнялись успешно.
Вопросы:
Это гарантировано или могут быть проблемы с параллелизмом?
Выполняется ли обновление в мастере сразу или после завершения задания?
Что, если mylist представляет собой сложную структуру данных, в которой разные задания обновляют разные части структуры данных?
def mylist = [].asSynchronized(). Это позволяет синхронизировать вызовыmylist.add()между потоками. Вам не нужна глобальная функция. Также не будет удаленного вызова от агента к мастеру, потому что код конвейера Groovy всегда выполняется на мастере, независимо отnode(), см. эта старая документация: Каждая сборка конвейера запускается на главном сервере с использованием легковесного исполнителя - несчетного слота, который, как предполагается, не требует значительных вычислительных затрат. мощность. - person zett42   schedule 03.03.2020