diff --git a/.gitea/workflows/devstar-studio-e2e.yaml b/.gitea/workflows/devstar-studio-e2e.yaml index 8a2fc5d002..85d8f40c96 100644 --- a/.gitea/workflows/devstar-studio-e2e.yaml +++ b/.gitea/workflows/devstar-studio-e2e.yaml @@ -14,13 +14,17 @@ jobs: - name: build Devstar Image run: | make devstar + - name: Install Network Tools + run: | + echo "正在安装 ip 命令..." + sudo apt-get update && sudo apt-get install -y iproute2 - name: start DevStar Container run: | - # 启动容器 + # 启动容器,这里的话需要预先的创建宿主机的对应文件夹 LOGS=$(public/assets/install.sh start \ --port=8082 \ --ssh-port=2224 \ - --data-dir=/tmp/devstar_ci \ + --data-dir=/tmp/devstar_ci \ --image=devstar-studio:latest 2>&1) echo "$LOGS" TARGET_URL=$(echo "$LOGS" | grep -o 'http://[^ ]*' | tail -1 | sed -r "s/\x1B\[([0-9]{1,2}(;[0-9]{1,2})?)?[mGK]//g") @@ -30,7 +34,7 @@ jobs: make e2e-test TARGET_URL="$TARGET_URL" env: GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true" - - name: 4. Upload E2E Test Report + - name: Upload E2E Test Report if: always() uses: actions/upload-artifact@v3 with: diff --git a/public/assets/install.sh b/public/assets/install.sh index 5a848ec372..a20549c92e 100755 --- a/public/assets/install.sh +++ b/public/assets/install.sh @@ -110,7 +110,20 @@ function start { mkdir -p $DATA_DIR sudo chown 1000:1000 $DATA_DIR sudo chmod 666 /var/run/docker.sock - DOMAIN_NAME=$(hostname -I | awk '{print $1}') + DOMAIN_NAME=$(ip route get 1 2>/dev/null | awk '{print $7; exit}') + + if [[ -f "/.dockerenv" ]]; then + if [[ -S "/var/run/docker.sock" ]] && command -v docker >/dev/null 2>&1; then + if docker info 2>/dev/null | grep -q "Storage Driver: vfs"; then + # DinD 环境 - 保持原来的容器IP + : # 什么也不做,使用初始值 + else + # DooD 环境 - 获取宿主机IP + DOMAIN_NAME=$(ip route | grep default | awk '{print $3}' 2>/dev/null) + fi + fi + # 普通容器环境保持原来的容器IP + fi if [ ! -f "${DATA_DIR}/app.ini" ]; then echo "DOMAIN_NAME=$DOMAIN_NAME" else diff --git a/tests/e2e/run-e2e-tests.sh b/tests/e2e/run-e2e-tests.sh index 75bcfd49e4..e3bf667960 100755 --- a/tests/e2e/run-e2e-tests.sh +++ b/tests/e2e/run-e2e-tests.sh @@ -3,40 +3,59 @@ # 它会处理所有清理、权限、拉取和执行工作 # 任何命令失败立即退出 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" @@ -66,10 +85,14 @@ docker run -d --rm --init --ipc=host \ 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 @@ -82,7 +105,11 @@ docker exec e2e-test-runner-container bash -c " " 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 @@ -91,13 +118,9 @@ 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 "HTML 报告已生成: $REPORT_DIR" + echo "" exit $EXIT_CODE \ No newline at end of file