获取 Jenkins 多分支管道中的分支列表 [英] Get list of branches in Jenkins multibranch pipeline

查看:37
本文介绍了获取 Jenkins 多分支管道中的分支列表的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

Jenkins 多分支管道项目的 Blue Ocean 界面显示了几个自动创建的分支.

是否有一种编程方式来列出管道中的分支,从代码中添加到 Jenkinsfile?

此问题询问位于 Jenkins 应用程序对象模型中的 Jenkins 项目分支信息,这些信息应该可以通过 Jenkins API 或 CLI 访问.

我查看了 http://<jenkins-home>/env-vars.html/ 上提供的所有变量,但这些变量似乎都没有描述我的信息寻找.

项目分支列表清楚地可用于 Multibranch 项目.为了将分支列表提取到在 Jenkinsfile 中运行的脚本中,需要什么语法?

@bto 的建议

我尝试了 @bto 的建议,但我收到一个错误,表明已找到意外的 (.

这是产生新错误的相关最小 Jenkinsfile:

节点{//在做任何事情之前清理工作空间删除目录()尝试 {阶段(克隆"){嘘'''项目 = jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}"))project.getItems().each { 工作 ->println job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()}'''}} 捕捉(错误){currentBuild.result = '失败'抛出错误}}

这里是包含错误的日志文件:

 project = jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}")) project.getItems().each { job ->println job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName() }— Shell Script<1s[ne_GWS-43-getissueforcommit-M2X23QGNMETLDZWFK7IXVZQRCNSWYNTDFJZU54VP7DMIOD6Z4DGA] 运行shell脚本/var/jenkins_home/workspace/ne_GWS-43-getissueforcommit-M2X23QGNMETLDZWFK7IXVZQRCNSWYNTDFJZU54VP7DMIOD6Z4DGA@tmp/durable-27d568b1/script.sh:第3行:语法错误:意外("脚本返回退出代码 2

第二种方法

或者,我根据 @bto 的评论删除了封闭的 sh """ ... """ 块,但这产生了关于 无步骤.

混淆可能是由于这是一个脚本化管道"而不是声明性管道".查看声明式"和脚本化管道之间的区别

但是当我单击错误消息上的任何位置时,什么都没有发生.

然后我打开一个单独的窗口来访问用于添加安全例外的 Jenkins 工具,但是没有任何东西排队等待自动批准,也没有任何东西可以让我手动输入需要批准的命令.我得到的是以下屏幕:

向下滚动到图像中显示的屏幕底部不会显示任何新内容.

又一次尝试加入白名单:

根据@bto的评论,我去http://<jenkins-home>/script输入以下内容,然后点击运行按钮:

def getBranchNames(project){project.getItems().each { 工作 ->echo job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()}}getBranchNames(jenkins.model.Jenkins.instance.getItem(我的项目名称字符串"))

但是产生了以下错误,并且NOTHING被添加到http://<jenkins-home>/scriptApproval的批准队列中:

groovy.lang.MissingMethodException:没有方法签名:Script1.echo() 适用于参数类型:(java.lang.String) 值:[GWS-43-getissueforcommit]可能的解决方案:each(groovy.lang.Closure)、getAt(java.lang.String)、wait()、run()、run()、every()在 org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)在 org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:81)在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)在 Script1$_getBranchNames_closure1.doCall(Script1.groovy:3)在 sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)在 sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)在 sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)在 java.lang.reflect.Method.invoke(Method.java:498)在 org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)在 groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)在 org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)在 groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)在 groovy.lang.Closure.call(Closure.java:414)在 groovy.lang.Closure.call(Closure.java:430)在 org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2040)在 org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2025)在 org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2066)在 org.codehaus.groovy.runtime.dgm$162.invoke(未知来源)在 org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)在 org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)在 Script1.getBranchNames(Script1.groovy:2)在 Script1$getBranchNames.callCurrent(未知来源)在 org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)在 org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)在 Script1.run(Script1.groovy:6)在 groovy.lang.GroovyShell.evaluate(GroovyShell.java:585)在 groovy.lang.GroovyShell.evaluate(GroovyShell.java:623)在 groovy.lang.GroovyShell.evaluate(GroovyShell.java:594)在 hudson.util.RemotingDiagnostics$Script.call(RemotingDiagnostics.java:142)在 hudson.util.RemotingDiagnostics$Script.call(RemotingDiagnostics.java:114)在 hudson.remoting.LocalChannel.call(LocalChannel.java:45)在 hudson.util.RemotingDiagnostics.executeGroovy(RemotingDiagnostics.java:111)在 jenkins.model.Jenkins._doScript(Jenkins.java:4331)在 jenkins.model.Jenkins.doScript(Jenkins.java:4302)在 java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)在 org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)在 org.kohsuke.stapler.Function.bindAndInvoke(Function.java:184)在 org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:117)在 org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:129)在 org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)在 org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)在 org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)在 org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)在 org.kohsuke.stapler.Stapler.service(Stapler.java:238)在 javax.servlet.http.HttpServlet.service(HttpServlet.java:790)在 org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)在 hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)在 org.jenkinsci.plugins.ssegateway.Endpoint$SSEListenChannelFilter.doFilter(Endpoint.java:225)在 hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)在 io.jenkins.blueocean.ResourceCacheControl.doFilter(ResourceCacheControl.java:134)在 hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)在 io.jenkins.blueocean.auth.jwt.impl.JwtAuthenticationFilter.doFilter(JwtAuthenticationFilter.java:61)在 hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)在 hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)在 hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:99)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)在 hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)在 hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)在 hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)在 hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)在 hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)在 org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)在 hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)在 org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)在 org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)在 org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)在 org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)在 org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)在 org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)在 org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)在 org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)在 org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)在 org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)在 org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)在 org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)在 org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)在 org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)在 org.eclipse.jetty.server.Server.handle(Server.java:564)在 org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)在 org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)在 org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)在 org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)在 org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)在 org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)在 org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)在 org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)在 winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)在 java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)在 java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)在 java.lang.Thread.run(Thread.java:748)

