运行 Spring 使用数据库启动测试时,Jenkins 代理作业终止

Jenkins agent jobs killed when running Spring Boot Tests with DB

我正在 运行 建立一个具有最低生产要求(3 个控制平面和两个计算节点)的自托管 OKD 4 集群。此设置包括 Jenkins 安装 - 通过 Helm 安装(https://www.jenkins.io/doc/book/installing/kubernetes/)到目前为止一切正常:当更改被推送到 Github 时自动启动构建,当它们成功部署到 Jenkins 运行s in.

但目前我面临的问题是,当构建作业执行 Spring 启动测试时,它会启动持久性上下文。一旦 Spring 启动持久性上下文,构建代理(jdk-11 图像,请参阅下面的 additionalAgent 配置)就会被杀死。下载依赖项和编译工作正常,顺便说一句。

additionalAgents:
  jdk-11:
    podName: jdk-11
    customJenkinsLabels: jdk-11
    image: jenkins/jnlp-agent-jdk11
    tag: latest
...

禁用测试后,作业 运行 没问题。但是一旦持久性被初始化,代理就会被杀死。

这些是我测试过的配置:

  1. 从内存中的 h2 数据库和 flyway 配置开始。
  2. 没有 flyway 配置。
  3. 即使没有设置数据库连接字符串。

作业被杀死的时间几乎相同: 对于 1. 是

2021-10-20 22:44:06.637  INFO 299 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-10-20 22:44:07.032  INFO 299 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 310 ms. Found 2 JPA repository interfaces.
2021-10-20 22:44:08.240  INFO 299 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=1c9e8306-7514-338e-8a9f-3cfba5c1169b
2021-10-20 22:44:10.527  INFO 299 --- [           main] o.f.c.internal.license.VersionPrinter    : Flyway Community Edition 7.7.3 by Redgate
2021-10-20 22:44:10.532  INFO 299 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Starting...
2021-10-20 22:44:11.744  INFO 299 --- [           main] com.zaxxer.hikari.HikariDataSource       : HikariPool-1 - Start completed.
2021-10-20 22:44:12.041  INFO 299 --- [           main] o.f.c.i.database.base.DatabaseType       : Database: jdbc:h2:mem:testdb (H2 1.4)
Killed

对于 2.

2021-10-21 19:50:51.604  INFO 306 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-10-21 19:50:52.005  INFO 306 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 391 ms. Found 2 JPA repository interfaces.
2021-10-21 19:50:53.510  INFO 306 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=0fd77ef3-b5a2-35cb-b157-6d27c0cfe9a5
2021-10-21 19:50:56.405  INFO 306 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-10-21 19:50:56.708  INFO 306 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.32.Final
2021-10-21 19:50:57.503  INFO 306 --- [           main] o.hibernate.annotations.common.Version   : HCANN000001: Hibernate Commons Annotations {5.1.2.Final}
Killed

还有 3 个

2021-10-21 22:02:48.810  INFO 309 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode.
2021-10-21 22:02:49.198  INFO 309 --- [           main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 380 ms. Found 2 JPA repository interfaces.
2021-10-21 22:02:50.509  INFO 309 --- [           main] o.s.cloud.context.scope.GenericScope     : BeanFactory id=0fd77ef3-b5a2-35cb-b157-6d27c0cfe9a5
2021-10-21 22:02:53.523  INFO 309 --- [           main] o.hibernate.jpa.internal.util.LogHelper  : HHH000204: Processing PersistenceUnitInfo [name: default]
2021-10-21 22:02:53.898  INFO 309 --- [           main] org.hibernate.Version                    : HHH000412: Hibernate ORM core version 5.4.32.Final
Killed

Jenkins pod 的日志只是指出

Terminated Kubernetes instance for agent jenkins/jdk-11-bjtz5
Disconnected computer jdk-11-bjtz5
2021-10-21 22:02:57.342+0000 [id=465]   INFO    o.c.j.p.k.KubernetesSlave#deleteSlavePod: Terminated Kubernetes instance for agent jenkins/jdk-11-bjtz5
2021-10-21 22:02:57.342+0000 [id=465]   INFO    o.c.j.p.k.KubernetesSlave#_terminate: Disconnected computer jdk-11-bjtz5
2021-10-21 22:02:57.356+0000 [id=436]   INFO    j.s.DefaultJnlpSlaveReceiver#channelClosed: Computer.threadPoolForRemoting [#56] for jdk-11-bjtz5 terminated: java.nio.channels.ClosedChannelException

在所有情况下都没有异常、堆栈跟踪或可疑事件。这些步骤是可重现的 - 当我再次 运行 使用相同配置构建时,代理在测试中的完全相同的步骤中被杀死。

设置:

我假设缺少一些配置来完成这项工作。但我就是找不到它可能是什么。所以我问:这里有人遇到过同样的问题吗?或者猜猜缺少的部分可能是什么?

如有遗漏请指出,我会补上

退后一步后,我查看了运行构建的实际 pod。并发现代理的内存限制是问题所在。

So increasing the limit solved the problem!

我通过修改本地 jenkins-values.yaml 并更新了其中 agent: 块的 limits 部分来做到这一点。

让我有点困惑的是,没有日志条目表明内存使用量超出范围。

接下来的想法是,我将通过 Java 选项为测试步骤设置内存限制,以在 pod 超出限制之前终止 maven 进程。猜猜它在构建中会更透明。

附带说明:之前已将限制设置为 512Mi,超过了 ~10 MiB -.-
对我来说幸运的是,我在这一点上找到了它,而其他构建作业 运行 很好只是由于缺乏资源使用(没有想到仅仅启动 Hibernate 会超过 512 MiB 标记)