Some checks are pending
CI / 代码检查和类型检查 (push) Waiting to run
CI / 构建应用 (push) Blocked by required conditions
CI / 安全扫描 (push) Waiting to run
Deploy / 构建并推送 Docker 镜像 (push) Waiting to run
Deploy / 部署到生产环境 (push) Blocked by required conditions
Deploy / 部署到测试环境 (push) Blocked by required conditions
Deploy / 部署通知 (push) Blocked by required conditions
添加 CI/CD 工作流配置文件,包括: - ci.yml: 代码检查、构建和安全扫描 - deploy.yml: 构建 Docker 镜像和部署到不同环境 - database.yml: 数据库迁移、备份和回滚操作 - README.md: 工作流使用说明和配置指南
134 lines
No EOL
3.8 KiB
YAML
134 lines
No EOL
3.8 KiB
YAML
name: Database Migration
|
||
|
||
on:
|
||
workflow_dispatch:
|
||
inputs:
|
||
action:
|
||
description: '数据库操作'
|
||
required: true
|
||
default: 'migrate'
|
||
type: choice
|
||
options:
|
||
- migrate
|
||
- backup
|
||
- rollback
|
||
environment:
|
||
description: '目标环境'
|
||
required: true
|
||
default: 'production'
|
||
type: choice
|
||
options:
|
||
- production
|
||
- staging
|
||
- development
|
||
|
||
env:
|
||
NODE_VERSION: '20'
|
||
|
||
jobs:
|
||
database-migrate:
|
||
name: 数据库迁移
|
||
runs-on: docker
|
||
container:
|
||
image: node:20-alpine
|
||
if: github.event.inputs.action == 'migrate'
|
||
environment: ${{ github.event.inputs.environment }}
|
||
|
||
steps:
|
||
- name: 检出代码
|
||
uses: https://code.forgejo.org/actions/checkout@v4
|
||
|
||
- name: 安装依赖
|
||
run: |
|
||
yarn config set registry https://registry.npmmirror.com
|
||
yarn install --frozen-lockfile
|
||
|
||
- name: 数据库迁移
|
||
run: |
|
||
echo "执行数据库迁移..."
|
||
yarn drizzle-kit migrate
|
||
env:
|
||
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
||
POSTGRES_HOST: ${{ secrets.POSTGRES_HOST }}
|
||
POSTGRES_PORT: ${{ secrets.POSTGRES_PORT }}
|
||
POSTGRES_DB: ${{ secrets.POSTGRES_DB }}
|
||
POSTGRES_USER: ${{ secrets.POSTGRES_USER }}
|
||
POSTGRES_PASSWORD: ${{ secrets.POSTGRES_PASSWORD }}
|
||
|
||
- name: 验证迁移结果
|
||
run: |
|
||
echo "验证数据库迁移结果..."
|
||
# 可以添加数据库连接测试
|
||
node -e "
|
||
const { drizzle } = require('drizzle-orm/postgres-js');
|
||
const postgres = require('postgres');
|
||
const sql = postgres(process.env.DATABASE_URL);
|
||
const db = drizzle(sql);
|
||
console.log('数据库连接成功');
|
||
sql.end();
|
||
"
|
||
|
||
database-backup:
|
||
name: 数据库备份
|
||
runs-on: docker
|
||
container:
|
||
image: postgres:15-alpine
|
||
if: github.event.inputs.action == 'backup'
|
||
environment: ${{ github.event.inputs.environment }}
|
||
|
||
steps:
|
||
- name: 创建数据库备份
|
||
run: |
|
||
echo "创建数据库备份..."
|
||
BACKUP_FILE="backup_$(date +%Y%m%d_%H%M%S).sql"
|
||
pg_dump $DATABASE_URL > $BACKUP_FILE
|
||
echo "备份文件: $BACKUP_FILE"
|
||
env:
|
||
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
||
|
||
- name: 上传备份文件
|
||
uses: https://code.forgejo.org/actions/upload-artifact@v4
|
||
with:
|
||
name: database-backup-${{ github.event.inputs.environment }}
|
||
path: "*.sql"
|
||
retention-days: 30
|
||
|
||
database-rollback:
|
||
name: 数据库回滚
|
||
runs-on: docker
|
||
container:
|
||
image: node:20-alpine
|
||
if: github.event.inputs.action == 'rollback'
|
||
environment: ${{ github.event.inputs.environment }}
|
||
|
||
steps:
|
||
- name: 检出代码
|
||
uses: https://code.forgejo.org/actions/checkout@v4
|
||
|
||
- name: 安装依赖
|
||
run: |
|
||
yarn config set registry https://registry.npmmirror.com
|
||
yarn install --frozen-lockfile
|
||
|
||
- name: 数据库回滚
|
||
run: |
|
||
echo "执行数据库回滚..."
|
||
# 注意:drizzle-kit 可能不直接支持回滚,需要手动处理
|
||
echo "请手动执行回滚操作或使用备份恢复"
|
||
env:
|
||
DATABASE_URL: ${{ secrets.DATABASE_URL }}
|
||
|
||
notify-result:
|
||
name: 通知结果
|
||
runs-on: docker
|
||
container:
|
||
image: alpine:latest
|
||
needs: [database-migrate, database-backup, database-rollback]
|
||
if: always()
|
||
|
||
steps:
|
||
- name: 发送通知
|
||
run: |
|
||
echo "数据库操作完成: ${{ github.event.inputs.action }}"
|
||
echo "环境: ${{ github.event.inputs.environment }}"
|
||
# 可以集成通知服务 |