首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Jenkins管道并行作业的CPS问题

Jenkins管道并行作业的CPS问题
EN

Stack Overflow用户
提问于 2018-02-08 16:37:35
回答 1查看 2.2K关注 0票数 0

我正在尝试创建一个简单的作业,该作业在具有特定标签的所有在线节点上运行。我可以获得节点名,并期望下面的代码能够工作。然而,我得到了下面的异常。

代码语言:javascript
复制
def newJob(x)
{
    return  {
        node(x) {
            bat "dir"
        }
    }
}

def jobs = [:]

def lgroups = Jenkins.instance.getLabel('win7')
for (g in lgroups) {
    for (node in g.getNodes()) {
        def nodeName = node.getNodeName()
        if (Jenkins.instance.getNode(nodeName).toComputer().isOnline())
        {
            jobs["${nodeName}_BS"] = newJob(nodeName)
        }
    }
}

parallel jobs

该作业配置为在未启用沙箱的情况下运行。例外:

代码语言:javascript
复制
an exception which occurred:
  in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@90def78
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.LoopBlockScopeEnv@32864b7a
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@5a2e37ea
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@fb260f7
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.LoopBlockScopeEnv@fa692c0
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@15ffb7f2
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@60b6bff4
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@4e29d7b4
  in field com.cloudbees.groovy.cps.impl.CallEnv.caller
  in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@1fa0ac69
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@1efd7828
  in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@157768c5
  in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture
  in object com.cloudbees.groovy.cps.impl.CpsClosureDef@6c20bc58
  in field com.cloudbees.groovy.cps.impl.CpsClosure.def
  in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@757fe932
  in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
  in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@31a3450e
  in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture
  in object com.cloudbees.groovy.cps.impl.CpsClosureDef@4d20e584
  in field com.cloudbees.groovy.cps.impl.CpsClosure.def
  in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@59bab622
  in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
  in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5fa55074
  in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@5fa55074
Caused: java.io.NotSerializableException: hudson.model.labels.LabelAtom
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2018-02-08 18:05:34

您必须将不可序列化的代码提取到一个使用@NonCPS注释的方法中,可能类似于以下内容:

代码语言:javascript
复制
@NonCPS
def getParallel() {
    def jobs = [:]
    def lgroups = Jenkins.instance.getLabel('win7')
    for (g in lgroups) {
        for (node in g.getNodes()) {
            def nodeName = node.getNodeName()
            if (Jenkins.instance.getNode(nodeName).toComputer().isOnline())
            {
                jobs["${nodeName}_BS"] = newJob(nodeName)
            }
       }
    }
    return jobs
}

parallel getParallel()
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/48681010

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档