Gradle构建卡住问题解决
项目描述
项目代码量30W+,测试用例数1K+。有三个测试环境:黑盒环境,白盒环境,构建环境,预发布环境。
问题描述
项目一直使用Gradle进行构建(编译代码,执行测试用例,统计测试覆盖率,静态代码检查,打包等),之前一直没有问题。最近一次需求迭代完成之后像往常一样进行项目构建打包准备上线。但是在执行构建过程中老是卡在某个地方,遇到了各种异常情况。记录下来给有需要的人参考。
异常解决
遇到这种情况我们一般会启用Gradle的DEBUG模式,通过日志信息,排查问题。下面是遇到的一些问题:
-
执行构建一直卡在第一个测试用例的第一个测试方法不动
问题解决:
卡住不动从代码层面考虑的话一定是什么东西阻塞了代码的执行。观察日志发现测试用例在进行数据初始化的时候一直卡住不动。数据库阻塞了测试用例执行。
查看构建库,发现来自同一个会话出现了很多锁,执行了什么导致了这么多锁呢?应是前面反复多次执行构建时,一直卡住把进程杀掉导致的。手动把数据库里的锁清理掉后。再次执行构建。
-
执行到某个测试用例时就又失败了,当前执行的测试方法提示initialize error然后就卡住很长时间不动了
问题解决:
祭出debug大刀,再跑一次,查看日志,发现抛出 java.lang.OutOfMemoryError: PermGen space. 内存非堆内存溢出了。这就好办啦。设置一下JVM参数就行了。于是在项目的gradle.properties文件里增加以下配置:
-XX:MaxPermSize=256m
OK,这次应该可以了吧,再次构建项目。
喝杯茶,等待执行结果······
我擦还是initialize error,非堆内存还不够?好吧,在增大一倍试试,配置如下:
-XX:MaxPermSize=256m
再次构建项目,等待中······
Oh,no,还是initialize error,不应该啊,这次迭代没有增加多少测试用例和类啊,上个迭代还正常怎么这次就突然不行了呢,异常日志还是相同的**java.lang.OutOfMemoryError: PermGen space.**异常啊。这是怎么回事儿啊?
难道JVM设置没有起作用?那来看一下吧,在本地启动项目构建任务,然后打开jvisualvm查看JVM信息。发现刚开始只有一个GradleDaemon的JVM,执行到test的时候出现GradleWorkerMain的JVM,怎么会有两个JVM呢?查看官方文档发现原来test任务会使用一个独立的JVM执行测试任务。前面的设置只是对GradleDaemon起作用。根据官方文档在test任务中加入以下配置:
test { jvmArgs "-XX:MaxPermSize=1024m"}
官方说明文档地址:
再次执行构建,等待中······
终于成功了。
-
中间还有很多坎坷基本上使用DEBUG模式都可以根据提示信息轻松解决,比如测试引入新的测试库,在构建环境没有同步,测试用例存在环境依赖等等。
总结
路漫漫兮其修远兮吾将上下而求索。