#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''')
}
}
}
Я могу видеть содержимое файла.
- Почему он не распознает файл в первом фрагменте, но распознает его во втором?
- Есть ли способ заставить верхний фрагмент работать так, как ожидалось в 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. Это очень полезно. Спасибо за ваш ответ.