Files
devstar/tests/e2e/run-e2e-tests.sh

128 lines
4.4 KiB
Bash
Executable File
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
#!/bin/bash
# 这是一个“一键运行”E2E 测试的脚本
# 它会处理所有清理、权限、拉取和执行工作
# 任何命令失败立即退出
set -e
# 获取脚本所在目录和项目根目录test/e2e和devstar项目根目录
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
PROJECT_ROOT=$( cd -- "$SCRIPT_DIR/../.." &> /dev/null && pwd )
# 导出当前用户 ID防止 Docker 生成 root 权限文件
export CURRENT_UID=$(id -u)
export CURRENT_GID=$(id -g)
# 切换到项目根目录
cd "$PROJECT_ROOT"
echo "===== [1/3] 清理旧的测试环境... ====="
#删除旧的e2e-runner
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] 准备环境变量... ====="
# 检查从 Makefile 传来的 TARGET_URL 变量是否为空
echo " 检查devstar位置:TARGET_URL"
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 --rm --init --ipc=host \
--name e2e-test-runner-container \
\
`# 网络模式host` \
--network host \
\
`# 用户权限映射` \
-u "$CURRENT_UID:$CURRENT_GID" \
\
`# 环境变量注入` \
-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" \
\
`# 挂载 Volume ` \
-v /var/run/docker.sock:/var/run/docker.sock \
-v "$(pwd)/tests/e2e/reports":/app/playwright-report \
-v "$(pwd)/tests/e2e/package.json":/app/package.json \
-v "$(pwd)/playwright.config.ts":/app/playwright.config.ts \
-v "$(pwd)/tests/e2e/global-setup.ts":/app/global-setup.ts \
-v "$(pwd)/tests/e2e/specs":/app/specs \
-v "$(pwd)/tests/e2e/node_modules":/app/node_modules \
-v "$(pwd)/tests/e2e/package-lock.json":/app/package-lock.json \
\
-w /app \
\
`# 临时 npm 缓存目录,防止权限问题` \
-e npm_config_cache=/tmp/npm-cache \
-e HOME=/tmp \
\
`# 镜像名` \
mcr.microsoft.com/playwright:v1.53.2-jammy \
`# 运行命令` \
bash -c "echo '正在安装依赖...' && npm install --no-package-lock&& echo '依赖安装完成,开始测试...' && npx playwright test"
# 捕获 test-runner 的退出码
EXIT_CODE=$?
set -e
echo "========================================"
if [ $EXIT_CODE -eq 0 ]; then
echo "测试执行成功!"
else
echo "测试执行失败!"
fi
echo "========================================"
REPORT_DIR="./tests/e2e/reports"
if [ -f "$REPORT_DIR/html/index.html" ]; then
echo "HTML 报告已生成: $REPORT_DIR//html/index.html"
else
echo "未检测到HTML报告 "
echo "可能是测试运行中途崩溃,或者未生成报告。"
echo "请检查日志或目录: $REPORT_DIR"
fi
echo ""
# 以 test-runner 的退出码退出
exit $EXIT_CODE