Jenkins中的@NonCPS的行为取决于谁发起工作

时间:2019-12-11 01:35:26

标签: jenkins jenkins-groovy

我今天才注意到这种奇怪的行为。我的Jenkins共享库中有以下方法:

@NonCPS
def getAddress(output, script) {
    def matcher = output =~ /START_(.*)_END/
    if (matcher.find()) {
        script.log "Database output? ${output}", 'D'
        return matcher.group()
    } else{
        return '0.0.0.0'
    }
}

当我运行使用此方法的作业时,该作业失败,但是除了matcher.group()返回null之外我看不到任何错误,因此我认为@NonCPS可能会导致此错误,然后我将其删除,然后重新运行该作业,这一次该作业运行良好,并且matcher.group()返回了预期值。

因此,我推送了更改并合并了没有@NonCPS的代码。我手动运行的工作有一个cron表达式可以在一夜之间开始。今天早上,我发现所有这些作业均失败,并出现以下错误,这是有道理的,因为我删除了@NonCPS

an exception which occurred:
    in field com.cloudbees.groovy.cps.impl.BlockScopeEnv.locals
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@1efd840c
    in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@57ec5d51
    in field com.cloudbees.groovy.cps.impl.CallEnv.caller
    in object com.cloudbees.groovy.cps.impl.FunctionCallEnv@634553ab
    in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@bdb5228
    in field com.cloudbees.groovy.cps.impl.ProxyEnv.parent
    in object com.cloudbees.groovy.cps.impl.BlockScopeEnv@b87fc89
    in field com.cloudbees.groovy.cps.impl.CpsClosureDef.capture
    in object com.cloudbees.groovy.cps.impl.CpsClosureDef@1470e5ad
    in field com.cloudbees.groovy.cps.impl.CpsClosure.def
    in object org.jenkinsci.plugins.workflow.cps.CpsClosure2@42f6b044
    in field org.jenkinsci.plugins.workflow.cps.CpsThreadGroup.closures
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@76c2e827
    in object org.jenkinsci.plugins.workflow.cps.CpsThreadGroup@76c2e827
Caused: java.io.NotSerializableException: java.util.regex.Matcher
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:926)
    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)

所以我决定自己手动重新运行作业,奇怪的是,它们都成功通过了!

我的用户名是admin,Jenkins作业由timer触发,因为我在其日志的开头看到以下消息:

  

由计时器启动

因此,现在当我退回@NonCPS计划的作业时,它可以正常工作,但按需手动运行它们却不能。我不明白的是,为什么用户的权限或用户名导致代码的行为不同?特别是,无论权限如何,该注释都应具有一致的结果。

我在这里错过了什么吗?如果与许可相关,计时器需要什么许可?还是我的用户名缺少特定权限?

0 个答案:

没有答案