diff --git a/.gitea/workflows/devstar-studio-e2e.yaml b/.gitea/workflows/devstar-studio-e2e.yaml index 11428e488d..417622ad5f 100644 --- a/.gitea/workflows/devstar-studio-e2e.yaml +++ b/.gitea/workflows/devstar-studio-e2e.yaml @@ -10,9 +10,13 @@ jobs: steps: - name: Check out repository code uses: actions/checkout@v4 - - name: Make Devstar - run : | - make devstar + - name: 1.5 Clean Up Old Data & Containers + run: | + echo "🧹 正在清理旧环境..." + + # 2. 【关键】强制删除旧的数据目录 + # 必须用 sudo,因为里面可能有 root 创建的“顽固”文件 + sudo rm -rf ~/devstar_dat - name: 2. Deploy DevStar Container run: | @@ -25,18 +29,56 @@ jobs: mkdir -p tests/e2e/reports/ sudo chmod -R 777 tests/e2e/reports/ - - name: 2.8. Wait for DevStar to be Ready + - name: 2.8. Get IP & Wait for DevStar (Health Check) run: | - echo "===== 2.8. 正在等待 DevStar (Gitea) 启动... =====" - echo "强制等待 60 秒..." - sleep 40 - echo "等待完成,假设 DevStar 已就绪。" + 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" + + # 2. 获取容器内部 IP (例如 172.17.0.2) + DEVSTAR_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_NAME) + echo "Found DevStar Internal IP: $DEVSTAR_IP" + + TARGET_URL="http://$DEVSTAR_IP:3000" + echo "Target URL set to: $TARGET_URL" + + # 4. 循环探测 (Health Check) + MAX_RETRIES=20 + # 探测登录页,确保服务真的活了 + HEALTH_CHECK_URL="${TARGET_URL}" + + count=0 + while [ $count -lt $MAX_RETRIES ]; do + # -s:静默 -o:不输出内容 -w:只输出状态码 + HTTP_CODE=$(curl -s -o /dev/null -w "%{http_code}" "$HEALTH_CHECK_URL" || true) + + if [ "$HTTP_CODE" = "200" ]; then + echo "✅ [Attempt $count] 服务已就绪: $TARGET_URL (HTTP 200)" + exit 0 + fi + + echo "⏳ [Attempt $count] 等待服务就绪... 当前状态码: $HTTP_CODE" + sleep 2 + count=$((count + 1)) + done + + - name: 3. Run E2E Tests (and allow failure) + run: | + echo "Starting E2E tests against: ${{ env.TARGET_URL }}" + # 这里传入刚才获取到的 IP 地址 + make e2e-test TARGET_URL="${{ env.TARGET_URL }}" || true + env: + GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true" + # 务必保留 host 模式,否则测试容器无法访问 172.x.x.x 的 IP + E2E_NETWORK_MODE: "host" - name: 3. Run E2E Tests (and allow failure) run: | - make e2e-test TARGET_URL="http://host.docker.internal:80" || true + make e2e-test TARGET_URL="http://172.19.0.2:3000" || true env: GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true" + E2E_NETWORK_MODE: "host" - name: 3.5. Rescue Screenshot from Container if: always() diff --git a/tests/e2e/Dockerfile b/tests/e2e/Dockerfile index 965390291e..be31e6415f 100644 --- a/tests/e2e/Dockerfile +++ b/tests/e2e/Dockerfile @@ -18,8 +18,8 @@ RUN npm install # 5. 复制所有的测试代码到容器中 # (包括 playwright.config.ts, global-setup.ts 和 specs/ 目录) -COPY tests/e2e/global-setup.ts ./tests/e2e/ -COPY tests/e2e/specs/ ./tests/e2e/specs/ +COPY tests/e2e/global-setup.ts ./ +COPY tests/e2e/specs/ ./specs/ # 6. 默认命令 CMD ["npx", "playwright", "test"] diff --git a/tests/e2e/docker-compose.test.yml b/tests/e2e/docker-compose.test.yml index 05deee5396..b57dfd335e 100644 --- a/tests/e2e/docker-compose.test.yml +++ b/tests/e2e/docker-compose.test.yml @@ -27,6 +27,7 @@ services: dockerfile: tests/e2e/Dockerfile # 等待 devstar 的 "healthcheck" 通过后,才启动 user: "${CURRENT_UID}:${CURRENT_GID}" + network_mode: "${E2E_NETWORK_MODE:-bridge}" environment: - DEVSTAR_URL=${DEVSTAR_URL} - E2E_SKIP_INSTALL=${E2E_SKIP_INSTALL}