Jenkins pipeJob DSL не интерпретирует переменные в конвейерном скрипте - PullRequest
0 голосов
/ 11 октября 2019

Я пытаюсь сгенерировать конвейеры 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 () над текстом скрипта, но это кажется громоздким;должен быть лучший способ.

1 Ответ

0 голосов
/ 11 октября 2019

Я придумал способ заставить эту работу. Это не то, что я бы предпочел, так как содержимое строки файла неявно интерпретируется при создании задания, но оно работает;он просто добавляет дополнительный шаг.

import groovy.text.SimpleTemplateEngine

def fileContents = readFileFromWorkspace "pipeline.groovy"

def engine = new SimpleTemplateEngine()
template = engine.createTemplate(fileContents).make(binding.getVariables()).toString()

pipelineJob("${project} pipeline") {
    displayName('Pipeline')
    definition {
        cps { 
            script(template)
        }
    }
}

Это считывает файл из вашей рабочей области, а затем использует его как шаблон с переменными привязки. Другие изменения, необходимые для выполнения этой работы, - экранирование любых переменных, используемых в вашем сценарии Jenkinsfile, например \${VARIABLE}, чтобы они расширялись во время выполнения, а не во время создания задания. Любые переменные, которые вы хотите расширить при создании задания, должны указываться как ${VARIABLE}.

...