Предыстория: я разработчик аппаратного обеспечения, пытающийся улучшить нашу методологию проверки с помощью Jenkins.
Я просмотрел здесь много вопросов о Jenkinsfiles, groovy и include, и ни один из них, похоже, не решает мою проблему. Я хочу максимально упростить работу остальной части моей команды, позволив им указать в одной простой структуре данных все задания, которые они хотят выполнять в этом каталоге, например:
def targets = [
"Build number 1" : "make build",
"Some other run command" : "custom_script"
]
Моя идея заключалась в том, чтобы создать для них шаблон Jenkinsfile, который выглядел бы примерно так:
def targets = [.....]
node {
scm......
load "common/Jenkinsfile"
}
а затем common/Jenkinsfile, чтобы включить код для превращения этих целей в этапы:
try {
targets.each {entry ->
stage (entry.key) {
sh "${complicated_command_prefix} $entry.value ${complicated_command_suffix}"
}
}
}
catch (e) {
emailext (
// yadda yadda
)
throw e
}
Это работает, если я помещаю этот код непосредственно в свой Jenkinsfile вместо команды загрузки. Но очевидно, что load делает что-то более сложное, чем #include препроцессора C, потому что код не работает с load.
Сначала я получаю сообщение об ошибке, связанное с тем, что цели не определены (поскольку предположительно это выходит за рамки загруженного файла). Кто-то предложил добавить «env». в качестве префикса перед целями, и это устранило синтаксическую ошибку, но на самом деле этапы не выполняются.
Итак... как я могу правильно передать «цели» в загруженный файл, чтобы сгенерированные там этапы правильно обрабатывались? В качестве альтернативы, есть ли другие варианты, чтобы сделать эту работу лучше?
Изменить: я попытался вставить свои «цели определения» непосредственно в загруженный общий файл, и этапы обрабатываются правильно. Таким образом, проблема не в том, что загруженный файл не делает то, что должен, а просто в том, что он не получает значение «targets» из родительского Jenkinsfile.