为了解决此错误还必须进行哪些更改?

解决方案

您需要将很多方法签名列入白名单才能使其正常工作,但您应该能够执行以下操作:

@NonCPSdef getBranchNames(项目){project.getItems().each { 工作 ->echo job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()}}节点{//在做任何事情之前清理工作空间删除目录()阶段(克隆"){getBranchNames(jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}")))回声完成阅读工作"}}

请注意,此代码段从原始请求中排除了 try/catch 错误处理:通过捕获白名单异常,它们不会正确添加到 scriptApproval 列表中.它通过后没有白名单异常,你可以重新添加错误处理,如下:

@NonCPSdef getBranchNames(项目){project.getItems().each { 工作 ->echo job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()}}节点{//在做任何事情之前清理工作空间删除目录()尝试 {阶段(克隆"){getBranchNames(jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}")))回声完成阅读工作"}} 捕捉(错误){错误构建失败:${err}"}}

* 白名单通过 http://<jenkins-home>/scriptApproval 进行.我基本上运行了我的测试作业,查看了控制台输出失败,单击了批准链接,然后批准"了有问题的项目.我必须将以下内容列入白名单才能使其正常工作:

  • staticMethod jenkins.model.Jenkins getInstance'
    • 注意!这个被标记为可能引入安全漏洞(因为它让脚本可以接触到 Jenkins 实例)
  • 方法 hudson.model.ItemGroup getItem java.lang.String
  • 方法 hudson.model.ItemGroup 获取项目
  • 方法 hudson.model.Job getProperty java.lang.Class
  • 方法 org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty getBranch
  • 方法 jenkins.branch.Branch 获取名称

The Blue Ocean interface to a Jenkins multibranch pipeline project shows several branches that were automatically created.

Is there a programmatic way to list the branches in the pipeline from code to be added to a Jenkinsfile?

This question asks about Jenkins Project branch information located inside the Jenkins application object model, which should be accessible via the Jenkins API or CLI.

I looked at all the variables that are available at http://<jenkins-home>/env-vars.html/ , but none of those variables seem to describe the information that I seek.

The list of project branches is clearly available to the Multibranch project. What syntax is required in order for the list of branches to be extracted into a script that runs in a Jenkinsfile?

@bto's suggestions

I tried @bto's suggestion, but I am getting an error indicating that an unexpected ( has been found.

Here is the relevant minimal Jenkinsfile that produces the new error:

node {
    // Clean workspace before doing anything
    deleteDir()

    try {
        stage ('Clone') {
            sh '''
                project = jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}"))
                    project.getItems().each { job ->
                        println job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()
                    }
            '''
        }
    } catch (err) {
        currentBuild.result = 'FAILED'
        throw err
    }
}

And here is the log file containing the error:

 project = jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}")) project.getItems().each { job -> println job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName() }— Shell Script<1s
    [ne_GWS-43-getissueforcommit-M2X23QGNMETLDZWFK7IXVZQRCNSWYNTDFJZU54VP7DMIOD6Z4DGA] Running shell script
    /var/jenkins_home/workspace/ne_GWS-43-getissueforcommit-M2X23QGNMETLDZWFK7IXVZQRCNSWYNTDFJZU54VP7DMIOD6Z4DGA@tmp/durable-27d568b1/script.sh: line 3: syntax error: unexpected "("
    script returned exit code 2

Second Approach

Alternatively, I removed the enclosing sh """ ... """ block, per @bto's comment, but this produced a different error about No Steps.

The confusion may be due to this being a 'scripted pipeline' and not a 'declarative pipeline'. See the difference between 'declarative' and scripted pipelines at this link.

Here is the alternative minimal Jenkinsfile.

node {
    // Clean workspace before doing anything
    deleteDir()

    try {
        stage ('Clone') {
            project = jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}"))
                project.getItems().each { job ->
                    println job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()
                }
        }
    } catch (err) {
        currentBuild.result = 'FAILED'
        throw err
    }
}

