我今天才注意到这种奇怪的行为。我的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
计划的作业时,它可以正常工作,但按需手动运行它们却不能。我不明白的是,为什么用户的权限或用户名导致代码的行为不同?特别是,无论权限如何,该注释都应具有一致的结果。
我在这里错过了什么吗?如果与许可相关,计时器需要什么许可?还是我的用户名缺少特定权限?