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

126 lines
3.8 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
#基础配置与路径定义
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.
mkdir -p ./tests/e2e/node_modules
chmod 777 ./tests/e2e/node_modules
LOCK_FILE="./tests/e2e/package-lock.json"
# 确保 lock 文件存在且可写
if [ ! -f "$LOCK_FILE" ]; then
echo "{}" > "$LOCK_FILE"
fi
chmod 666 "$LOCK_FILE"
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 状态码
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/"
echo "HTML 报告已生成: $REPORT_DIR"
echo ""
exit $EXIT_CODE