And here is the log that results from the alternative approach:

No steps    This stage has no steps

    Branch event
    Obtained Jenkinsfile from 35adc9e931b45b1d1b3ace17c8fbddeeb5471ee1
    Running in Durability level: MAX_SURVIVABILITY
    [Pipeline] node
    Running on Jenkins in /var/jenkins_home/workspace/ne_GWS-43-getissueforcommit-M2X23QGNMETLDZWFK7IXVZQRCNSWYNTDFJZU54VP7DMIOD6Z4DGA
    [Pipeline] {
    [Pipeline] deleteDir
    [Pipeline] stage
    [Pipeline] { (Clone)
    [Pipeline] }
    [Pipeline] // stage
    [Pipeline] }
    [Pipeline] // node
    [Pipeline] End of Pipeline
    [Bitbucket] Notifying commit build result
    [Bitbucket] Build result notified
    an exception which occurred:
        in field groovy.lang.Closure.delegate
        in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@739b5db2
        in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
        in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@1ca5a320
        in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@1ca5a320
    Caused: java.io.NotSerializableException: org.jenkinsci.plugins.workflow.multibranch.WorkflowMultiBranchProject
        at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:860)
        at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
        at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
        at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
        at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
        at java.util.LinkedHashMap.internalWriteEntries(LinkedHashMap.java:333)
        at java.util.HashMap.writeObject(HashMap.java:1363)
        at sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:273)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
        at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
        at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
        at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
        at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
        at com.cloudbees.groovy.cps.SerializableScript.writeObject(SerializableScript.java:26)
        at sun.reflect.GeneratedMethodAccessor147.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:273)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:967)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
        at org.jboss.marshalling.river.BlockMarshaller.doWriteObject(BlockMarshaller.java:65)
        at org.jboss.marshalling.river.BlockMarshaller.writeObject(BlockMarshaller.java:56)
        at org.jboss.marshalling.MarshallerObjectOutputStream.writeObjectOverride(MarshallerObjectOutputStream.java:50)
        at org.jboss.marshalling.river.RiverObjectOutputStream.writeObjectOverride(RiverObjectOutputStream.java:179)
        at java.io.ObjectOutputStream.writeObject(ObjectOutputStream.java:344)
        at java.util.HashMap.internalWriteEntries(HashMap.java:1790)
        at java.util.HashMap.writeObject(HashMap.java:1363)
        at sun.reflect.GeneratedMethodAccessor48.invoke(Unknown Source)
        at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
        at java.lang.reflect.Method.invoke(Method.java:498)
        at org.jboss.marshalling.reflect.SerializableClass.callWriteObject(SerializableClass.java:273)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:976)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteSerializableObject(RiverMarshaller.java:988)
        at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
        at org.jboss.marshalling.AbstractObjectOutput.writeObject(AbstractObjectOutput.java:58)
        at org.jboss.marshalling.AbstractMarshaller.writeObject(AbstractMarshaller.java:111)
        at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.lambda$writeObject$0(RiverWriter.java:144)
        at org.jenkinsci.plugins.scriptsecurity.sandbox.groovy.GroovySandbox.runInSandbox(GroovySandbox.java:108)
        at org.jenkinsci.plugins.workflow.support.pickles.serialization.RiverWriter.writeObject(RiverWriter.java:143)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:477)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgram(CpsThreadGroup.java:453)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.saveProgramIfPossible(CpsThreadGroup.java:440)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.run(CpsThreadGroup.java:367)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.access$200(CpsThreadGroup.java:83)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:244)
        at org.jenkinsci.plugins.workflow.cps.CpsThreadGroup$2.call(CpsThreadGroup.java:232)
        at org.jenkinsci.plugins.workflow.cps.CpsVmExecutorService$2.call(CpsVmExecutorService.java:64)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at hudson.remoting.SingleLaneExecutorService$1.run(SingleLaneExecutorService.java:131)
        at jenkins.util.ContextResettingExecutorService$1.run(ContextResettingExecutorService.java:28)
        at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
        at java.util.concurrent.FutureTask.run(FutureTask.java:266)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
        at java.lang.Thread.run(Thread.java:748)
    Finished: FAILURE

