Я пытаюсь сгенерировать конвейеры Jenkins, используя функцию pipeJob в подключении jobDSL, но не могу передать параметры из DSL в сценарий конвейера. У меня есть несколько проектов, в которых используется один и тот же Jenkinsfile, с отличиями только в нескольких шагах. Я пытаюсь использовать плагин JobDSL для генерации этих конвейеров на лету, и значения, которые я хочу изменить, интерпретируются так, чтобы соответствовать параметрам DSL.
Я пробовал практически все комбинации строкинтерпретация, которую я могу использовать в сценарии конвейера, а также в DSL, но не могу заставить Jenkins / groovy интерпретировать переменные в сценарии конвейера.
Я вызываю DSL задания на этапе конвейера:
def projectName = "myProject"
def envs = ['DEV','QA','UAT']
def repositoryURL = 'myrepo.com'
jobDsl targets: ['jobs/*.groovy'].join('\n'),
additionalParameters: [
project: projectName,
environments: envs,
repository: repositoryURL
],
removedJobAction: 'DELETE',
removedViewAction: 'DELETE'
DSL выглядит следующим образом:
pipelineJob("${project} pipeline") {
displayName('Pipeline')
definition {
cps {
script(readFileFromWorkspace(pipeline.groovy))
}
}
}
pipe.groovy:
pipeline {
agent any
environment {
REPO = repository
}
parameters {
choice name: "ENVIRONMENT", choices: environments
}
stages {
stage('Deploy') {
steps {
echo "Deploying ${env.REPO} to ${params.ENVIRONMENT}..."
}
}
}
}
Переменные, которые я передаю в AdditionalParameters, интерпретируются в сценарии jobDSL;конвейер с правильным именем действительно генерируется. Проблема в том, что переменные не передаются в сценарий конвейера, считанный из рабочей области - конфигурация Jenkins для сгенерированного конвейера выглядит точно так же, как и файл, без какой-либо интерпретации переменных.
Я сделалнесколько попыток получить строку для интерпретации, включая множество вариаций "$ {environment}", $ {environment}, $ environment, \ $ environment ... Я не могу найти ни одной такой работы. Я также попытался прочитать файл как gstringImpl:
script("${readFileFromWorkspace(pipeline.groovy)}")
Кто-нибудь есть какие-либо идеи относительно того, как я могу заставить переменные распространяться вниз по сценарию конвейера? Я знаю, что мог бы просто использовать цикл for для выполнения string.replaceAll () над текстом скрипта, но это кажется громоздким;должен быть лучший способ.