如何在jenkins中调查Java堆空间错误



我有一个矩阵管道作业它执行多个阶段(例如~200),其中大多数是功能测试,其结果由以下代码记录:

stage('Report') {
script {
def summary = junit allowEmptyResults: true, testResults: "**/artifacts/${product}/test-reports/*.xml"
def buildURL = "${env.BUILD_URL}"
def TestAnalyzer = buildURL.replace("/${env.BUILD_NUMBER}", "/test_results_analyzer")
def TestsURL = buildURL.replace("job/${env.JOB_NAME}/${env.BUILD_NUMBER}", "blue/organizations/jenkins/${env.JOB_NAME}/detail/${env.JOB_NAME}/${env.BUILD_NUMBER}/tests")
slackSend (
color: summary.failCount == 0 ? 'good' : 'warning',
message: "*<${TestsURL}|Test Summary>* for *${env.JOB_NAME}* on *${env.HOSTNAME} - ${product}* <${env.BUILD_URL}| #${env.BUILD_NUMBER}> - <${TestAnalyzer}|${summary.totalCount} Tests>, Failed: ${summary.failCount}, Skipped: ${summary.skipCount}, Passed: ${summary.passCount}"
)
}
}

问题是这个Report阶段经常失败,并出现以下错误:

> Archive JUnit-formatted test results                        9m 25s
[2022-11-16T02:51:49.569Z] Recording test results
Java heap space

我已经通过修改systemd服务配置将jenkins服务器的堆空间增加到8GB:

software-dev@magnet:~$ sudo cat /etc/systemd/system/jenkins.service.d/override.conf
[Service]
Environment="JAVA_OPTS=-Djava.awt.headless=true -Xmx8g"

被考虑在内,因为我用下面的命令验证了:

software-dev@magnet:~$ tr '' 'n' < /proc/$(pidof java)/cmdline
/usr/bin/java
-Djava.awt.headless=true
-Xmx10g
-jar
/usr/share/java/jenkins.war
--webroot=/var/cache/jenkins/war
--httpPort=8080

我刚刚将堆大小增加到10GB,我将等待今晚构建的结果,但我有一种感觉,这个数量的堆空间看起来真的太多了,所以我怀疑一个插件,也许是JUnit,可能有bug,可能会消耗太多的内存。

有人知道这件事吗?有没有变通的办法?

更重要的是,我可以使用哪些方法来尝试跟踪一个插件是否消耗太多?我从我的CS学位开始就有Java的概念,但我不熟悉jenkins的开发生态系统。

提前谢谢你。

您可以尝试将测试分成块/批处理/组,但这种解决方案需要更改代码。

更多细节https://semaphoreci.com/community/tutorials/how-to-split-junit-tests-in-a-continuous-integration-environment

分组JUnit测试

最新更新