jenkins - 如何使用 Jenkins Pipeline 属性步骤?

标签 jenkins jenkins-pipeline jenkins-workflow

我正在研究 Jenkins Pipeline:Multibranch 的功能。据说最近引入的 properties 步骤可能在那里有用,但我无法理解它是如何工作的以及它的目的是什么。

它的提示信息似乎不是很清楚:

Updates the properties of the job which runs this step. Mainly useful from multibranch workflows, so that Jenkinsfile itself can encode what would otherwise be static job configuration.

所以我用它作为脚本创建了一个新的管道(直接粘贴到 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)

UPDATE2:当我将相同的脚本(如 UPD1 中)放回 Jenkins 并运行它时,它请求新的权限 method groovy.lang.GroovyObject getProperty java.lang.String 。我批准了它,构建变绿了,但是,作业配置仍然没有出现任何变化。

我的环境是:Jenkins 1.625.3,Pipeline+Multibranch 1.13

最佳答案

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 - 如何使用 Jenkins Pipeline 属性步骤?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35370810/

相关文章:

java - Mac OS X 上的 Jenkins 速度缓慢并且崩溃

java - 无法启动 Jenkins 本地主机:8080

maven - Jenkins Maven 发布 : Replace Snapshot Dependencies

svn - 使用 Jenkins 管道中的凭据检查 SVN?

java - 在多分支管道中调用作业

github - 当授权用户对 github pull request 发表评论时如何触发 jenkins 管道阶段?

Jenkins Ansible 插件权限被拒绝(公钥、密码)- 无法复制私钥

Jenkins 管道 shell 步骤

continuous-integration - 在步骤中找不到这样的 DSL 方法 'steps'

jenkins - 如何将 Jenkins 凭据传递给 gradle?