#!/bin/bash # 这是一个“一键运行”E2E 测试的脚本 # 它会处理所有清理、权限、拉取和执行工作 # 任何命令失败立即退出 set -e SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) PROJECT_ROOT=$( cd -- "$SCRIPT_DIR/../.." &> /dev/null && pwd ) export CURRENT_UID=$(id -u) export CURRENT_GID=$(id -g) cd "$PROJECT_ROOT" echo "===== [1/3] 清理旧的测试环境... =====" if [ "$(docker ps -aq -f name=e2e-test-runner-container)" ]; then docker rm -f e2e-test-runner-container fi docker image prune -f rm -rf ./tests/e2e/reports ./tests/e2e/test-data mkdir -p ./tests/e2e/reports/html ./tests/e2e/test-data/devstar_data chmod -R 777 ./tests/e2e/reports #这里添加的代码是因为需要执行npm install,我们以当前用户启动测试容器,避免root权限冲突,所以先预构建文件夹,也作为缓存,缓存npm install. echo "处理 node_modules 权限..." mkdir -p ./tests/e2e/node_modules chmod 777 ./tests/e2e/node_modules LOCK_FILE="./tests/e2e/package-lock.json" if [ ! -f "$LOCK_FILE" ]; then echo "{}" > "$LOCK_FILE" fi # 给它满权限,让 npm 能改 chmod 666 "$LOCK_FILE" echo "清理完成。" echo "" echo "===== [2/3] 准备环境变量... =====" export DEVSTAR_URL=$TARGET_URL export E2E_MODE="url" if [ -n "$CI" ] || [ "$CI" = "true" ]; then echo " [CI环境] 检测到 CI 环境,跳过 curl 安装状态检查..." export E2E_SKIP_INSTALL="false" else echo " 正在检查安装状态..." PATH_TO_CHECK="/user/login" EXPECTED_CODE_IF_INSTALLED="200" PROBE_URL="${TARGET_URL}${PATH_TO_CHECK}" # 使用 curl 检测目标是否已安装 HTTP_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" "$PROBE_URL") if [ "$HTTP_CODE" -eq "$EXPECTED_CODE_IF_INSTALLED" ]; then echo " 探测结果: 目标已安装 (在 ${PROBE_URL} 收到 HTTP ${HTTP_CODE})." export E2E_SKIP_INSTALL="true" else echo " 探测结果: 目标未安装 (HTTP $HTTP_CODE),将执行安装脚本!" export E2E_SKIP_INSTALL="false" fi fi echo "" echo "===== [3/3] 启动容器并运行测试... =====" set +e docker run -d --rm --init --ipc=host \ --name e2e-test-runner-container \ -u "root" \ -e DEVSTAR_URL="$DEVSTAR_URL" \ -e E2E_SKIP_INSTALL="$E2E_SKIP_INSTALL" \ -e E2E_USERNAME="$E2E_USERNAME" \ -e E2E_PASSWORD="$E2E_PASSWORD" \ -e E2E_MODE="$E2E_MODE" \ -e CI="$CI" \ -e npm_config_cache=/tmp/npm-cache \ -e HOME=/tmp \ -w /app \ -v /var/run/docker.sock:/var/run/docker.sock \ mcr.microsoft.com/playwright:v1.53.2-jammy \ tail -f /dev/null echo "容器已启动,正在使用 docker cp 注入代码..." docker cp "$(pwd)/tests/e2e/package.json" e2e-test-runner-container:/app/package.json docker cp "$(pwd)/playwright.config.ts" e2e-test-runner-container:/app/playwright.config.ts docker cp "$(pwd)/tests/e2e/global-setup.ts" e2e-test-runner-container:/app/global-setup.ts docker cp "$(pwd)/tests/e2e/specs" e2e-test-runner-container:/app/specs docker exec e2e-test-runner-container bash -c " # 确保 node_modules 目录存在 mkdir -p /app/node_modules echo '正在安装依赖...' npm install --no-package-lock echo '依赖安装完成,开始测试...' npx playwright test " EXIT_CODE=$? set -e docker cp e2e-test-runner-container:/app/playwright-report/. tests/e2e/reports/html-report/ docker rm -f e2e-test-runner-container echo "========================================" if [ $EXIT_CODE -eq 0 ]; then echo "测试执行成功!" else echo "测试执行失败!" fi echo "========================================" REPORT_DIR="./tests/e2e/reports/" if [ -f "$REPORT_DIR" ]; then echo "HTML 报告已生成: $REPORT_DIR" else echo "未检测到HTML报告 " echo "可能是测试运行中途崩溃,或者未生成报告。" echo "请检查日志或目录: $REPORT_DIR" fi echo "" exit $EXIT_CODE