У меня есть проект, в котором есть несколько конвейеров сборки, позволяющих использовать различные типы сборок (нет, у меня нет возможности сделать из него одну сборку; это вне моего контроля).
Каждый из этих конвейеров представлен репозиторием Jenkinsfile в репозитории проекта, и каждый из них должен использовать одну и ту же метку агента сборки (им также необходимо использовать другие части конфигурации, но текущая проблема - это метка агента сборки).,Я пытаюсь поместить метку в какой-то файл конфигурации в репозитории проекта, чтобы все Jenkinsfiles могли его прочитать.
Я ожидал, что это будет просто, поскольку вам не нужна эта конфигурацияданные, пока вы уже не проверили копию источников для чтения Jenkinsfile.Насколько я могу судить, это невозможно.
Мне кажется, что Jenkinsfile не может читать файлы из SCM, пока проект не выполнит шаг SCM.Однако, уже слишком поздно: аргумент агента {label} читается перед запуском любых этапов.
Вот минимальный случай:
final def config
pipeline {
agent none
stages {
stage('Configure') {
agent {
label 'master'
}
steps {
checkout scm // we don't need all the submodules here
echo "Reading configuration JSON"
script { config = readJSON file: 'buildjobs/buildjob-config.json' }
echo "Read configuration JSON"
}
}
stage('Build and Deploy') {
agent {
label config.agent_label
}
steps {
echo 'Got into Stage 2'
}
}
}
}
Когда я запускаю это, я получаю: java.lang.NullPointerException: Cannot get property 'agent_label' on null object
Я не получаю ни одного эха со стадии «Настройка».
Если я поменяю метку для стадии «Сборка и развертывание» на «мастер», сборка завершится успешно и распечатает все триоператоры echo.
Есть ли способ прочитать файл из рабочей области Git до того, как нужно установить метки агента?