运行Jenkins构建时出现“打开的文件太多”异常,正常的maven构建成功

laximzn5  于 2023-05-16  发布在  Jenkins
关注(0)|答案(1)|浏览(687)

我在jenkins build中遇到了一个问题,当jenkins试图构建junit测试时,我得到了一个maven编译器错误。
当我从命令行运行相同的代码时,构建成功。

maven-compiler-plugin/compile/default-compile/createdFiles.lst: Too many open files
06:26:49      at sun.nio.fs.UnixException.translateToIOException (UnixException.java:91)
06:26:49      at sun.nio.fs.UnixException.rethrowAsIOException (UnixException.java:102)
06:26:49      at sun.nio.fs.UnixException.rethrowAsIOException (UnixException.java:107)
06:26:49      at sun.nio.fs.UnixFileSystemProvider.newByteChannel (UnixFileSystemProvider.java:214)
06:26:49      at java.nio.file.spi.FileSystemProvider.newOutputStream (FileSystemProvider.java:434)
06:26:49      at java.nio.file.Files.newOutputStream (Files.java:216)
06:26:49      at java.nio.file.Files.newBufferedWriter (Files.java:2860)
06:26:49      at org.apache.maven.shared.utils.io.FileUtils.fileWriteArray (FileUtils.java:456)
06:26:49      at org.apache.maven.shared.utils.io.FileUtils.fileWriteArray (FileUtils.java:437)

有人能帮忙吗?

toiithl6

toiithl61#

Jenkins构建日志中显示的Java IOException "Too many open files"是由Maven构建管理器引起的。
在构建系统中,违反系统限制¹的情况并不少见,特别是当远程机器上的构建和工作负载首次看到较重的构建时。您的Jenkins设置可能就是这种情况。
然而,当您在命令行上调用构建管理器时,您没有达到该限制,但没有共享它不在同一台机器上,这是一种推测,所以对最后一句话持保留态度。
正常的过程是提交一个关于打开文件/文件描述符/文件句柄的限制的更改(请求)(对于构建用户Maven,因为构建管理器是在其下执行的,a.k.a. * “ulimit”*)。
如果它是一个自我管理的系统,请查阅包含该系统的操作手册,并检查这些设置是否已在配置中(我在下面列出了更多资源)。如果是这样,您应该能够根据操作说明和相关手册直接提交变更。
¹ limits.conf(5)sysconf(8)dockerd(8)systemd.exec(5)

其他资源

这都是关于 ulimit 的,但是今天的系统配置有很大的不同,而且管理服务经常消失。一些指针和Q&A资源,以便您可以开始构建自己的知识库(这是所有Linux):
引用自$ bash -c 'help ulimit'

ulimit: ulimit [-SHabcdefiklmnpqrstuvxPT] [limit]
    Modify shell resource limits.
    
    Provides control over the resources available to the shell and
    processes it creates, on systems that allow such control.
    
    Options:
      -S    use the `soft' resource limit
      -H    use the `hard' resource limit
      -a    all current limits are reported
[...]
      -n    the maximum number of open file descriptors

shell上的ulimit命令可以用来测试和尝试一些东西,例如:与您的 shell 和远程系统进行比较,将您的 shell 限制为远程的设置并尝试复制等。
dockerd(8)

--default-ulimit=[]
         Default ulimits for containers.

这里不太关心Docker,这仅仅是一个提醒,如果你有Jenkins / Maven运行dockerized,你可能会发现更多的地方以及如何配置 ulimits(最后一个摘录只指向其中的一个 *)。
这同样适用于带有 systemd 的系统,特别是systemd.exec(5),摘录:

Table 1. Resource limit directives, their equivalent ulimit shell
           commands and the unit used
           ┌─────────────────┬───────────────────┬─────────────────────┐
           │Directive        │ ulimit equivalent │ Unit                │
           ├─────────────────┼───────────────────┼─────────────────────┤
[...]
           ├─────────────────┼───────────────────┼─────────────────────┤
           │LimitNOFILE=     │ ulimit -n         │ Number of File      │
           │                 │                   │ Descriptors         │
           ├─────────────────┼───────────────────┼─────────────────────┤

并与 * 分辨率 * 部分B进行比较。Ulimit设置[仅适用于Linux操作系统]在Cloudbees的 Prepare Jenkins for Support 文章中获取更多信息。

相关问题