Запуск чистого заводного кода за один шаг внутри файла Jenkins

#jenkins #groovy #jenkins-pipeline

#дженкинс #groovy #дженкинс-конвейер

Вопрос:

В моем конвейере есть следующие этапы test.groocy :

 stages {
  stage('Test') {
    steps {
       env.SOME_VAR = new File("settings.gradle")
         .readLines()
         .findAll { someLogic }
         .collect { it =~ /.*'(.*)'/ }
       echo "got: ${SOME_VAR}"
    }
  }
}
  

Но я получаю:

 java.io.FileNotFoundException: settings.gradle (No such file or directory)
  

Если я изменю код на:

 stages {
  stage('Test') {
    steps {
       sh(returnStdout: true,
       script: '''#!/bin/bash
                  cat settings.gradle''')
    }
  }
}
  

Я могу видеть содержимое файла.

  1. Почему он не распознает файл в первом фрагменте, но распознает его во втором?
  2. Есть ли способ заставить верхний фрагмент работать так, как ожидалось в Jenkins?

Комментарии:

1. Первое предположение было бы связано с тем, что File класс корректно работает только для путей в Jenkins master, а не для агентов сборки. Находится ли этот файл на главном сервере?

Ответ №1:

sh , как и другие шаги Дженкинса, запускается в текущем каталоге рабочей области.

Итак, вы можете заменить родную java / groovy new File на Jenkins readFile , и остальная часть вашего кода должна работать.

 readFile("settings.gradle").readLines()...
  

Или укажите полный путь для new File

 new File("${WORKSPACE}/settings.gradle").readLines()...
  

Комментарии:

1. Спасибо, это сделало это.

2. groovy (на самом деле java) работает в глобальной среде агента jenkins. и я считаю, что текущим каталогом для jenkins будет jenkins/bin (или что-то вроде этого). вы можете проверить это с помощью: println( new File(".").getAbsolutePath() ) . для всех заданий значение будет одинаковым.

3. Это очень полезно. Спасибо за ваш ответ.