签入版本

This commit is contained in:
2026-10-08 17:50:29 +08:00
parent 809750b47e
commit e213a9b31d
444 changed files with 39366 additions and 37533 deletions
+44 -54
View File
@@ -4,14 +4,18 @@
本节介绍项目的持续集成/持续部署(CI/CD)方案,包括 GitHub Actions 和 GitLab CI 的配置示例,以及自动化测试、构建和部署流程。
:::
:::info 模板说明
本项目仓库当前未内置 `.github/workflows` 或 `.gitee/workflows`,以下配置为**通用模板**:按实际代码托管平台(GitHub / Gitee / GitLab)调整后放入对应目录即可使用。
:::
## 流水线架构
```text
代码提交 → 代码检查 → 单元测试 → 构建打包 → 部署上线
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Git Push ESLint PHPUnit Docker 生产环境
PHPStan Vitest Image
Git Push Pint PHPUnit Docker 生产环境
ESLint (sqlite) Image
```
## GitHub Actions
@@ -23,8 +27,9 @@
# .github/workflows/backend-ci.yml — 后端持续集成
# =============================================================================
# 触发条件:push 到 main/develop 分支,或向 main 发起 PR
# 执行环境:Ubuntu 最新版 + MySQL 8.0 服务容器
# 流程:代码检查 → 静态分析 → 单元测试 → 覆盖率上传
# 执行环境:Ubuntu 最新版
# 流程:代码风格检查 → 单元测试 → 覆盖率上传
# 说明:phpunit.xml 已配置 sqlite :memory: 测试库,无需外部数据库服务
# =============================================================================
name: Backend CI
@@ -39,34 +44,16 @@ jobs:
test:
runs-on: ubuntu-latest # 使用 GitHub 托管的最新 Ubuntu 运行器
# -------------------------------------------------------------------------
# 服务容器(GitHub Actions 自动启动,与运行器共享网络)
# -------------------------------------------------------------------------
services:
mysql:
image: mysql:8.0 # MySQL 8.0 官方镜像
env:
MYSQL_ROOT_PASSWORD: root # 测试环境密码(仅用于 CI)
MYSQL_DATABASE: test_db # 自动创建的测试数据库
ports:
- 3306:3306 # 暴露端口供测试连接
# 健康检查:确保 MySQL 就绪后再执行后续步骤
options: >-
--health-cmd="mysqladmin ping" # 用 mysqladmin ping 检测
--health-interval=10s # 每 10 秒检查一次
--health-timeout=5s # 超时时间
--health-retries=3 # 重试 3 次后判定失败
steps:
# 拉取代码(checkout@v4 是 GitHub 官方 Action)
- uses: actions/checkout@v4
# 安装 PHP 8.2 及所需扩展
# 安装 PHP 8.3 及所需扩展
- name: Setup PHP
uses: shivammathur/setup-php@v2 # 第三方 Action,自动安装 PHP
with:
php-version: '8.2' # PHP 版本
extensions: pdo_mysql, gd, redis # 安装的扩展
php-version: '8.3' # PHP 版本(Laravel 13 要求)
extensions: pdo_mysql, mbstring, gd, bcmath, zip, redis
coverage: xdebug # 代码覆盖率工具
# 安装 Composer 依赖(--no-progress 隐藏进度条,--prefer-dist 下载压缩包更快)
@@ -77,19 +64,16 @@ jobs:
- name: Prepare Environment
run: |
cp .env.example .env # 复制环境配置模板
php think db:migrate # 执行数据库迁移
php artisan key:generate # 生成应用密钥
# 代码风格检查(PSR-12 标准)
# 代码风格检查(Laravel Pint,PSR-12 + Laravel 风格)
- name: Code Style Check
run: vendor/bin/phpcs --standard=PSR12 app/
run: vendor/bin/pint --test
# 静态分析(level=5 为严格模式,可发现潜在 bug)
- name: Static Analysis
run: vendor/bin/phpstan analyse app/ --level=5
# 运行单元测试(--coverage-text 输出文本格式覆盖率报告)
# 运行单元测试(composer test = config:clear + artisan test,
# phpunit.xml 使用 sqlite :memory:,不依赖 MySQL)
- name: Run Tests
run: php think test --coverage-text
run: composer test -- --coverage-text
# 上传覆盖率报告到 Codecov(免费的覆盖率追踪平台)
- name: Upload Coverage
@@ -98,6 +82,10 @@ jobs:
file: ./coverage.xml # 覆盖率报告文件
```
:::tip 无外部依赖的测试
`phpunit.xml` 将 `DB_CONNECTION` 设为 `sqlite`、`DB_DATABASE` 设为 `:memory:`,单元测试在内存库中运行,CI 无需启动 MySQL 容器。如需对真实 MySQL 做集成测试,再参考下文 GitLab CI 的 services 配置。
:::
### 前端 CI 配置
```yaml
@@ -105,7 +93,7 @@ jobs:
# .github/workflows/frontend-ci.yml — 前端持续集成
# =============================================================================
# 触发条件:仅当 ui/ 目录下的文件变更时触发(避免后端改动触发前端 CI)
# 流程:Lint → 类型检查 → 单元测试 → 构建
# 流程:Lint → 类型检查 → 构建
# =============================================================================
name: Frontend CI
@@ -127,11 +115,11 @@ jobs:
steps:
- uses: actions/checkout@v4
# 安装 Node.js 18 并配置 pnpm 缓存
# 安装 Node.js 22 并配置 pnpm 缓存
- name: Setup Node.js
uses: actions/setup-node@v4
with:
node-version: '18' # Node.js 版本
node-version: '22' # Node.js 版本(22 LTS;根目录 Vite 7 要求 20.19+/22.12+)
cache: 'pnpm' # 启用 pnpm 缓存(加速依赖安装)
cache-dependency-path: ui/pnpm-lock.yaml # 缓存依赖的 lockfile 路径
@@ -144,7 +132,7 @@ jobs:
working-directory: ui # 在 ui/ 目录下执行
run: pnpm install --frozen-lockfile
# ESLint 代码风格检查
# ESLint 代码风格检查(脚本自带 --fix,会自动修复可修复问题)
- name: Lint
working-directory: ui
run: pnpm lint:eslint
@@ -154,17 +142,16 @@ jobs:
working-directory: ui
run: pnpm type:check
# 运行单元测试(Vitest)
- name: Run Tests
working-directory: ui
run: pnpm test
# 生产环境构建(验证构建是否成功)
- name: Build
working-directory: ui
run: pnpm build
```
:::info 前端暂无单元测试脚本
`ui/package.json` 未提供 `test` 脚本(如后续引入 Vitest,再补 `pnpm test` 步骤)。
:::
### 自动部署配置
```yaml
@@ -193,6 +180,7 @@ jobs:
- uses: actions/checkout@v4
# 构建 Docker 镜像(用 git commit SHA 作为版本标签)
# 项目自带 Dockerfile 与 docker-compose.yml(含 docker/.env.docker)
- name: Build Docker Image
run: |
docker build -t myapp:${{ github.sha }} . # 用 commit SHA 标记
@@ -214,9 +202,9 @@ jobs:
key: ${{ secrets.SSH_KEY }} # SSH 私钥
script: |
cd /opt/myapp # 进入项目目录
docker-compose pull # 拉取最新镜像
docker-compose up -d # 重建并启动容器
php think db:migrate # 执行数据库迁移
docker compose --env-file docker/.env.docker pull # 拉取最新镜像
docker compose --env-file docker/.env.docker up -d --build
# 数据库结构变更:手动执行 document/mysql 下的 SQL 脚本(本项目无 migration)
```
## GitLab CI
@@ -236,7 +224,7 @@ stages:
# 全局变量(所有 job 共享)
variables:
MYSQL_ROOT_PASSWORD: root # 测试数据库密码
MYSQL_ROOT_PASSWORD: root # 测试数据库密码(集成测试用)
MYSQL_DATABASE: test_db # 测试数据库名
# -----------------------------------------------------------------------------
@@ -244,20 +232,22 @@ variables:
# -----------------------------------------------------------------------------
backend:test:
stage: test
image: php:8.2-cli # PHP 8.2 CLI 镜像
image: php:8.3-cli # PHP 8.3 CLI 镜像
services:
- mysql:8.0 # MySQL 服务容器
- mysql:8.0 # MySQL 服务容器(集成测试用;单元测试走 sqlite 内存库)
script:
# 安装系统依赖(PHP 扩展编译需要)
- apt-get update && apt-get install -y libpq-dev libzip-dev
# 安装 PHP 扩展
- docker-php-ext-install pdo_mysql zip
- pecl install redis && docker-php-ext-enable redis
# 安装 Composer 依赖
- composer install --no-progress
# 准备环境并执行测试
- cp .env.example .env
- php think db:migrate # 数据库迁移
- php think test # 运行测试
- php artisan key:generate
- vendor/bin/pint --test # 代码风格检查
- composer test # 运行测试(phpunit.xml 用 sqlite :memory:)
cache:
key: ${CI_COMMIT_REF_SLUG} # 按分支名缓存
paths:
@@ -268,13 +258,13 @@ backend:test:
# -----------------------------------------------------------------------------
frontend:test:
stage: test
image: node:18 # Node.js 18 镜像
image: node:22 # Node.js 22 镜像
script:
- cd ui
- npm install -g pnpm # 全局安装 pnpm
- pnpm install --frozen-lockfile # 安装依赖
- pnpm lint:eslint # 代码风格检查
- pnpm test # 单元测试
- pnpm type:check # TypeScript 类型检查
- pnpm build # 生产构建
cache:
key: ${CI_COMMIT_REF_SLUG}
@@ -292,7 +282,7 @@ deploy:production:
- docker build -t myapp:$CI_COMMIT_SHA . # 构建镜像
- docker push myapp:$CI_COMMIT_SHA # 推送到仓库
# SSH 到服务器执行部署
- ssh $SERVER_USER@$SERVER_HOST "cd /opt/myapp && docker-compose pull && docker-compose up -d"
- ssh $SERVER_USER@$SERVER_HOST "cd /opt/myapp && docker compose --env-file docker/.env.docker up -d --build"
environment:
name: production
url: https://api.example.com