Как определить параметры в центральной общей библиотеке в Jenkins

Вопрос или проблема

Я использую Jenkins версии 2.440.2, и я хочу иметь возможность определять все параметры в центральном месте, таком как Shared Library, и повторно использовать конфигурацию этих параметров в различных Jenkinsfile.

// vars/commonParams.groovy
def getParams() {
    return [
        string(name: 'ENVIRONMENT', defaultValue: 'dev', description: 'Среда для развертывания'),
        booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Запускать тесты?')
    ]
}


// Jenkinsfile
@Library('my-shared-library') _
def param = commonParams.getParams()

pipeline {
    agent any
    parameters { param }
    stages {
        stage('Сборка') {
            steps {
                echo "Среда: ${params.ENVIRONMENT}"
                echo "Запуск тестов: ${params.RUN_TESTS}"
            }
        }
    }
}

Это вызывает ошибку

org.codehaus.groovy.control.MultipleCompilationErrorsException: ошибка компиляции:
WorkflowScript: 10: Ожидалось определение параметра сборки @ строке 10, столбец 9.
           param
           ^

1 ошибка

    at org.codehaus.groovy.control.ErrorCollector.failIfErrors(ErrorCollector.java:309)
    at org.codehaus.groovy.control.CompilationUnit.applyToPrimaryClassNodes(CompilationUnit.java:1107)
    at org.codehaus.groovy.control.CompilationUnit.doPhaseOperation(CompilationUnit.java:624)
    at org.codehaus.groovy.control.CompilationUnit.processPhaseOperations(CompilationUnit.java:602)
    at org.codehaus.groovy.control.CompilationUnit.compile(CompilationUnit.java:579)
    at groovy.lang.GroovyClassLoader.doParseClass(GroovyClassLoader.java:323)
    at groovy.lang.GroovyClassLoader.parseClass(GroovyClassLoader.java:293)
    at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox$Scope.parse(GroovySandbox.java:163)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.doParse(CpsGroovyShell.java:190)
    at org.jenkinsci.plugins.workflow.cps.CpsGroovyShell.reparse(CpsGroovyShell.java:175)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.parseScript(CpsFlowExecution.java:635)
    at org.jenkinsci.plugins.workflow.cps.CpsFlowExecution.start(CpsFlowExecution.java:581)
    at org.jenkinsci.plugins.workflow.job.WorkflowRun.run(WorkflowRun.java:335)
    at hudson.model.ResourceController.execute(ResourceController.java:101)
    at hudson.model.Executor.run(Executor.java:442)
Завершено: НЕУДАЧА

Ошибка возникает потому, что блок параметров Jenkins ожидает отдельные определения parameter, а не список. Вы не можете передавать список параметров напрямую, как parameters { param }. Чтобы решить эту проблему, вы можете использовать цикл для добавления каждого параметра из общей библиотеки в блок параметров.

@Library('my-shared-library') _
pipeline {
    agent any
    parameters {
        // Цикл по каждому параметру, возвращаемому общей библиотекой
        commonParams.getParams().each { param ->
            parameter param
        }
    }
    stages {
        stage('Сборка') {
            steps {
                echo "Среда: ${params.ENVIRONMENT}"
                echo "Запуск тестов: ${params.RUN_TESTS}"
            }
        }
    }
}

Ответ или решение

Для определения параметров в центральной общей библиотеке Jenkins и их повторного использования в разных Jenkinsfile необходимо понимать, что блок parameters ожидает определения отдельных параметров, а не списка. Ваша ошибка возникает из-за того, что вы пытаетесь передать список параметров в блок, который этого не поддерживает.

Чтобы решить проблему, вы можете использовать цикл для добавления каждого параметра из общей библиотеки в блок параметров. Вот исправленный пример:

Шаг 1: Определение параметров в общей библиотеке

Создайте файл commonParams.groovy в каталоге vars вашей общей библиотеки со следующим содержимым:

// vars/commonParams.groovy
def getParams() {
    return [
        string(name: 'ENVIRONMENT', defaultValue: 'dev', description: 'Существует ли среда развертывания'),
        booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Запускать тесты?')
    ]
}

Шаг 2: Использование параметров в Jenkinsfile

Теперь в вашем Jenkinsfile вы можете использовать следующую структуру кода:

@Library('my-shared-library') _

pipeline {
    agent any
    parameters {
        // Цикл для добавления каждого параметра из библиотеки
        commonParams.getParams().each { param ->
            parameter param
        }
    }
    stages {
        stage('Build') {
            steps {
                echo "Среда: ${params.ENVIRONMENT}"
                echo "Запуск тестов: ${params.RUN_TESTS}"
            }
        }
    }
}

Объяснение

  1. Определение параметров: В файле commonParams.groovy мы создаем метод getParams(), который возвращает массив параметров. Каждый параметр определяется с помощью специальных методов, таких как string() и booleanParam().

  2. Использование в Jenkinsfile: В Jenkinsfile мы вызываем метод getParams() и используем цикл each, чтобы добавить каждый параметр в блок parameters. Это позволяет избежать ошибки компиляции и корректно интегрировать параметры в Jenkins pipeline.

Теперь, запуская ваш pipeline, он будет корректно считывать и использовать параметры, определенные в центральной библиотеке, что значительно упрощает управление конфигурацией и повышает повторное использование кода в ваших Jenkins-скриптах.

Оцените материал
Добавить комментарий

Капча загружается...