删除了docker-compose文件,现在在run-e2e-tests.sh中构建测试容器,ci脚本也作相应修改

This commit is contained in:
jiaojm
2025-11-21 11:22:30 +08:00
repo.diff.parent bab3befa45
repo.diff.commit 50d912e652
repo.diff.stats_desc%!(EXTRA int=4, int=87, int=75)

repo.diff.view_file

@@ -32,23 +32,16 @@ jobs:
- name: 2.8. Get IP & Wait for DevStar (Health Check) - name: 2.8. Get IP & Wait for DevStar (Health Check)
run: | 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) 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) DEVSTAR_IP=$(docker inspect -f '{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' $CONTAINER_NAME)
echo "Found DevStar Internal IP: $DEVSTAR_IP" echo "Found DevStar Internal IP: $DEVSTAR_IP"
sleep 30 sleep 30
- name: 3. Run E2E Tests - name: 3. Run E2E Tests
run: | 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" TARGET_URL="http://localhost:80"
make e2e-test TARGET_URL="$TARGET_URL" || true make e2e-test TARGET_URL="$TARGET_URL"
env: env:
GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true" GITEA_I_AM_BEING_UNSAFE_RUNNING_AS_ROOT: "true"
E2E_NETWORK_MODE: "host"
##TODO 如何输出一份可读的测试报告,现在成功的输出了一些截图和日志 ##TODO 如何输出一份可读的测试报告,现在成功的输出了一些截图和日志

repo.diff.view_file

@@ -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" # support also build args docker build --build-arg GITEA_VERSION=v1.2.3 --build-arg TAGS="bindata sqlite sqlite_unlock_notify"
.PHONY: e2e-test .PHONY: e2e-test
e2e-test: $(E2E_DEPS) e2e-test:
@echo "正在启动E2E-TEST..." @echo "正在启动E2E-TEST..."
@TARGET_URL=$(TARGET_URL) E2E_USERNAME=$(E2E_USERNAME) E2E_PASSWORD=$(E2E_PASSWORD) ./tests/e2e/run-e2e-tests.sh @TARGET_URL=$(TARGET_URL) E2E_USERNAME=$(E2E_USERNAME) E2E_PASSWORD=$(E2E_PASSWORD) ./tests/e2e/run-e2e-tests.sh

repo.diff.view_file

@@ -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

repo.diff.view_file

@@ -3,65 +3,110 @@
# 它会处理所有清理、权限、拉取和执行工作 # 它会处理所有清理、权限、拉取和执行工作
# 任何命令失败立即退出 # 任何命令失败立即退出
set -e set -e
#
# 获取脚本所在目录和项目根目录test/e2e和devstar项目根目录
SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd ) SCRIPT_DIR=$( cd -- "$( dirname -- "${BASH_SOURCE[0]}" )" &> /dev/null && pwd )
#
PROJECT_ROOT=$( cd -- "$SCRIPT_DIR/../.." &> /dev/null && pwd ) PROJECT_ROOT=$( cd -- "$SCRIPT_DIR/../.." &> /dev/null && pwd )
# 导出当前用户 ID防止 Docker 生成 root 权限文件
export CURRENT_UID=$(id -u) export CURRENT_UID=$(id -u)
export CURRENT_GID=$(id -g) export CURRENT_GID=$(id -g)
# # 切换到项目根目录
cd "$PROJECT_ROOT" cd "$PROJECT_ROOT"
echo "===== [1/5] 清理旧的测试环境... =====" echo "===== [1/4] 清理旧的测试环境... ====="
# 彻底销毁旧的 compose 环境,-v 会删除关联的数据卷 #删除旧的e2e-runner
docker compose -f tests/e2e/docker-compose.test.yml down -v --remove-orphans if [ "$(docker ps -aq -f name=e2e-test-runner-container)" ]; then
docker rm -f e2e-test-runner-container
fi
#清理旧的构建缓存
docker image prune -f docker image prune -f
# 清理并重建报告和数据目录 #清理并重建报告和数据目录
rm -rf ./tests/e2e/reports ./tests/e2e/test-data rm -rf ./tests/e2e/reports ./tests/e2e/test-data
mkdir -p ./tests/e2e/reports/html ./tests/e2e/test-data/devstar_data mkdir -p ./tests/e2e/reports/html ./tests/e2e/test-data/devstar_data
#赋予目录权限,防止挂载后容器无权写入
chmod -R 777 ./tests/e2e/reports
echo "清理完成。" echo "清理完成。"
echo "" echo ""
echo "===== [2/3] 启动并运行测试... =====" echo "===== [2/4] 准备环境变量... ====="
# 检查从 Makefile 传来的 TARGET_URL 变量是否为空 # 检查从 Makefile 传来的 TARGET_URL 变量是否为空
echo " 模式: [URL模式]. 目标: $TARGET_URL" echo " 检查devstar位置:TARGET_URL"
export DEVSTAR_URL=$TARGET_URL export DEVSTAR_URL=$TARGET_URL
export E2E_MODE="url" export E2E_MODE="url"
if [ -n "$CI" ] || [ "$CI" = "true" ]; then if [ -n "$CI" ] || [ "$CI" = "true" ]; then
echo " [CI环境] 检测到 CI 环境,跳过 curl 安装状态检查..." echo " [CI环境] 检测到 CI 环境,跳过 curl 安装状态检查..."
export E2E_SKIP_INSTALL="false" export E2E_SKIP_INSTALL="false"
else else
echo " 正在检查安装状态..." echo " 正在检查安装状态..."
PATH_TO_CHECK="/user/login" PATH_TO_CHECK="/user/login"
EXPECTED_CODE_IF_INSTALLED="200" EXPECTED_CODE_IF_INSTALLED="200"
PROBE_URL="${TARGET_URL}${PATH_TO_CHECK}" PROBE_URL="${TARGET_URL}${PATH_TO_CHECK}"
HTTP_CODE=$(curl -L -s -o /dev/null -w "%{http_code}" "$PROBE_URL") # 使用 curl 检测目标是否已安装
if [ "$HTTP_CODE" -eq "$EXPECTED_CODE_IF_INSTALLED" ]; then 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})." echo " 探测结果: 目标已安装 (在 ${PROBE_URL} 收到 HTTP ${HTTP_CODE})."
export E2E_SKIP_INSTALL="true" export E2E_SKIP_INSTALL="true"
export E2E_USERNAME else
export E2E_PASSWORD echo " 探测结果: 目标未安装 (HTTP $HTTP_CODE),将执行安装脚本!"
export E2E_ADMIN_ID
else
echo "没有安装,下面执行安装脚本! "
export E2E_SKIP_INSTALL="false" export E2E_SKIP_INSTALL="false"
fi
fi fi
command docker compose \ fi
-f tests/e2e/docker-compose.test.yml \ echo ""
up \
--build \ echo "===== [3/4] 构建测试镜像... ====="
--exit-code-from test-runner \
test-runner 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 的退出码 # 捕获 test-runner 的退出码
EXIT_CODE=$? EXIT_CODE=$?
echo "" set -e
echo ""
echo "===== [3/3] 测试运行完成 =====" echo "========================================"
echo "HTML 报告已生成在: ./reports/html" if [ $EXIT_CODE -eq 0 ]; then
ls -l ./tests/e2e/reports/html 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 "" echo ""
# 以 test-runner 的退出码退出 # 以 test-runner 的退出码退出
exit $EXIT_CODE exit $EXIT_CODE