升级Angular 15+后Jenkins执行Karma测试构建卡住问题
我们通过frontend-maven-plugin构建Angular UI,升级至Angular 15+后,Karma单元测试全部通过(无跳过用例),但Jenkins构建在测试阶段结束后完全停滞,无任何后续动作。移除单元测试环节后,构建可正常完成。
已尝试以下优化措施,均未解决问题:
- 禁用Chrome沙箱
- 启用无头模式
- 设置
watch=false - 设置
progress=false
Jenkins日志最后一行显示:
[2023-07-20T10:24:57.311Z] [INFO] TOTAL: 3 SUCCESS
即使新建带有Karma测试的Angular 15+项目,Jenkins构建仍会卡住。
Jenkins流水线执行步骤
- 下载并安装Node.js及npm:
<id>install node and npm</id> <goals> <goal>install-node-and-npm</goal> <nodeDownloadRoot> https://artifactory.swisscom.com/artifactory/nodejs-dist-remote-cache/ </nodeDownloadRoot> <npmDownloadRoot>https://artifactory.swisscom.com/artifactory/npm-remote/npm/-/
- 执行
npm ci - 执行
npm test
package.json关键配置
- 测试命令:
"test": "ng test --source-map=false --watch=false --browsers=ChromeHeadless --progress=false"
- 依赖版本:
"@angular/animations": "^16.1.0", "@angular/common": "^16.1.0", "@angular/compiler": "^16.1.0", "@angular/core": "^16.1.0", "@angular/forms": "^16.1.0", "@angular/platform-browser": "^16.1.0", "@angular/platform-browser-dynamic": "^16.1.0", "@angular/router": "^16.1.0", "devDependencies": { "@angular-devkit/build-angular": "^16.1.4", "@angular/cli": "~16.1.4", "@angular/compiler-cli": "^16.1.0", "@types/jasmine": "~4.3.0", "jasmine-core": "~4.6.0", "karma": "~6.4.0", "karma-chrome-launcher": "~3.1.1", "karma-coverage": "~2.2.0", "karma-jasmine": "~5.1.0", "karma-jasmine-html-reporter": "~2.1.0", "typescript": "~5.1.3" }
可行解决方法
1. 补充ChromeHeadless启动参数
给ChromeHeadless添加针对Jenkins环境的适配参数,修改test命令:
"test": "ng test --source-map=false --watch=false --browsers=ChromeHeadless --progress=false --no-sandbox --disable-gpu --disable-dev-shm-usage --single-run"
其中--disable-dev-shm-usage会让Chrome使用临时文件替代共享内存,避免Jenkins节点因/dev/shm空间不足导致进程挂起;--single-run强制测试完成后立即退出。
2. 移除Karma Jasmine HTML报告器
karma-jasmine-html-reporter在无头环境下可能存在进程未正常退出的问题,临时移除该依赖并修改配置:
- 从devDependencies中删除
karma-jasmine-html-reporter - 修改
karma.conf.js,去掉require('karma-jasmine-html-reporter')引用及对应的reporter配置项
3. 强制终止Karma进程
在npm test命令后添加进程清理逻辑,确保测试完成后彻底关闭Karma相关进程:
"test": "ng test --source-map=false --watch=false --browsers=ChromeHeadless --progress=false && pkill -f karma"
也可以在Jenkins流水线的npm test步骤后,单独添加一个Shell步骤执行pkill -f karma。
4. 升级Karma及Chrome启动器版本
当前karma-chrome-launcher版本较旧,升级至适配Angular 16的稳定版:
"karma": "~6.4.2", "karma-chrome-launcher": "^3.2.0"
更新后重新执行npm ci安装依赖。
5. 检查Jenkins节点资源
Jenkins节点内存、CPU不足可能导致Chrome进程无法正常退出,查看节点资源使用情况,必要时增加节点内存配额。
内容的提问来源于stack exchange,提问作者anurag

