基于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
相关产品推荐
相关产品推荐

