升级Keycloak至24.0.2后Cypress测试失败及容器健康检查异常求助
解决方案:Keycloak 24.0.2 容器健康检查异常与Cypress测试失败问题
一、修复容器健康检查异常
你的健康检查失败核心原因是旧版健康检查逻辑不匹配Quarkus版Keycloak的特性:
- 旧版jboss/keycloak根路径(
/)会返回登录页,但新版Quarkus版Keycloak访问http://localhost:8080会返回302重定向,curl -f会将3xx状态码判定为失败,导致健康检查不通过。 - 新版Keycloak提供了官方标准的健康检查端点,应该替换为就绪检查接口。
具体修复步骤:
- 修改健康检查命令,替换为官方推荐的就绪端点:
healthcheck: test: ['CMD', 'curl', '-f', 'http://localhost:8080/health/ready'] interval: 60s # 新版启动慢,延长检查间隔 timeout: 10s retries: 5 # 增加重试次数,给足启动时间
- 确认容器内curl存在:如果quay.io/keycloak/keycloak:24.0.2镜像默认未安装curl,可改用
wget替代:
test: ['CMD', 'wget', '--spider', '--quiet', 'http://localhost:8080/health/ready']
- 调整启动等待逻辑:如果是docker-compose部署,确保依赖该容器的服务配置了健康检查依赖:
depends_on: adi-adi-auth-1: condition: service_healthy
二、解决Cypress测试通过率暴跌问题
jboss/keycloak(Wildfly版)与quay.io/keycloak/keycloak(Quarkus版)是架构完全重写的版本,UI、API、配置逻辑差异极大,测试失败主要是因为旧测试用例未适配新版变化:
核心排查与修复方向:
检查认证端点路径变化:
旧版token端点:/auth/realms/{realm}/protocol/openid-connect/token
新版端点去掉/auth前缀:/realms/{realm}/protocol/openid-connect/token
若测试中硬编码了旧端点,需全部替换。更新UI元素定位器:
新版登录页、管理控制台的DOM结构完全重构,比如用户名输入框ID、登录按钮选择器都已变更。需通过Cypress录制或开发者工具重新获取新的元素定位规则,替换旧测试用例中的选择器。修正环境变量配置:
旧版管理员用户配置变量KEYCLOAK_USER/KEYCLOAK_PASSWORD在新版中已替换为KC_ADMIN_USER/KC_ADMIN_PASSWORD,若未更新,会导致管理员账户未创建,测试中认证失败。调整测试启动等待逻辑:
新版Keycloak启动耗时更长,需在Cypress测试开始前增加就绪检查:
before(() => { cy.request({ url: 'http://localhost:8080/health/ready', retryOnStatusCodeFailure: true, retryOnNetworkFailure: true, timeout: 120000 // 延长超时时间到2分钟 }).its('status').should('eq', 200) })
- 禁用强制HTTPS(若测试用HTTP):
新版Keycloak默认启用HTTPS,若测试环境使用HTTP,需添加以下环境变量:
KC_HTTP_ENABLED=true KC_HOSTNAME_STRICT=false KC_HOSTNAME_STRICT_HTTPS=false
避免Keycloak强制重定向到HTTPS导致Cypress测试请求失败。
- 排查安全特性冲突:
新版默认启用SameSite Cookie、CSRF保护等特性,若测试用例未适配,可能导致登录、请求失败。可临时禁用这些特性用于测试(生产环境不建议):
KC_SPI_SECURITY_HEADERS_CONTENT_SECURITY_POLICY="frame-src 'self' *;" KC_SPI_SECURITY_HEADERS_X_FRAME_OPTIONS="ALLOW-FROM *"
内容的提问来源于stack exchange,提问作者Sufiyan Ahmed
相关产品推荐
相关产品推荐

