Как использовать шаг свойств Jenkins Pipeline?
Я изучаю возможности Jenkins Pipeline:Multifranch. Говорят, что недавно введенный properties
Шаг может быть полезен там, но я не могу понять, как он работает и какова его цель.
Похоже, его подсказка не очень ясна:
Обновляет свойства задания, которое запускает этот шаг. В основном полезен из многоотраслевых рабочих процессов, так что сам Jenkinsfile может кодировать то, что в противном случае было бы статической конфигурацией задания.
Поэтому я создал новый конвейер с этим скриптом (вставленным непосредственно в Jenkins, а не в SCM):
properties [[$class: 'ParametersDefinitionProperty',
parameterDefinitions: [[$class: 'StringParameterDefinition',
defaultValue: '', description: '', name: 'PARAM1']]
]]
Я запустил его, и ничего не произошло, задание не получило новый параметр, и даже если бы он это сделал, я не понимаю, зачем мне это нужно. Может ли кто-нибудь объяснить, пожалуйста?
ОБНОВЛЕНИЕ 1: Я попытался вставить фиктивный конвейер со свойством свойства в мой репозиторий git, а затем настроил многоотраслевое задание.
println 1
properties [[$class: 'ParametersDefinitionProperty', parameterDefinitions: [[$class: 'StringParameterDefinition', defaultValue: 'str1', description: '', name: 'PARAM1']]], [$class: 'RebuildSettings', autoRebuild: false, rebuildDisabled: false]]
println 2
Он нашел мою ветку, создал работу, но сборка не удалась:
groovy.lang.MissingPropertyException: No such property: properties for class: groovy.lang.Binding
at groovy.lang.Binding.getVariable(Binding.java:62)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.SandboxInterceptor.onGetProperty(SandboxInterceptor.java:185)
at org.kohsuke.groovy.sandbox.impl.Checker$4.call(Checker.java:241)
at org.kohsuke.groovy.sandbox.impl.Checker.checkedGetProperty(Checker.java:238)
at com.cloudbees.groovy.cps.sandbox.SandboxInvoker.getProperty(SandboxInvoker.java:23)
at com.cloudbees.groovy.cps.impl.PropertyAccessBlock.rawGet(PropertyAccessBlock.java:17)
at WorkflowScript.run(WorkflowScript:2)
at ___cps.transform___(Native Method)
at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.get(PropertyishBlock.java:62)
at com.cloudbees.groovy.cps.LValueBlock$GetAdapter.receive(LValueBlock.java:30)
at com.cloudbees.groovy.cps.impl.PropertyishBlock$ContinuationImpl.fixName(PropertyishBlock.java:54)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:601)
at com.cloudbees.groovy.cps.impl.ContinuationPtr$ContinuationImpl.receive(ContinuationPtr.java:72)
at com.cloudbees.groovy.cps.impl.ConstantBlock.eval(ConstantBlock.java:21)
at com.cloudbees.groovy.cps.Next.step(Next.java:58)
at com.cloudbees.groovy.cps.Continuable.run0(Continuable.java:154)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.access$001(SandboxContinuable.java:19)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:33)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable$1.call(SandboxContinuable.java:30)
at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:106)
at org.jenkinsci.plugins.workflow.cps.SandboxContinuable.run0(SandboxContinuable.java:30)
at org.jenkinsci.plugins.workflow.cps.CpsThread.runNextChunk(CpsThread.java:164)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:277)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$000(CpsThreadGroup.java:77)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:186)
at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:184)
at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:47)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:112)
at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:471)
at java.util.concurrent.FutureTask$Sync.innerRun(FutureTask.java:334)
at java.util.concurrent.FutureTask.run(FutureTask.java:166)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1110)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:603)
at java.lang.Thread.run(Thread.java:722)
ОБНОВЛЕНИЕ2: когда я помещаю тот же сценарий (как в UPD1) обратно в Jenkins и запускаю его, он запрашивает новое разрешение method groovy.lang.GroovyObject getProperty java.lang.String
, Я одобрил это, сборка стала зеленой, однако, все еще никаких изменений в конфигурации работы не появилось.
Мой env: Дженкинс 1.625.3, Трубопровод + Многоотраслевой 1.13
3 ответа
С помощью properties
с явным синтаксисом метода будет работать, т.е.properties( [ ... ] )
скорее, чем properties [ ... ]
В качестве альтернативы, он будет работать без указания имени параметра, например:
properties properties: [ ... ]
Например, определить три свойства так же просто, как:
properties([
parameters([
string(name: 'submodule', defaultValue: ''),
string(name: 'submodule_branch', defaultValue: ''),
string(name: 'commit_sha', defaultValue: ''),
])
])
/* Accessible then with : params.submodule, params.submodule_branch... */
В официальном документе Jenkins есть отличный пример использования параметров .Проверьте конвейер ниже:
pipeline {
agent any
parameters {
string(name: 'PERSON', defaultValue: 'Mr Jenkins', description: 'Who should I say hello to?')
text(name: 'BIOGRAPHY', defaultValue: '', description: 'Enter some information about the person')
booleanParam(name: 'TOGGLE', defaultValue: true, description: 'Toggle this value')
choice(name: 'CHOICE', choices: ['One', 'Two', 'Three'], description: 'Pick something')
password(name: 'PASSWORD', defaultValue: 'SECRET', description: 'Enter a password')
}
stages {
stage('Example') {
steps {
echo "Hello ${params.PERSON}"
echo "Biography: ${params.BIOGRAPHY}"
echo "Toggle: ${params.TOGGLE}"
echo "Choice: ${params.CHOICE}"
echo "Password: ${params.PASSWORD}"
}
}
}
}
Благодаря, например, логическому параметру, который генерирует флажок в графическом интерфейсе Jenkins, вы можете условно запускать/пропускать тесты:
pipeline {
agent any
parameters {
booleanParam(name: 'RUN_TESTS', defaultValue: true, description: 'Should we run tests before deployment?')
}
stages {
stage('Test') {
when {
expression {
return params.RUN_TESTS
}
}
steps {
sh '${FABRIC} test'
}
}
stage('Deploy') {
steps {
sh '${FABRIC} deploy'
}
}
}
}
Множественный выбор в скриптовом конвейере Jenkins
properties([
parameters([
choice(choices: 'sprint_6\nsprint_7\nsprint_8\nSprint_9', description: 'Select branch to Build', name: 'Branch'),
choice(choices: 'No\nYes', , name: 'choice2'),
choice(choices: 'No\nYes', name: 'choice3')
])
])