diff --git a/.gitea/workflows/devstar-studio-e2e.yaml b/.gitea/workflows/devstar-studio-e2e.yaml index ff95a86102..e51c02fe61 100644 --- a/.gitea/workflows/devstar-studio-e2e.yaml +++ b/.gitea/workflows/devstar-studio-e2e.yaml @@ -1,15 +1,20 @@ -name: DevStar E2E Debug Workflow - +name: DevStar E2E Workflow on: - workflow_dispatch: - + push: + branches: + - main + pull_request: + branches: + - main jobs: - e2e-test-standalone: + e2e-test: runs-on: ubuntu-latest - 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 "正在清理旧环境..." @@ -20,7 +25,7 @@ jobs: run: | echo "===== 2. 正在启动容器... =====" # 说明:install.sh 默认使用宿主机路径 (~/devstar_data) 挂载。 - # 在 CI 环境中,这会导致严重的权限问题 。 + # 在 CI 环境中,可能会导致严重的权限问题 ,比如之前写入文件失败导致容器一直重启。 # 解决方案:动态修改脚本副本,强制将其替换为 Docker 命名卷 。 # 这种修改仅在本次 CI 运行中生效,不会影响源码仓库。 @@ -47,40 +52,12 @@ jobs: - name: 3. Run E2E Tests run: | COMPOSE_FILE="tests/e2e/docker-compose.test.yml" - echo "锁定目标文件: $COMPOSE_FILE" echo " Modifying network_mode to host..." - # 写法 A: 变量形式 sed -i 's|network_mode: "${E2E_NETWORK_MODE:-bridge}"|network_mode: host|g' "$COMPOSE_FILE" grep "network_mode" "$COMPOSE_FILE" || echo "警告:文件中未找到 network_mode 字段!" - - # 4. 运行测试 TARGET_URL="http://localhost:80" make e2e-test TARGET_URL="$TARGET_URL" || true env: GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true" E2E_NETWORK_MODE: "host" - - - name: 3.5. Rescue Screenshot from Container - if: always() - run: | - CONTAINER_ID=$(docker ps -a --filter "name=test-runner" --format "{{.ID}}" | head -n 1) - - if [ -z "$CONTAINER_ID" ]; then - echo "::warning:: 未找到 'test-runner' 容器。无法抢救截图。" - else - echo "正在从容器 $CONTAINER_ID 中复制..." - docker cp $CONTAINER_ID:/tmp/DEBUG-install-page.png ./tests/e2e/reports/DEBUG-install-page.png || echo "Docker CP 失败或截图文件不存在。" - echo "复制完成。" - fi - - name: 4. Upload E2E Test Report - if: always() - uses: actions/upload-artifact@v3 - with: - name: e2e-test-report - path: tests/e2e/reports/ - - name: 5. Display DevStar Container Logs - if: always() - run: | - echo "===== 5. 正在抓取 DevStar (Gitea) 容器日志... =====" - # 'devstar-studio' 是 install.sh 启动的容器的默认名称 - docker logs Devstar-Studio || echo "::warning:: 未能获取 'devstar-studio' 容器日志。" + ##TODO 如何输出一份可读的测试报告,现在成功的输出了一些截图和日志 diff --git a/tests/e2e/README.md b/tests/e2e/README.md index 00dcd11ea8..26115f788b 100644 --- a/tests/e2e/README.md +++ b/tests/e2e/README.md @@ -16,5 +16,6 @@ make e2e-test TARGET_URL="..." E2E_USERNAME="your_name" E2E_PASSWORD="your_passw ##说明:目前有两种测试的用法, 1.主要的流程是通过make devstar 本地代码构建镜像,public/assets/install.sh start --image=devstar-studio:latest 通过install.sh脚本创建容器,并在make e2e-test TARGET_URL="..."中输入devstar容器的url,如果首次安装会执行安装脚本,如果已经安装过,请输入你的账号,密码,否则按默认账号和密码登录。 2.单机CI使用make e2e-test,由脚本执行容器的创建,安装和测试,需要docker环境和项目代码。 - + +3.测试用例的添加方法:所有的测试按照功能分组:devcontainer,appstore,runner等等,每一个test函数对应一组或一个测试用例。 diff --git a/tests/e2e/specs/devcontainer.e2e.test.ts b/tests/e2e/specs/devcontainer.e2e.test.ts index bcda519b99..43dfdf2397 100644 --- a/tests/e2e/specs/devcontainer.e2e.test.ts +++ b/tests/e2e/specs/devcontainer.e2e.test.ts @@ -2,6 +2,7 @@ import { test, expect } from '@playwright/test'; import { link } from 'node:fs'; import { env } from 'node:process'; import { Login } from './utils.e2e'; +import { time } from 'node:console'; const DEFAULT_E2E_USER = 'testuser'; @@ -60,9 +61,24 @@ test('DevContainer 功能和配置', async ({ page,context }) => { console.log("创建开发容器"); await page.getByRole('button', { name: '创建开发容器' }).click(); - console.log("正在创建"); - await expect(page.getByRole('button', { name: '停止开发容器' })) - .toBeVisible({ timeout: 180000 }); + console.log("正在创建"); + const stopButton = page.getByRole('button', { name: '停止开发容器' }); + try { + console.log('正在等待容器创建'); + //第一阶段刷新页面 + await expect(stopButton).toBeVisible({ timeout: 60000 }); + + } catch (error) { + //刷新第一次 + await page.reload({ waitUntil: 'domcontentloaded' }); + console.log('60s,正在刷新页面...'); + //加载service可能比较慢 + await page.waitForTimeout(180000); + console.log('刷新页面完成,继续等待 (阶段2: 60s)...'); + //第二次刷新,容器应该正常启动了 + await page.reload({ waitUntil: 'domcontentloaded' }); + await expect(stopButton).toBeVisible({ timeout: 30000 }); +} console.log("Dev container 创建成功!"); await page.getByRole('button',{ name: '停止开发容器'}).click(); console.log("正在停止"); @@ -84,7 +100,8 @@ test('DevContainer 功能和配置', async ({ page,context }) => { await page.locator('#delete-repo-devcontainer-of-user-modal') .getByRole('button', { name: '确认操作' }) .click(); - console.log('正在删除!'); + console.log('正在删除!,可能较慢请等待'); + await page.waitForTimeout(3000); await expect(page.getByRole('button', { name: '创建开发容器' })).toBeVisible(); console.log('成功删除!'); console.log("test1 检查通过!"); @@ -135,7 +152,7 @@ test('权限修改相关', async ({ page }) => { await page.locator('#repo_name_to_delete').fill(repoName); console.log("正在点击最终的删除确认按钮..."); - await page.getByRole('button', { name: '删除本仓库' }).click(); + await page.locator('#delete-repo-modal').getByRole('button', { name: '删除本仓库' }).click(); }); })