詹金斯抛出 java.lang.StackOverflowError -- 不仅仅是在 unstash

The*_*ick 5 stack-overflow jenkins jenkins-pipeline

2019 年 7 月 31 日更新
该错误有时发生在 unstash 调用之前,但始终在同一台服务器上。为了查看问题是否是由于在需要覆盖文件的目录中进行 unstash 工作引起的,我清理了该目录——但问题仍然存在。这次开始输出(转录,任何错别字都是我的错):

Running on my_agent in C:/Jenkins/workspace/script_name
. . .
Running in D:\mydir
[Pipeline] {
[Pipeline] bat
[mydir] Running batch script
D:\mydir> dir .
<output of dir command>
[Pipeline] End of Pipeline
java.lang.StackOverflowError
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:115)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:778)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
etc.
Run Code Online (Sandbox Code Playgroud)

它没有到达 unstash 调用,但仍然出现相同的错误。
= = = = =
在 Windows 10 上的 Jenkins 中解压时出现 java.lang.StackOverflowError;发生在一台服务器上,而不是另一台服务器上。看起来 unstash 正在获得无限递归。

  • stash 和 unstash 的名称相同吗? - 是的; 使用相同的函数来解开每个。
  • 重新启动 Jenkins 主从 - 是的。
  • 磁盘上有足够的空间来取消隐藏吗? - 是的。
  • 关于此错误的网络搜索 - 是的,但未解决此问题。
  • 这在过去有效吗?-- 是的,unstash 正在一台服务器上运行,但不在另一台服务器上运行。
  • 目标目录是否干净? - 是的。
  • 在不同的时间尝试过? - 是的。
def stash_my_stuff() {
    stash includes: '**', name: 'my_stash'
}
def unstash_my_stuff() {
    unstash 'my_stash'
}

// on one agent
dir("d:\\tmsc") { unstash_my_stuff() }

// later on a different agent
dir("d:\\tmsc") { unstash_my_stuff() }
Run Code Online (Sandbox Code Playgroud)
13:23:33 Running in D:\tmsc
[Pipeline] {
[Pipeline] unstash
[Pipeline] }
[Pipeline] // dir
[Pipeline] dir
13:24:01 Running in D:\tmsc
[Pipeline] {
[Pipeline] End of Pipeline
java.lang.StackOverflowError
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:111)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:778)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
    at org.jboss.marshalling.river.RiverMarshaller.doSerializableObject(RiverMarshaller.java:988)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteObject(RiverMarshaller.java:854)
    at org.jboss.marshalling.river.RiverMarshaller.doWriteFields(RiverMarshaller.java:1032)
etc., etc., etc.
sometimes it also includes
    at org.jboss.marshalling.river.RiverMarshaller.doSerializableObject(RiverMarshaller.java:967)
Run Code Online (Sandbox Code Playgroud)

Mar*_*k R 2

我在使用并行阶段时遇到了类似的问题。

我发现了关于此的错误报告。其中一条评论(下一条评论对此表示赞扬)推荐了这一点:

我也遇到了这个问题。我在 Windows 上使用 Jenkins,它是使用安装程序安装的。经过一番挖掘,我意识到这个 Jenkins 发行版附带了 32 位版本的 JRE,并且由 Windows 服务(使用 jenkins.xml 文件)使用。这严重限制了 JVM 可以分配的堆内存量。如果您在相同情况下遇到此问题,请修改 jenkins.xml 以使用不同的 64 位版本的 JRE,并增加最大堆分配(例如 -Xmx1024m)。

我还没有尝试过(我没有使用 Jenkins 对服务器的正确访问权限),但是当我这样做时,我会更新答案。