diff --git a/README.md b/README.md index b6d6baa..07d23fe 100644 --- a/README.md +++ b/README.md @@ -5,23 +5,44 @@ ## 可直接复制使用的模板 - **构建镜像工作流模板**:`build-images.yml` - - 作用:用于在 `<分支>` 分支上构建 Docker 镜像。 + - 作用:用于在 `<自定义分支>` 分支上构建 Docker 镜像。 - 触发条件: - - 推送到 `<分支>` 分支,并且改动包含 `Dockerfile*`、`requirements.txt` 或 `.gitea/workflows/build-images.yml` + - 推送到 `<自定义分支>` 分支,并且改动包含 `Dockerfile*`、`requirements.txt` 或 `.gitea/workflows/build-images.yml` - 手动触发 (`workflow_dispatch`) - 使用方式: 1. 复制该文件到目标项目的 `.gitea/workflows/build-images.yml`(或对应 CI 目录)。 2. 根据项目实际情况修改其中的 ``、`` 以及 `Dockerfile` 路径等参数。 - **Docker 部署工作流模板**:`deploy-docker.yml` - - 作用:在 `<分支>` 分支上,通过 `docker compose` 部署服务。 + - 作用:在 `<自定义分支>` 分支上,通过 `docker compose` 部署服务。 - 触发条件: - - 推送到 `<分支>` 分支 + - 推送到 `<自定义分支>` 分支 - 手动触发 (`workflow_dispatch`) - 使用方式: 1. 复制该文件到目标项目的 `.gitea/workflows/deploy-docker.yml`(或对应 CI 目录)。 2. 确认项目根目录存在 `docker-compose.yml`,并根据需要调整步骤中的命令。 +- **API 健康检查工作流模板**:`e2e-tests.yml` + - 作用:对后端各 API 服务的 `/health` 接口进行健康检查,可支持**多个 IP / 域名**(多个环境)。不再检查前端页面。 + - 触发条件: + - 推送到 `<自定义分支>`(或你自定义的)分支 + - 手动触发 (`workflow_dispatch`) + - 使用方式: + 1. 复制该文件到目标项目的 `.gitea/workflows/e2e-tests.yml`(或对应 CI 目录)。 + 2. 根据实际环境修改 `jobs.e2e.strategy.matrix.target` 中的配置即可复用,例如: + ```yaml + strategy: + fail-fast: false + matrix: + target: + - name: env-local + base_url: http://127.0.0.1 + - name: env-remote + base_url: http://10.0.0.1 + ``` + 3. 如果你的服务端口与模板中的默认值不同,可在 `services` 变量里调整 `name:port` 列表,例如:`auth:5710`、`project:5711` 等。 + 4. 如需调整重试次数、间隔时间或检查路径,可在对应 `curl` 循环处按需修改脚本逻辑。 + ## 其他文件/目录 `actions/`、`docs/` 等其他文件或目录仅作内部使用或扩展示例,对实际在项目中使用上述两个模板不是必需的,你可以忽略它们。 diff --git a/e2e-tests.yml b/e2e-tests.yml new file mode 100644 index 0000000..0f4f576 --- /dev/null +++ b/e2e-tests.yml @@ -0,0 +1,90 @@ +name: End-to-End Tests + +on: + # 默认触发条件,可以在复制到具体仓库后按需调整 + push: + branches: + - offline + workflow_dispatch: + +jobs: + e2e: + runs-on: ubuntu-latest + + strategy: + # 多个 IP / 域名 组合时,互不影响 + fail-fast: false + matrix: + # 在这里配置要检查的环境,只需要改 base_url 即可复用 + target: + - name: offline-145 # 仅用于日志标识 + base_url: http://127.0.0.1 + + steps: + - name: Checkout code + uses: actions/checkout@v4 + with: + ref: offline + fetch-depth: 0 + + - name: Check API services (${{ matrix.target.name }}) + env: + BASE_URL: ${{ matrix.target.base_url }} + run: | + echo "当前检查环境:${BASE_URL}" + + echo "====== 开始检查各 API 服务 /health ======" + + services="\ + service-name:5710 \ + service-name:5711 \ + " + + failed_services="" + api_failed=0 + + for item in $services; do + name="${item%%:*}" + port="${item##*:}" + + echo "" + echo "------ 检查服务 ${name} (端口 ${port}) /health ------" + + success=0 + for i in {1..10}; do + if curl -fsS "${BASE_URL}:${port}/health" > /dev/null; then + success=1 + break + fi + echo "第 ${i} 次重试,等待 5 秒..." + sleep 5 + done + + if [ "${success}" -ne 1 ]; then + echo "✗ 服务 ${name} /health 检查失败" + failed_services="${failed_services} ${name}:${port}" + else + echo "✓ 服务 ${name} /health 正常" + fi + done + + if [ -n "${failed_services}" ]; then + echo "" + echo "✗ 以下服务健康检查失败:" + for s in ${failed_services}; do + echo " - ${s}" + done + api_failed=1 + else + echo "" + echo "====== 所有 API 服务健康检查通过 ======" + fi + + if [ "${api_failed}" -ne 0 ]; then + echo "" + echo "✗ API /health 检查存在失败,详见上方日志" + exit 1 + fi + + echo "" + echo "✓ 所有 API /health 检查通过"