Isolating The Error:

If I reduce @bto's suggested code to the following three lines, I can then turn the error off by commenting out the second of the following three lines, and then turn the error back on again by uncommenting the second line. Therefore, the line of code that causes the Java.ip.NonSerializableException is project.getItems(), as follows:

project = jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}"))
//project.getItems()
project = null 

Note that I also needed to add project = null.

Problem Adding Exceptions:

When I try to deploy @bto's suggested Jenkinsfile, the following error is shown in the Jenkins Blue Ocean interface:

But nothing happens when I click in any location on the error message.

Then I open a separate window to access the Jenkins tool for adding security exceptions, but nothing is queued up for automatic approval, and nothing allows me to manually enter the commands that need to be approved. What I get is the following screen:

Scrolling down to the bottom of the screen shown in the image does not reveal anything new.

Another attempt to whitelist:

Per @bto's comment, I went to http://<jenkins-home>/script and entered the following, and then clicked the Run button:

def getBranchNames(project){
    project.getItems().each { job ->
        echo job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()
    }
}
getBranchNames(jenkins.model.Jenkins.instance.getItem("my-project-name-string"))

But the following error was generated, and NOTHING was added to the approval queue at http://<jenkins-home>/scriptApproval:

groovy.lang.MissingMethodException: No signature of method: Script1.echo() is applicable for argument types: (java.lang.String) values: [GWS-43-getissueforcommit]
Possible solutions: each(groovy.lang.Closure), getAt(java.lang.String), wait(), run(), run(), every()
    at org.codehaus.groovy.runtime.ScriptBytecodeAdapter.unwrap(ScriptBytecodeAdapter.java:58)
    at org.codehaus.groovy.runtime.callsite.PogoMetaClassSite.callCurrent(PogoMetaClassSite.java:81)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
    at Script1$_getBranchNames_closure1.doCall(Script1.groovy:3)
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:498)
    at org.codehaus.groovy.reflection.CachedMethod.invoke(CachedMethod.java:93)
    at groovy.lang.MetaMethod.doMethodInvoke(MetaMethod.java:325)
    at org.codehaus.groovy.runtime.metaclass.ClosureMetaClass.invokeMethod(ClosureMetaClass.java:294)
    at groovy.lang.MetaClassImpl.invokeMethod(MetaClassImpl.java:1022)
    at groovy.lang.Closure.call(Closure.java:414)
    at groovy.lang.Closure.call(Closure.java:430)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2040)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2025)
    at org.codehaus.groovy.runtime.DefaultGroovyMethods.each(DefaultGroovyMethods.java:2066)
    at org.codehaus.groovy.runtime.dgm$162.invoke(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite$PojoMetaMethodSiteNoUnwrapNoCoerce.invoke(PojoMetaMethodSite.java:274)
    at org.codehaus.groovy.runtime.callsite.PojoMetaMethodSite.call(PojoMetaMethodSite.java:56)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCall(CallSiteArray.java:48)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:113)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.call(AbstractCallSite.java:125)
    at Script1.getBranchNames(Script1.groovy:2)
    at Script1$getBranchNames.callCurrent(Unknown Source)
    at org.codehaus.groovy.runtime.callsite.CallSiteArray.defaultCallCurrent(CallSiteArray.java:52)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:154)
    at org.codehaus.groovy.runtime.callsite.AbstractCallSite.callCurrent(AbstractCallSite.java:166)
    at Script1.run(Script1.groovy:6)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:585)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:623)
    at groovy.lang.GroovyShell.evaluate(GroovyShell.java:594)
    at hudson.util.RemotingDiagnostics$Script.call(RemotingDiagnostics.java:142)
    at hudson.util.RemotingDiagnostics$Script.call(RemotingDiagnostics.java:114)
    at hudson.remoting.LocalChannel.call(LocalChannel.java:45)
    at hudson.util.RemotingDiagnostics.executeGroovy(RemotingDiagnostics.java:111)
    at jenkins.model.Jenkins._doScript(Jenkins.java:4331)
    at jenkins.model.Jenkins.doScript(Jenkins.java:4302)
    at java.lang.invoke.MethodHandle.invokeWithArguments(MethodHandle.java:627)
    at org.kohsuke.stapler.Function$MethodFunction.invoke(Function.java:343)
    at org.kohsuke.stapler.Function.bindAndInvoke(Function.java:184)
    at org.kohsuke.stapler.Function.bindAndInvokeAndServeResponse(Function.java:117)
    at org.kohsuke.stapler.MetaClass$1.doDispatch(MetaClass.java:129)
    at org.kohsuke.stapler.NameBasedDispatcher.dispatch(NameBasedDispatcher.java:58)
    at org.kohsuke.stapler.Stapler.tryInvoke(Stapler.java:715)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:845)
    at org.kohsuke.stapler.Stapler.invoke(Stapler.java:649)
    at org.kohsuke.stapler.Stapler.service(Stapler.java:238)
    at javax.servlet.http.HttpServlet.service(HttpServlet.java:790)
    at org.eclipse.jetty.servlet.ServletHolder.handle(ServletHolder.java:841)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1650)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:154)
    at org.jenkinsci.plugins.ssegateway.Endpoint$SSEListenChannelFilter.doFilter(Endpoint.java:225)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
    at io.jenkins.blueocean.ResourceCacheControl.doFilter(ResourceCacheControl.java:134)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
    at io.jenkins.blueocean.auth.jwt.impl.JwtAuthenticationFilter.doFilter(JwtAuthenticationFilter.java:61)
    at hudson.util.PluginServletFilter$1.doFilter(PluginServletFilter.java:151)
    at hudson.util.PluginServletFilter.doFilter(PluginServletFilter.java:157)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.security.csrf.CrumbFilter.doFilter(CrumbFilter.java:99)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:84)
    at hudson.security.UnwrapSecurityExceptionFilter.doFilter(UnwrapSecurityExceptionFilter.java:51)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.ExceptionTranslationFilter.doFilter(ExceptionTranslationFilter.java:117)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.providers.anonymous.AnonymousProcessingFilter.doFilter(AnonymousProcessingFilter.java:125)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.ui.rememberme.RememberMeProcessingFilter.doFilter(RememberMeProcessingFilter.java:142)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.ui.AbstractProcessingFilter.doFilter(AbstractProcessingFilter.java:271)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at jenkins.security.BasicHeaderProcessor.doFilter(BasicHeaderProcessor.java:93)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at org.acegisecurity.context.HttpSessionContextIntegrationFilter.doFilter(HttpSessionContextIntegrationFilter.java:249)
    at hudson.security.HttpSessionContextIntegrationFilter2.doFilter(HttpSessionContextIntegrationFilter2.java:67)
    at hudson.security.ChainedServletFilter$1.doFilter(ChainedServletFilter.java:87)
    at hudson.security.ChainedServletFilter.doFilter(ChainedServletFilter.java:90)
    at hudson.security.HudsonFilter.doFilter(HudsonFilter.java:171)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at org.kohsuke.stapler.compression.CompressionFilter.doFilter(CompressionFilter.java:49)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at hudson.util.CharacterEncodingFilter.doFilter(CharacterEncodingFilter.java:82)
     at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at org.kohsuke.stapler.DiagnosticThreadNameFilter.doFilter(DiagnosticThreadNameFilter.java:30)
    at org.eclipse.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1637)
    at org.eclipse.jetty.servlet.ServletHandler.doHandle(ServletHandler.java:533)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:143)
    at org.eclipse.jetty.security.SecurityHandler.handle(SecurityHandler.java:524)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:190)
    at org.eclipse.jetty.server.session.SessionHandler.doHandle(SessionHandler.java:1595)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextHandle(ScopedHandler.java:188)
    at org.eclipse.jetty.server.handler.ContextHandler.doHandle(ContextHandler.java:1253)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:168)
    at org.eclipse.jetty.servlet.ServletHandler.doScope(ServletHandler.java:473)
    at org.eclipse.jetty.server.session.SessionHandler.doScope(SessionHandler.java:1564)
    at org.eclipse.jetty.server.handler.ScopedHandler.nextScope(ScopedHandler.java:166)
    at org.eclipse.jetty.server.handler.ContextHandler.doScope(ContextHandler.java:1155)
    at org.eclipse.jetty.server.handler.ScopedHandler.handle(ScopedHandler.java:141)
    at org.eclipse.jetty.server.handler.HandlerWrapper.handle(HandlerWrapper.java:132)
    at org.eclipse.jetty.server.Server.handle(Server.java:564)
    at org.eclipse.jetty.server.HttpChannel.handle(HttpChannel.java:317)
    at org.eclipse.jetty.server.HttpConnection.onFillable(HttpConnection.java:251)
    at org.eclipse.jetty.io.AbstractConnection$ReadCallback.succeeded(AbstractConnection.java:279)
    at org.eclipse.jetty.io.FillInterest.fillable(FillInterest.java:110)
    at org.eclipse.jetty.io.ChannelEndPoint$2.run(ChannelEndPoint.java:124)
    at org.eclipse.jetty.util.thread.Invocable.invokePreferred(Invocable.java:128)
    at org.eclipse.jetty.util.thread.Invocable$InvocableExecutor.invoke(Invocable.java:222)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.doProduce(EatWhatYouKill.java:294)
    at org.eclipse.jetty.util.thread.strategy.EatWhatYouKill.run(EatWhatYouKill.java:199)
    at winstone.BoundedExecutorService$1.run(BoundedExecutorService.java:77)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)

