diff --git a/.gitea/workflows/devstar-studio-e2e.yaml b/.gitea/workflows/devstar-studio-e2e.yaml index 52f4ff535f..2a09ffd0f1 100644 --- a/.gitea/workflows/devstar-studio-e2e.yaml +++ b/.gitea/workflows/devstar-studio-e2e.yaml @@ -32,23 +32,16 @@ jobs: - name: 2.8. Get IP & Wait for DevStar (Health Check) run: | - echo "===== 2.8. 获取 DevStar IP 并等待就绪... =====" - + echo "===== 2.8. 获取 DevStar IP 并等待就绪... =====" CONTAINER_NAME=$(docker ps -a --filter "ancestor=devstar-studio:latest" --format "{{.Names}}" | head -n 1) - echo "Found Container Name: $CONTAINER_NAME" - + echo "Found Container Name: $CONTAINER_NAME" DEVSTAR_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_NAME) echo "Found DevStar Internal IP: $DEVSTAR_IP" sleep 30 - name: 3. Run E2E Tests run: | - COMPOSE_FILE="tests/e2e/docker-compose.test.yml" - echo " Modifying network_mode to host..." - sed -i 's|network_mode: "${E2E_NETWORK_MODE:-bridge}"|network_mode: host|g' "$COMPOSE_FILE" - grep "network_mode" "$COMPOSE_FILE" || echo "警告:文件中未找到 network_mode 字段!" TARGET_URL="http://localhost:80" - make e2e-test TARGET_URL="$TARGET_URL" || true + make e2e-test TARGET_URL="$TARGET_URL" env: GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true" - E2E_NETWORK_MODE: "host" ##TODO 如何输出一份可读的测试报告,现在成功的输出了一些截图和日志 diff --git a/Makefile b/Makefile index fd042a1887..2ca8901627 100644 --- a/Makefile +++ b/Makefile @@ -945,7 +945,7 @@ docker: # support also build args docker build --build-arg GITEA_VERSION=v1.2.3 --build-arg TAGS="bindata sqlite sqlite_unlock_notify" .PHONY: e2e-test -e2e-test: $(E2E_DEPS) +e2e-test: @echo "正在启动E2E-TEST..." @TARGET_URL=$(TARGET_URL) E2E_USERNAME=$(E2E_USERNAME) E2E_PASSWORD=$(E2E_PASSWORD) ./tests/e2e/run-e2e-tests.sh diff --git a/tests/e2e/docker-compose.test.yml b/tests/e2e/docker-compose.test.yml deleted file mode 100644 index 98e64d792a..0000000000 --- a/tests/e2e/docker-compose.test.yml +++ /dev/null @@ -1,26 +0,0 @@ -version: '3.8' - -services: - # 服务: Playwright - test-runner: - # 从 'tests/' 目录下的 Dockerfile 构建 - build: - context: ../../ - dockerfile: tests/e2e/Dockerfile - # 等待 devstar 的 "healthcheck" 通过后,才启动 - user: "${CURRENT_UID}:${CURRENT_GID}" - network_mode: "host" - environment: - - DEVSTAR_URL=${DEVSTAR_URL} - - E2E_SKIP_INSTALL=${E2E_SKIP_INSTALL} - - E2E_USERNAME=${E2E_USERNAME} - - E2E_PASSWORD=${E2E_PASSWORD} - - E2E_MODE=${E2E_MODE} - volumes: - # 也挂载 Docker Socket - - /var/run/docker.sock:/var/run/docker.sock - # 将测试报告写回到宿主机的 ./reports 目录 - - ./reports:/app/playwright-report - # 覆盖默认命令,强制运行测试并生成我们想要的报告 - command: > - npx playwright test diff --git a/tests/e2e/run-e2e-tests.sh b/tests/e2e/run-e2e-tests.sh index 6c6a8d4af7..ce7bc43cbd 100755 --- a/tests/e2e/run-e2e-tests.sh +++ b/tests/e2e/run-e2e-tests.sh @@ -3,65 +3,110 @@ # 它会处理所有清理、权限、拉取和执行工作 # 任何命令失败立即退出 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/5] 清理旧的测试环境... =====" -# 彻底销毁旧的 compose 环境,-v 会删除关联的数据卷 -docker compose -f tests/e2e/docker-compose.test.yml down -v --remove-orphans +echo "===== [1/4] 清理旧的测试环境... =====" +#删除旧的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 echo "清理完成。" echo "" -echo "===== [2/3] 启动并运行测试... =====" +echo "===== [2/4] 准备环境变量... =====" # 检查从 Makefile 传来的 TARGET_URL 变量是否为空 - echo " 模式: [URL模式]. 目标: $TARGET_URL" - export DEVSTAR_URL=$TARGET_URL - export E2E_MODE="url" - if [ -n "$CI" ] || [ "$CI" = "true" ]; then +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}" - HTTP_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" "$PROBE_URL") - if [ "$HTTP_CODE" -eq "$EXPECTED_CODE_IF_INSTALLED" ]; then +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" - export E2E_USERNAME - export E2E_PASSWORD - export E2E_ADMIN_ID - else - echo "没有安装,下面执行安装脚本! " + else + echo " 探测结果: 目标未安装 (HTTP $HTTP_CODE),将执行安装脚本!" export E2E_SKIP_INSTALL="false" - fi fi - command docker compose \ - -f tests/e2e/docker-compose.test.yml \ - up \ - --build \ - --exit-code-from test-runner \ - test-runner +fi +echo "" + +echo "===== [3/4] 构建测试镜像... =====" + +docker build -t e2e-test-runner -f tests/e2e/Dockerfile . +echo "" + +echo "===== [4/4] 启动容器并运行测试... =====" +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 \ + \ + `# 镜像名` \ + e2e-test-runner \ + \ + `# 运行命令` \ + npx playwright test # 捕获 test-runner 的退出码 EXIT_CODE=$? -echo "" -echo "" +set -e -echo "===== [3/3] 测试运行完成 =====" -echo "HTML 报告已生成在: ./reports/html" -ls -l ./tests/e2e/reports/html +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 +exit $EXIT_CODE \ No newline at end of file