签入版本
This commit is contained in:
@@ -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
|
||||
|
||||
Reference in New Issue
Block a user