解决冲突,删除不必要的代码
This commit is contained in:
@@ -12,29 +12,21 @@ jobs:
|
||||
steps:
|
||||
- name: Check out repository code
|
||||
uses: actions/checkout@v4
|
||||
- name: make devstar
|
||||
- name: 1.0 make devstar
|
||||
run: |
|
||||
make devstar
|
||||
- name: 1.5 Clean Up Old Data & Containers
|
||||
run: |
|
||||
echo "正在清理旧环境..."
|
||||
public/assets/install.sh clean
|
||||
docker volume rm devstar_data_vol || true
|
||||
|
||||
- name: 2. Deploy DevStar Container
|
||||
run: |
|
||||
echo "===== 2. 正在启动容器... ====="
|
||||
# 说明:install.sh 默认使用宿主机路径 (~/devstar_data) 挂载。
|
||||
# 在 CI 环境中,可能会导致严重的权限问题 ,比如之前写入文件失败导致容器一直重启。
|
||||
# 解决方案:动态修改脚本副本,强制将其替换为 Docker 命名卷 。
|
||||
# 这种修改仅在本次 CI 运行中生效,不会影响源码仓库。
|
||||
|
||||
sed -i 's|~/devstar_data|devstar_data_vol|g' public/assets/install.sh
|
||||
public/assets/install.sh start --image=devstar-studio:latest
|
||||
|
||||
public/assets/install.sh start --image=devstar-studio:latest
|
||||
- name: 2.5. Create Report Directory
|
||||
run: |
|
||||
echo "===== 2.5. 正在创建报告目录... ====="
|
||||
|
||||
mkdir -p tests/e2e/reports/
|
||||
sudo chmod -R 777 tests/e2e/reports/
|
||||
|
||||
@@ -47,7 +39,6 @@ jobs:
|
||||
|
||||
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: |
|
||||
|
||||
7
Makefile
7
Makefile
@@ -944,13 +944,6 @@ docker:
|
||||
docker build --disable-content-trust=false -t $(DOCKER_REF) .
|
||||
# support also build args docker build --build-arg GITEA_VERSION=v1.2.3 --build-arg TAGS="bindata sqlite sqlite_unlock_notify"
|
||||
|
||||
|
||||
ifeq ($(TARGET_URL),)
|
||||
E2E_DEPS = devstar
|
||||
else
|
||||
E2E_DEPS =
|
||||
endif
|
||||
|
||||
.PHONY: e2e-test
|
||||
e2e-test: $(E2E_DEPS)
|
||||
@echo "正在启动E2E-TEST..."
|
||||
|
||||
@@ -17,7 +17,7 @@ COPY playwright.config.ts ./
|
||||
RUN npm install
|
||||
|
||||
# 5. 复制所有的测试代码到容器中
|
||||
# (包括 playwright.config.ts, global-setup.ts 和 specs/ 目录)
|
||||
# (包括 global-setup.ts 和 specs/ 目录)
|
||||
COPY tests/e2e/global-setup.ts ./
|
||||
COPY tests/e2e/specs/ ./specs/
|
||||
|
||||
|
||||
@@ -1,5 +0,0 @@
|
||||
services:
|
||||
test-runner:
|
||||
depends_on:
|
||||
devstar:
|
||||
condition: service_healthy
|
||||
@@ -1,25 +1,7 @@
|
||||
version: '3.8'
|
||||
|
||||
services:
|
||||
# 服务一: DevStar
|
||||
devstar:
|
||||
#现在make devstar负责构建镜像
|
||||
image: devstar-studio:latest
|
||||
pull_policy: never
|
||||
ports:
|
||||
- "80:3000"
|
||||
- "2222:2222"
|
||||
volumes:
|
||||
- /var/run/docker.sock:/var/run/docker.sock
|
||||
- ./test-data/devstar_data:/var/lib/gitea
|
||||
- ./test-data/devstar_data:/etc/gitea
|
||||
# 健康检查。test-runner 会等待这个检查通过
|
||||
healthcheck:
|
||||
test: ["CMD-SHELL", "curl -f http://localhost:3000/ || exit 1"]
|
||||
interval: 10s
|
||||
timeout: 5s
|
||||
retries: 30
|
||||
# 服务二: Playwright
|
||||
services:
|
||||
# 服务: Playwright
|
||||
test-runner:
|
||||
# 从 'tests/' 目录下的 Dockerfile 构建
|
||||
build:
|
||||
@@ -27,7 +9,7 @@ services:
|
||||
dockerfile: tests/e2e/Dockerfile
|
||||
# 等待 devstar 的 "healthcheck" 通过后,才启动
|
||||
user: "${CURRENT_UID}:${CURRENT_GID}"
|
||||
network_mode: "${E2E_NETWORK_MODE:-bridge}"
|
||||
network_mode: "host"
|
||||
environment:
|
||||
- DEVSTAR_URL=${DEVSTAR_URL}
|
||||
- E2E_SKIP_INSTALL=${E2E_SKIP_INSTALL}
|
||||
|
||||
@@ -39,34 +39,8 @@ async function globalSetup(config: FullConfig) {
|
||||
await page.screenshot({ path: 'playwright-report/global-setup-login-failure.png' });
|
||||
throw error;
|
||||
}
|
||||
} else if (mode === 'compose') {
|
||||
console.log('[GlobalSetup] 模式: 构建(Compose). 正在执行构建模式的安装脚本...');
|
||||
try {
|
||||
const hostGateway = env.DOCKER_HOST_GATEWAY || '172.17.0.1';
|
||||
const giteaBaseURL = `http://${hostGateway}:80`;
|
||||
const serverDomain = hostGateway;
|
||||
const browser = await chromium.launch();
|
||||
await page.goto(baseURL, { timeout: 15000 });
|
||||
console.log('[GlobalSetup] 检测到安装界面!正在开始自动化安装...');
|
||||
await page.getByRole('textbox', { name: 'Server Domain *' }).fill(serverDomain);
|
||||
await page.getByRole('textbox', { name: 'Gitea Base URL *' }).fill(giteaBaseURL);
|
||||
await page.getByText('Server and Third-Party Service Settings').click();
|
||||
await page.getByRole('checkbox', { name: 'Enable user sign-in via Wechat QR Code.' }).uncheck();
|
||||
await page.getByRole('checkbox', { name: 'Require a CAPTCHA for user' }).uncheck();
|
||||
await page.getByText('Administrator Account Settings').click();
|
||||
await page.getByRole('textbox', { name: 'Administrator Username' }).fill('testuser');
|
||||
await page.getByRole('textbox', { name: 'Email Address' }).fill('ilovcatlyn750314@gmail.com');
|
||||
await page.getByRole('textbox', { name: 'Password', exact: true }).fill('12345678');
|
||||
await page.getByRole('textbox', { name: 'Confirm Password' }).fill('12345678');
|
||||
await page.getByRole('button', { name: 'Install Gitea'}).click();
|
||||
console.log("安装中,请耐心等待");
|
||||
await page.waitForTimeout(90000);
|
||||
} catch (error) {
|
||||
console.error('[GlobalSetup] "构建模式" 安装失败:', error);
|
||||
await page.screenshot({ path: 'playwright-report/global-setup-failure.png' });
|
||||
throw error;
|
||||
}
|
||||
} else {
|
||||
}
|
||||
else {
|
||||
throw new Error(`[GlobalSetup] 未知的 E2E_MODE: "${mode}"`);
|
||||
}
|
||||
await browser.close();
|
||||
|
||||
@@ -21,46 +21,8 @@ mkdir -p ./tests/e2e/reports/html ./tests/e2e/test-data/devstar_data
|
||||
echo "清理完成。"
|
||||
echo ""
|
||||
|
||||
echo "===== [2/5] 设置权限... ====="
|
||||
# 容器内的用户需要写入数据目录
|
||||
chmod -R 777 ./tests/e2e/test-data/devstar_data
|
||||
|
||||
# 【关键】允许容器访问宿主机的 Docker Socket
|
||||
if [ -z "$TARGET_URL" ]; then
|
||||
sudo chmod 666 /var/run/docker.sock
|
||||
echo "权限设置完成。"
|
||||
echo ""
|
||||
else
|
||||
echo "跳过docker.sock权限修改 ====="
|
||||
fi
|
||||
|
||||
if [ -z "$TARGET_URL" ]; then
|
||||
|
||||
echo "===== [3/5] 构建模式: 构建/拉取依赖镜像... ====="
|
||||
#现在make devstar 处理镜像的构建
|
||||
docker pull mengning997/webterminal:latest
|
||||
docker tag mengning997/webterminal:latest devstar.cn/devstar/webterminal:latest
|
||||
|
||||
echo "===== 现在检测Docker宿主机网关====="
|
||||
DOCKER_HOST_GATEWAY="172.17.0.1"
|
||||
if [ "$OS_TYPE" = "Darwin" ]; then
|
||||
DOCKER_HOST_GATEWAY="host.docker.internal"
|
||||
elif [ "$OS_TYPE" = "Linux" ]; then
|
||||
LINUX_IP=$(ip addr show docker0 | grep -Po 'inet \K[\d\.]+')
|
||||
if [ -n "$LINUX_IP" ]; then
|
||||
DOCKER_HOST_GATEWAY=$LINUX_IP
|
||||
else
|
||||
echo "警告: 无法动态检测 'docker0' IP, 回退到 172.17.0.1"
|
||||
fi
|
||||
fi
|
||||
export DOCKER_HOST_GATEWAY
|
||||
else
|
||||
echo "===== [3/5] URL 模式: 跳过依赖镜像和网关检测。 ====="
|
||||
fi
|
||||
echo "===== [4/5] 启动并运行测试... ====="
|
||||
echo "===== [2/3] 启动并运行测试... ====="
|
||||
# 检查从 Makefile 传来的 TARGET_URL 变量是否为空
|
||||
if [ -n "$TARGET_URL" ]; then
|
||||
# --- [A] URL 模式 ---
|
||||
echo " 模式: [URL模式]. 目标: $TARGET_URL"
|
||||
export DEVSTAR_URL=$TARGET_URL
|
||||
export E2E_MODE="url"
|
||||
@@ -90,30 +52,13 @@ if [ -n "$TARGET_URL" ]; then
|
||||
--build \
|
||||
--exit-code-from test-runner \
|
||||
test-runner
|
||||
else
|
||||
# --- [B] 构建模式 ---
|
||||
echo "==> 模式: [构建模式]. 正在本地启动 devstar..."
|
||||
|
||||
# 1. 导出内部 URL
|
||||
export DEVSTAR_URL="http://devstar:3000"
|
||||
export E2E_MODE="compose"
|
||||
export E2E_SKIP_INSTALL="false"
|
||||
echo "即将执行: docker compose -f tests/e2e/docker-compose.test.yml up --build --wait --exit-code-from test-runner"
|
||||
# 2. 启动所有服务
|
||||
command docker compose \
|
||||
-f tests/e2e/docker-compose.test.yml \
|
||||
-f tests/e2e/docker-compose.override.yml \
|
||||
up \
|
||||
--build \
|
||||
--abort-on-container-exit \
|
||||
--exit-code-from test-runner
|
||||
fi
|
||||
# 捕获 test-runner 的退出码
|
||||
EXIT_CODE=$?
|
||||
echo ""
|
||||
echo ""
|
||||
|
||||
echo "===== [5/5] 测试运行完成 ====="
|
||||
echo "===== [3/3] 测试运行完成 ====="
|
||||
echo "HTML 报告已生成在: ./reports/html"
|
||||
ls -l ./tests/e2e/reports/html
|
||||
echo ""
|
||||
|
||||
@@ -65,11 +65,4 @@ if(mode === 'url'){
|
||||
);
|
||||
}
|
||||
}
|
||||
else if(mode=='compose'){
|
||||
await page.fill('#user_name',username);
|
||||
await page.fill('#password', password);
|
||||
await page.getByRole('button', { name: '登录' }).click();
|
||||
await expect(page).toHaveURL(env.DEVSTAR_URL+ '/');
|
||||
console.log(`[LoginHelper] 登录成功!`);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user