Многоветвевая проблема конвейера Jenkins с повторным использованием типа узла после параллельных заданий

Я пытаюсь перенести наш процесс CI с JobDSL на установку многоветвевых конвейеров. В качестве первого шага я решил просто вернуть делегат конвейера к существующим заданиям (передав необходимые параметры). Мой конвейер выглядит следующим образом (псевдокод)

stage('setup')
node('cotroller') {
  ...
}


stage('test') {
  parallel {
    'web' : {build job 'web-test' ..params...},
    'API' : {build job 'api-test' ..params...}
  }
}

stage('build') { 
  parallel {
    'web' : {build job 'web-build' ..params...},
    'API' : {build job 'api-build' ..params...}
  }
}

stage('publish') {
  node('controller'){
    sh './gradlew publishArtifacts'
  }
}

Однако у меня возникают проблемы с последним этапом «публикации». Когда он запускает цель gradle, он правильно повторно использует рабочее пространство на этапе «настройки», но, похоже, выполняется в «долговременной» подпапке из исходной проверки (т.е. прошлое на этапе настройки выполняется в /mnt/jenkins/workspace/<branchname>/<random_hash>/, однако последняя цель gradle выполняется в папке, такой как /mnt/jenkins/workspace/<branchname>/<random_hash>@tmp/durable-<hash>/script.sh) Это приводит к ошибке gradlew not found

Я пытался поиграть с каталогом ('/...'){...}, но, похоже, это не решило проблему... буду очень признателен за любую помощь или руководство!


person KrisM82    schedule 02.10.2016    source источник


Ответы (2)


Сохранение пути установки

Вы можете попробовать сохранить рабочий каталог с этапа setup, например:

stage('setup')
node('cotroller') {
  def setupPath = pwd()
  ...
}


stage('test') {
  parallel {
    'web' : {build job 'web-test' ..params...},
    'API' : {build job 'api-test' ..params...}
  }
}

stage('build') { 
  parallel {
    'web' : {build job 'web-build' ..params...},
    'API' : {build job 'api-build' ..params...}
  }
}

stage('publish') {
  node('controller'){
    dir("${setupPath}") {
      sh './gradlew publishArtifacts'
    }
  }
}

Использование глобальной конфигурации инструмента

Рекомендуемый подход, согласно руководству Jenkins pipeliens. , заключается в настройке пути установки Gradle в Global Tool configuration Jenkin, назовите его как угодно (например, «Gradle»), а затем используйте его в своем конвейере следующим образом:

...

stage('publish') {
  node('controller'){
    def gradleHome = tool 'Gradle'        
    sh "${gradleHome}/bin/gradlew publishArtifacts'
  }
}
person Pom12    schedule 03.10.2016
comment
Поскольку мы используем оболочку gradle, относительные пути должны быть в порядке, поскольку оболочка находится в каталоге rood git checkout. - person KrisM82; 03.10.2016

Groovy синтаксис не работал для меня. Пришлось изменить на:

stage('test') {
    parallel (
        'web' : {build 'web-test' ..params...},
        'API' : {build 'api-test' ..params...}
    )
}
person myborobudur    schedule 15.02.2017