Jenkins中Cypress无头Chrome测试失败:malloc与DISPLAY问题排查
解决Docker中Cypress无头Chrome运行的X server及malloc错误问题
问题根源分析
- 不必要的环境冲突:你使用的
cypress/included官方镜像已经预装了适配版本的Node.js和Cypress,脚本中重新安装NVM、Node.js会导致依赖混乱,触发malloc(): invalid next size (unsorted)内存错误。 - 错误的DISPLAY变量操作:无头Chrome模式不需要X server支持,手动
unset DISPLAY或强制设置空值会干扰镜像的默认配置逻辑,导致X server初始化失败。
修复方案
1. 简化cypress_run.sh脚本
删除所有NVM/Node安装逻辑,直接复用镜像自带的适配环境:
echo "Running Cypress Command" npm install --legacy-peer-deps echo "Installed NPM Packages!" export CYPRESS_BASE_URL="$UNIFIED_URL" export CYPRESS_USERNAME="admin" export CYPRESS_PASSWORD="password" echo "Cypress base Url: ${CYPRESS_BASE_URL}" # 无需手动处理DISPLAY,直接运行无头测试 npx cypress run --record --key <KEY> --browser chrome --headless --config-file cypress.config.js --config baseUrl="$CYPRESS_BASE_URL" username="$CYPRESS_USERNAME" password="$CYPRESS_PASSWORD"
2. 优化Makefile配置
移除冗余参数,简化挂载逻辑:
run-cypress: docker run --rm \ -e UNIFIED_URL=${UNIFIED_URL} \ -e COMMIT_INFO_SHA="$(shell git rev-parse HEAD)" \ -e COMMIT_INFO_MESSAGE="$(shell echo "$(shell git log --format=%B -n 1)" | sed 's/"//g')" \ -e COMMIT_INFO_AUTHOR="$(shell git log --format='%an' -n 1)" \ -e COMMIT_INFO_EMAIL="$(shell git log --format='%ae' -n 1)" \ -v ${JSP_SRC_DIR}/test/e2e-ui:/e2e \ -w /e2e <domain>/cypress/included-jf-cli:13.6.4 ./cypress_run.sh
- 移除
--entrypoint "/bin/bash"(若保留需确保脚本路径正确) - 直接挂载整个
e2e-ui目录,避免逐个挂载文件的繁琐操作 - 非必要情况下移除
--network host,默认桥接网络即可满足测试需求
3. 额外验证项
- 确认镜像兼容性:
cypress/included:13.6.4已预装适配的Chrome版本,无需额外安装浏览器 - 检查
cypress.config.js,确保没有强制启用X11的配置,无头模式参数正常:export default defineConfig({ e2e: { // 其他配置项 chromeWebSecurity: false, experimentalSessionAndOrigin: true } })
核心提示
官方cypress/included镜像已预配置所有Cypress运行所需依赖(包括无头Chrome的适配环境),手动修改Node环境或DISPLAY变量会破坏镜像的原生适配,这是导致本次错误的核心原因。
内容的提问来源于stack exchange,提问作者Soumik Mukherjee
相关产品推荐
相关产品推荐

