使用docker镜像模式的gitlab-runner执行mvn命令扫描检测代码报错:[ERROR] GC overhead limit exceeded的解决办法


背景描述:

1.java项目使用的是maven编译打包的
2.项目根目录下有.gitlab-ci.yml文件,使用gitlab相关的gitlab-runner作为CI/CD工具
3.gitlab-runner是采用镜像容器方式部署的,配置文件中采用的是docker模式,而不是shell模式,docker模式使用的基础镜像是自己编译构建的
4.sonarqube是部署在其他主机上,采用maven中配置插件的形式连接sonar。
5.docker模式使用的基础镜像中的maven配置文件是cpoy进去的

问题描述:
在项目根目录下的.gitlab-ci.yml文件中添加有关sonar的检测命令后报错:[ERROR] GC overhead limit exceeded

问题分析:
项目太大,编译的时候内存不足导致的 (其他比较小的项目不会出现这个错误)

查看官方文档,是需要加一个环境变量:MAVEN_OPTS (地址:https://docs.sonarqube.org/7.8/analysis/scan/sonarscanner-for-maven/)、

https://cwiki.apache.org/confluence/display/MAVEN/OutOfMemoryError

重构docker模式使用的基础镜像,设置官方说的解决办法后,还是报同样的错误。

然后转换排查思路,不用直接在gitlab中修改配置进行排查了,而是直接使用基础镜像启动一个容器,然后进入到容器中,git拉取项目代码,然后sonar检测,在检测的时候查看进程,发现一个有意思的参数,具体如下图所示:

前面部分是配置的MAVEN_OPTS环境变量,但是后面那个-Xmx512m不知道从哪儿来的,导致的结果是sonar检测的时候还是使用的521m。

然后就开始想办法怎么把这个-Xmx512m去掉,或者把配置的MAVEN_OPTS环境变量放在-Xmx512m后面,这样一来就可以使用配置的MAVEN_OPTS环境变量了。

把这个-Xmx512m去掉没想到解决办法,把配置的MAVEN_OPTS环境变量放在-Xmx512m后面在网上找到了,具体看网址:https://quantum6.blog.csdn.net/article/details/114068114

先在容器中找到mvn命令所在路径,直接修改后,然后再次到项目根目录使用sonar检测,发现可以了。

然后就是把容器的mvn命令文件复制出来,然后整合进手动构建基础镜像使用的Dockerfile文件中(记得加上可执行权限)

接着修改gitlab-runner使用的docker镜像,重启gitlab-runner。

最后在gitlab-runner页面手动测试,然后就可以了。