使用 DB 运行 Spring Boot 测试时,Jenkins 代理作业被终止

Posted

技术标签:

【中文标题】使用 DB 运行 Spring Boot 测试时,Jenkins 代理作业被终止【英文标题】:Jenkins agent jobs killed when running Spring Boot Tests with DB 【发布时间】:2021-12-08 15:45:12 【问题描述】:

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

但目前我面临的问题是,当构建作业执行 Spring Boot 测试时会触发持久性上下文。一旦 Spring 启动持久性上下文,构建代理(一个 jdk-11 映像,请参见下面的附加代理配置)就会被终止。顺便说一句,下载依赖项和编译工作正常。

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

当测试被禁用时,作业运行良好。但是一旦持久化被初始化,代理就会被杀死。

这些是我为测试尝试过的配置:

    从内存中的 h2 数据库和 flyway 配置开始。 没有飞行路线配置。 即使没有设置数据库连接字符串。

作业被终止的时间几乎相同: 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

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

设置:

Jenkins 版本 2.303.2 Jenkins 使用在同一集群中运行的 mysql 数据库 所有 Jenkins 插件都是最新的 OKD 当前运行版本为 4.8.0-0.okd-2021-10-10-030117 目前没有设置资源配额,系统仍有大量可用资源

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

如有遗漏请指出,我会补充。

【问题讨论】:

【参考方案1】:

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

所以增加限制解决了问题!

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

让我有点困惑的是,没有日志条目表明内存使用量超出了这一事实。

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

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

【讨论】:

以上是关于使用 DB 运行 Spring Boot 测试时,Jenkins 代理作业被终止的主要内容,如果未能解决你的问题,请参考以下文章

带有 DB 的 Spring Boot 应用程序 - 使用 @DirtiesContext 重新创建上下文后测试类失败

从 cmd 运行时的 Spring Boot 负载测试数据库

使用属性 server.port=0 运行 spock 测试时如何找到 Spring Boot 容器的端口

如何使用 Spring Boot 应用程序和 Spock 测试在运行时更改服务器端口

Spring Boot JPA 元模型不能为空!尝试运行 JUnit / 集成测试时

使用 AttributeConverter 的 Spring Boot 测试不适用于 Maven 测试