You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于Liquibase与CI/CD的多环境数据库变更自动化方案咨询

Liquibase + CI/CD 多环境数据库自动化部署实施文档

一、理想仓库结构

your-project/
├── src/                      # 应用代码目录
├── liquibase/                # Liquibase核心配置与变更脚本
│   ├── changelog/            # 变更集目录
│   │   ├── master.xml        # 主变更日志,统一引入所有子变更集
│   │   ├── v1.0_initial_schema.xml  # 现有生产库初始结构导出文件
│   │   ├── v1.1_add_user_table.xml  # 示例业务变更集
│   │   └── v1.2_add_order_index.xml # 示例性能优化变更集
│   ├── environments/         # 多环境配置文件
│   │   ├── dev.properties    # 开发环境数据库连接配置
│   │   ├── test.properties   # 测试环境数据库连接配置
│   │   └── prod.properties   # 生产环境配置模板(敏感信息靠环境变量注入)
│   └── scripts/              # 辅助脚本
│       └── generate_initial_changelog.sh
├── .github/workflows/        # GitHub Actions CI/CD配置(或用.gitlab-ci.yml)
│   └── db-deploy.yml
├── .gitignore                # 忽略敏感文件与本地临时文件
└── README.md                 # 项目说明文档

关键文件说明

  • liquibase/changelog/master.xml:变更集入口,统一管理所有版本的变更,示例内容:
<?xml version="1.0" encoding="UTF-8"?>
<databaseChangeLog xmlns="http://www.liquibase.org/xml/ns/dbchangelog"
                   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                   xsi:schemaLocation="http://www.liquibase.org/xml/ns/dbchangelog
                   http://www.liquibase.org/xml/ns/dbchangelog/dbchangelog-4.24.xsd">
    <include file="v1.0_initial_schema.xml" relativeToChangelogFile="true"/>
    <include file="v1.1_add_user_table.xml" relativeToChangelogFile="true"/>
    <!-- 后续变更集按版本顺序添加 -->
</databaseChangeLog>
  • liquibase/environments/*.properties:仅存非敏感配置,密码、密钥等敏感信息通过CI/CD环境变量传入,示例dev.properties:
driver=com.mysql.cj.jdbc.Driver
url=jdbc:mysql://dev-db:3306/your_db
username=${DB_USERNAME}
password=${DB_PASSWORD}
changeLogFile=liquibase/changelog/master.xml
  • .gitignore:需添加规则:
liquibase/environments/*.local.properties
liquibase/logs/

二、实施步骤

1. 同步现有生产库到Liquibase

  • 安装Liquibase CLI,用只读账号连接现有生产库,生成初始变更集:
liquibase --changeLogFile=liquibase/changelog/v1.0_initial_schema.xml generateChangeLog
  • 手动校验生成的XML,删除数据库特定冗余配置(如MySQL的engine属性),提交到仓库。

2. 变更集编写规范

所有数据库操作必须通过变更集实现,遵循以下规则:

  • 每个变更集只做单一原子操作(如新增一张表、添加一个字段),避免部分执行失败导致数据不一致。
  • 每个变更集必须指定唯一id、author和清晰描述,同时编写回滚脚本,示例:
<changeSet id="1.1-add-user-table" author="your-name">
    <description>新增用户表,存储账号基础信息</description>
    <createTable tableName="user">
        <column name="id" type="BIGINT" autoIncrement="true">
            <constraints primaryKey="true" nullable="false"/>
        </column>
        <column name="username" type="VARCHAR(50)">
            <constraints nullable="false" unique="true"/>
        </column>
        <column name="create_time" type="DATETIME">
            <constraints nullable="false"/>
        </column>
    </createTable>
    <rollback>
        <dropTable tableName="user"/>
    </rollback>
</changeSet>

3. 多环境权限与配置管理

  • 敏感信息(数据库密码、账号)存储在CI/CD平台的保密变量中(如GitHub Secrets、GitLab CI Variables),禁止硬编码到仓库文件。
  • 生产环境必须开启手动审批,只有通过测试验证的变更才能触发部署。

4. CI/CD流水线配置(GitHub Actions示例)

创建.github/workflows/db-deploy.yml,实现多环境自动流转:

name: Database Deployment
on:
  push:
    branches: [ main, develop ]
  pull_request:
    branches: [ main ]

jobs:
  deploy-dev:
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/develop'
    steps:
      - uses: actions/checkout@v4
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Install Liquibase
        run: |
          curl -L https://github.com/liquibase/liquibase/releases/download/v4.24.0/liquibase-4.24.0.tar.gz | tar xz
          echo "$PWD/liquibase" >> $GITHUB_PATH
      - name: Deploy to Dev
        env:
          DB_USERNAME: ${{ secrets.DEV_DB_USERNAME }}
          DB_PASSWORD: ${{ secrets.DEV_DB_PASSWORD }}
        run: liquibase --defaultsFile=liquibase/environments/dev.properties update

  deploy-test:
    runs-on: ubuntu-latest
    needs: deploy-dev
    if: github.ref == 'refs/heads/main'
    steps:
      - uses: actions/checkout@v4
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Install Liquibase
        run: |
          curl -L https://github.com/liquibase/liquibase/releases/download/v4.24.0/liquibase-4.24.0.tar.gz | tar xz
          echo "$PWD/liquibase" >> $GITHUB_PATH
      - name: Deploy to Test
        env:
          DB_USERNAME: ${{ secrets.TEST_DB_USERNAME }}
          DB_PASSWORD: ${{ secrets.TEST_DB_PASSWORD }}
        run: liquibase --defaultsFile=liquibase/environments/test.properties update

  deploy-prod:
    runs-on: ubuntu-latest
    needs: deploy-test
    if: github.ref == 'refs/heads/main'
    environment: production
    steps:
      - uses: actions/checkout@v4
      - name: Set up Java
        uses: actions/setup-java@v4
        with:
          java-version: '17'
          distribution: 'temurin'
      - name: Install Liquibase
        run: |
          curl -L https://github.com/liquibase/liquibase/releases/download/v4.24.0/liquibase-4.24.0.tar.gz | tar xz
          echo "$PWD/liquibase" >> $GITHUB_PATH
      - name: Deploy to Production
        env:
          DB_USERNAME: ${{ secrets.PROD_DB_USERNAME }}
          DB_PASSWORD: ${{ secrets.PROD_DB_PASSWORD }}
        run: liquibase --defaultsFile=liquibase/environments/prod.properties update
  • 逻辑说明:
    • develop分支推送自动部署到开发环境
    • main分支推送先部署到测试环境,验证通过后触发生产环境部署(需手动审批)

三、日常操作规范

  • 所有变更先在本地开发环境测试,提交PR后由CI自动部署到测试环境验证
  • 生产环境变更前,确认测试环境无问题,同时准备好回滚预案
  • 定期用liquibase status检查各环境数据库差异,确保版本一致
  • 为生产环境的关键版本打标签,方便追踪与回滚:
liquibase --defaultsFile=liquibase/environments/prod.properties tag "v1.1-prod"

内容的提问来源于stack exchange,提问作者John

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.11 18:05:10