使用 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 测试在运行时更改服务器端口