2016-10-11 3 views
0

Мой трубопровод Дженкинс выглядит примерно так (пожалуйста, прости небольшие ошибки синтаксиса):Установка в-узла переменной среды в работе трубопровода

def buildsToDo = "foo bar".tokenize() 
def buildPlan = [:] 

for (int i = 0; i < buildsToDo.size(); i ++) { 
    def tag = buildsToDo[i] 

    buildPlan[tag] = { 
    node(tag) { 
     env.ENVVAR = tag 
     stage("build " + tag) { 
     sh 'env' 
     } 
    } 
    } 
} 

parallel(buildPlan) 

Мое намерение состоит в том, чтобы иметь один узел с ENVVAR=foo и один с ENVVAR=bar.

На самом деле я вижу, что при выполнении команды env на обоих узлах устанавливается ENVVAR=bar.

В соответствии с this tutorial, свойства [специальной переменной env] являются переменными среды на текущем узле. " Поэтому я ожидаю, что это сработает.

ответ

1

Намного позже в учебнике, он говорит:

Не используйте окр в этом случае:

env.PATH = "${mvnHome}/bin:${env.PATH}"

потому, что переменная окружения переопределяет ограничиваются быть глобальными для запуска трубопровода , а не локально для текущей нити (и, следовательно, агента). Однако вы можете использовать шаг withEnv, как указано выше.

Похоже, уродливое ограничение DSL. Он работает, завершая сцену на этапе withEnv.

+0

'env' глобален для сборки, так что, когда вы пишете' env.ENVVAR = tag' доступ одинакового значения из двух параллельных потоков расстрелов. – izzekil

0

Плагин Jenkins pipline - это вы и далеко не стабильный на данный момент (как я могу сказать). Концепция CPS, которую они пытаются применить, влияет на исполнение во многих отношениях, я мог бы выйти из этого момента до сих пор (хотя это действительно замечательно в то же время, действительно)

Возможно, вы захотите попробовать настроить код как указано ниже, выполнение требуемых команд в пределах 'withEnv'. Перемещение летучих переменные из параллельного блока помогает, а также:

def buildsToDo = "foo bar".tokenize() 
def buildPlan = [:] 

for (int i = 0; i < buildsToDo.size(); i ++) { 
    def tag = buildsToDo[i] 
    buildPlan[tag] = { 
    node(tag) { 
     // Note environment is modified here ! 
     withEnv(env + [ENVVAR=tag]) { 
      stage("build " + tag) { 
      sh 'env' 
      } 
     } 
    } 
    } 
} 

parallel(buildPlan) 
Смежные вопросы