Вопрос или проблема
Я использую 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}"
}
}
}
}
Объяснение
-
Определение параметров: В файле
commonParams.groovy
мы создаем методgetParams()
, который возвращает массив параметров. Каждый параметр определяется с помощью специальных методов, таких какstring()
иbooleanParam()
. -
Использование в Jenkinsfile: В
Jenkinsfile
мы вызываем методgetParams()
и используем циклeach
, чтобы добавить каждый параметр в блокparameters
. Это позволяет избежать ошибки компиляции и корректно интегрировать параметры в Jenkins pipeline.
Теперь, запуская ваш pipeline, он будет корректно считывать и использовать параметры, определенные в центральной библиотеке, что значительно упрощает управление конфигурацией и повышает повторное использование кода в ваших Jenkins-скриптах.