2016-04-29 1 views
5

При написании сценариев Jenkins Pipeline безопасно ли доступ к переменным с параллельных шагов? Документация не совсем понятна.С сценариями Jenkins Pipeline безопасно ли доступ к глобальной переменной с параллельного шага?

Например, этот трубопровод код изменяет общий счетчик и очередь из параллельных ветвей:

def donecount = 0; 
def work = [6,5,4,3,2,1,0] 

def branches = [:] 
for (int i = 0; i < 3; i++) { 

    branches["worker-${i}"] = { 

     while (true) { 
      def item = null 
      try { 
       item = work.remove(0) 
      } catch (java.lang.IndexOutOfBoundsException e) { 
       break 
      } 

      echo "Working for ${item} seconds" 
      sleep time:item 
      donecount += 1 
     } 

    } 

} 
branches.failFast = true 
parallel branches 

echo "Completed ${donecount} tasks" 

ответ

2

В текущей реализации, это, вероятно, безопасно, в том, что выполнение трубопровода использует кооперативную многозадачность (иначе известную как «зеленый потоки"). Но я не уверен, что, например, += - это атомная операция в Groovy, которая важна здесь. Лучше играть в нее безопасно и использовать стандартные утилиты для параллельного использования Java: ConcurrentLinkedQueue, AtomicInteger и т. Д.

Смежные вопросы