128 lines
4.4 KiB
Bash
Executable File
128 lines
4.4 KiB
Bash
Executable File
#!/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 |