From e1e0880ce6b20fb154d06130fc439aa60ecb8e25 Mon Sep 17 00:00:00 2001 From: cheney Date: Thu, 22 Oct 2026 15:20:28 +0800 Subject: [PATCH] =?UTF-8?q?ci:=20dev-*=20=E5=88=86=E6=94=AF=E7=BA=B3?= =?UTF-8?q?=E5=85=A5=20docker-build=20=E8=A7=A6=E5=8F=91=E8=8C=83=E5=9B=B4?= =?UTF-8?q?=20(=E6=9E=84=E5=BB=BA/=E9=83=A8=E7=BD=B2/=E6=95=B0=E6=8D=AE?= =?UTF-8?q?=E5=BA=93=E8=87=AA=E5=8A=A8=E5=8D=87=E7=BA=A7)?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - docker-build.yml: push branches 增加 'dev-*', 与 main/master 同环境部署 - Apply DB migrations 步骤加 migrate status 输出并强调在 Remove old container 之前执行 - readme: 新增「分支与 CI/CD」章节, 说明分支触发矩阵与数据库升级约定 --- .gitea/workflows/docker-build.yml | 18 ++++++++++++++---- readme | 18 ++++++++++++++++++ 2 files changed, 32 insertions(+), 4 deletions(-) diff --git a/.gitea/workflows/docker-build.yml b/.gitea/workflows/docker-build.yml index 06cef12..1f5d06c 100644 --- a/.gitea/workflows/docker-build.yml +++ b/.gitea/workflows/docker-build.yml @@ -1,13 +1,17 @@ name: Docker Build and Push -# 仅 main 分支 push 触发, 其他分支不触发 -# 每次主分支提交: 构建前端 + 生成 OTA 升级包 (签名) → 打进 Docker 镜像 → 部署 +# main / master / dev-* 分支 push 触发, 其他分支不触发 +# 每次提交: 构建前端 + 生成 OTA 升级包 (签名) → 打进 Docker 镜像 → 自动升级数据库 → 部署 # OTA 随镜像发布: 容器内 OTA_PACKAGE_DIR=/app/ota-package 指向打包的 ota-package/ +# +# dev-* (如 dev-0.1 / dev-0.2) 与 main/master 部署到同一套环境 (容器 iboard, 宿主 3001), +# 即开发分支推送 = 直接发布: 数据库共用同一个库, migrate deploy 在启新容器前执行 (幂等). on: push: branches: - main - master + - 'dev-*' jobs: build-image: @@ -57,10 +61,16 @@ jobs: run: docker images - name: Apply DB migrations - # 仓库内的 prisma 迁移自动应用 (migrate deploy 幂等, 无新迁移时为 no-op) + # 数据库自动升级: 按 prisma/migrations/ 下的迁移顺序应用 (dev-* 与 main/master 共库) + # migrate deploy 幂等, 无新迁移时为 no-op + # 位置关键: 在 "Remove old container" 之前 —— 建表/改表成功后才切换流量, + # 迁移失败则整个 workflow 中断, 不会用新镜像顶掉仍在运行的旧容器 env: DATABASE_URL: ${{ secrets.DATABASE_URL }} - run: npx prisma migrate deploy + run: | + set -euo pipefail + npx prisma migrate status || true + npx prisma migrate deploy - name: Remove old container run: docker rm -vf iboard || true diff --git a/readme b/readme index 0257b4a..121ee57 100644 --- a/readme +++ b/readme @@ -17,6 +17,24 @@ - `BUILD_ID` 每次编译自动生成(见 `vite.config.js` 的 `__BUILD_ID__`),无需手动维护。 - `ota-package/latest.json` 为运行时产物,不纳入版本管理。 +## 分支与 CI/CD (Gitea Actions) + +分支按版本命名:`dev-0.1`、`dev-0.2`…… 对应 `docs/V<版本>/` 下的需求/设计文档。 + +| 分支 | 触发的 workflow | 行为 | +| --- | --- | --- | +| `main` / `master` | `docker-build.yml` | 生产发布:构建前端 → 生成签名 OTA 包 → 打 Docker 镜像 → 数据库自动升级 → 重启容器 `iboard` (宿主 3001) | +| `dev-*` | `docker-build.yml` | **与生产同环境**:推送即构建、迁移数据库、部署(开发分支直接顶掉生产,含 OTA 热更) | +| `android-*` | `android-build.yml` | 打签名 release APK 并上传到 Gitea Generic Package Registry | +| 手动 | `ota-build.yml` / `sync-registry.yml` | 单独出 OTA 包 / 同步 secrets 到注册中心 | + +数据库升级约定: +- 唯一入口是 `prisma/migrations/` 下的迁移文件,由 `npx prisma migrate deploy` 在**启新容器之前**执行 + (幂等,无新迁移时为 no-op);迁移失败会中断 workflow,不会用新镜像顶掉仍在运行的旧容器。 +- `dev-*` 与 `main/master` 共用同一个 MariaDB 库(同一个 `DATABASE_URL` secret), + 因此开发分支上的迁移会直接作用到该库结构,合入前请确认迁移可回滚。 +- 本地改了 `prisma/schema.prisma` 后:写迁移 SQL → `npx prisma migrate deploy` 验证 → 提交迁移目录。 + - 首页主要是放经济文章 - 数据主要是放各种经济数据和图表。 - 策略是放按照经济理论组织的相关数据和图表的对比。