What else must be changed in order to resolve this error?

解决方案

You're going to need to whitelist* a lot of method signatures to get this to work, but you should be able to do something like:

@NonCPS
def getBranchNames(project){
    project.getItems().each { job ->
        echo job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()
    }
}

node {
    // Clean workspace before doing anything
    deleteDir()
    stage ('Clone') {
        getBranchNames(jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}")))
        echo "done reading jobs"
    }
}

Note that this snippet excludes the try/catch error handling from the original request: By catching the whitelist exceptions, they aren't correctly added to the scriptApproval list. After it makes it through with no whitelist exceptions, you can add the error handling back in, as follows:

@NonCPS
def getBranchNames(project){
    project.getItems().each { job ->
        echo job.getProperty(org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty.class).getBranch().getName()
    }
}

node {
    // Clean workspace before doing anything
    deleteDir()
    try {
        stage ('Clone') {
            getBranchNames(jenkins.model.Jenkins.instance.getItem(env.JOB_NAME.minus("/${env.JOB_BASE_NAME}")))
            echo "done reading jobs"
        }
    } catch (err) {
        error "BUILD FAILED: ${err}"
    }
}

* Whitelisting happens through http://<jenkins-home>/scriptApproval. I basically ran my test job, looked at the console output failure, clicked the approval link, and "approved" the item in question. I had to whitelist the following to get this to work:

  • staticMethod jenkins.model.Jenkins getInstance'
    • Caveat! This one is flagged out as potentially introducing a security vulnerability (since it lets scripts get their hands on the Jenkins instance)
  • method hudson.model.ItemGroup getItem java.lang.String
  • method hudson.model.ItemGroup getItems
  • method hudson.model.Job getProperty java.lang.Class
  • method org.jenkinsci.plugins.workflow.multibranch.BranchJobProperty getBranch
  • method jenkins.branch.Branch getName

这篇关于获取 Jenkins 多分支管道中的分支列表的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