如何实现 MySQL 代码和数据的一站式变更
作为一款开源的关系型数据库管理系统,MySQL 因其体积小灵活性强、运行速度快、成本低而被企业和社区广泛使用。然而在业务迭代中,随着数据的积累和业务场景的复杂化,涉及到数据变更的操作往往会带来额外的心智负担。本文将分析这些痛点,并结合 Zadig 的自定义工作流阐述解决问题的实践,enjoy~
数据变更的痛点
日常研发流程中,涉及到数据变更的场景和痛点包括但不限于:
- 开发工程师在 dev 环境进行开发和自测,某次变更既涉及到数据变更(比如引入新的字段),又有业务代码变更,此时只能先登录到数据库中手动执行变更脚本后,再将代码变更部署到 dev 环境中。
- 业务数据存放于 MySQL 数据库中(比如账号登录信息、用户下单信息),测试(开发)工程师日常在 qa 环境验收时创建了很多临时测试数据,每次测试完毕都需要手动清理这部分脏数据,将数据恢复至初始状态。
- ...
下面以 Zadig 官方提供的 MySQL 数据库变更任务为例,就上述场景分别说明如何在 Zadig 中实现 MySQL 代码、数据的一站式变更,将重复的事情自动化。
准备工作
- 搭建项目 microservice-demo,参考教程 如何使用 GitLab + Zadig 实现产品级持续交付。
- 官方提供的 MySQL 数据库变更任务说明:
- 实现的功能:连接 MySQL 数据库并执行指定的 SQL 脚本,详细逻辑可在 main.go 源码中查阅。
- 源码:mysql-runner,目录结构如下:
mysql-runner # 任务目录
└── v0.0.1 # 版本号
├── Dockerfile # 对应 mysql-runner 的镜像构建 Dockerfile
├── Makefile # mysql-runner 的工程编译文件
├── main.go # mysql-runner 任务的实现源码
└── mysql-runner.yaml # 任务的 YAML 配置文件
实践一:数据、代码一站式变更
第一步:配置工作流
包括:新建自定义工作流 -> 配置数据变更任务 -> 配置构建任务 -> 配置部署任务。
- 新建自定义工作流:点击
新建工作流-> 选择自定义工作流-> 输入工作流名称workflow-dev。 - 配置数据变更任务。
- 添加阶段:点击
+阶段-> 填写阶段名称数据变更。 - 添加任务:点击
+任务-> 选择MySQL 数据库变更。 - 配置任务:填写任务名称
mysql-data-update-> 填写变量的值,本例中配置说明如下:mysql_host:MySQL 数据库的地址,指定为固定值mysql_port:MySQL 数据库的端口号,指定为固定值username:MySQL 数据库的用户名,指定为固定值password:MySQL 数据库的密码,指定为固定值并设置为敏感信息query:要执行的 SQL 脚本,指定为运行时输入
- 添加阶段:点击
至此,数据变更任务配置完毕。
- 配置构建任务。
- 添加
构建阶段 -> 点击+任务-> 选择构建。 - 配置任务名称
build-myapps-> 选择镜像仓库 -> 选择服务组件及构建名称后点击确定。
- 添加
至此,构建任务配置完毕。
- 配置部署任务。
- 添加
部署阶段 -> 点击+任务-> 选择部署。 - 配置任务名称
deploy-myapps-> 选择环境dev-> 指定服务为其他任务输出并选择任务build-myapps。
- 添加
至此所有任务配置完毕,点击保存完成工作流 workflow-dev 的配置。
第二步:执行工作流
点击执行 -> 填写要执行的 SQL 变更脚本 -> 选择需要更新的服务组件及代码信息 -> 启动任务。
本实践中 SQL 变更脚本如下(修改服务
hadas-core的鉴权类型):
use service_config;
update services set auth_type = 2 where service_name = "hadas-core";



实践二:脏数据一键自动清理
第一步:配置工作流
包括:新建自定义工作流 -> 配置构建任务 -> 配置部署任务 -> 配置自动化测试任务 -> 配置数据清理任务。
其中新建自定义工作流 workflow-qa、配置构建任务 build-myapps、部署任务 deploy-myapps 参考实践一,此处不再赘述,下面详细介绍自动化测试和数据清理任务的配置。
- 配置自动化测试任务:添加阶段
自动化测试-> 添加任务 -> 选择通用任务 -> 填写任务配置。
自动化任务配置请根据自己的实际情况配置,本例中自动化测试用于测试商品创建和修改,运行完毕后会导致系统中遗留状态错误的商品数据。


数据清理 -> 添加任务 -> 选择 MySQL 数据库变更 -> 填写任务配置。本例中配置说明如下:
任务名称:handle-dirty-datamysql_host:MySQL 数据库的地址,指定为固定值mysql_port:MySQL 数据库的端口号,指定为固定值username:MySQL 数据库的用户名,指定为固定值password:MySQL 数据库的密码,指定为固定值并设置为敏感信息query:要执行的 SQL 脚本,指定为固定值,本例中脚本如下(删除状态为不在线的商品数据):
use order_info;
delete from product where status = 0;


第二步:执行工作流
点击执行 -> 选择要更新的服务组件及代码信息 -> 选择 qa 环境 -> 启动任务。 


第三步(进阶):配置 Git 触发器,自动清理
- 配置触发器:编辑工作流
workflow-qa-> 点击触发器 -> 配置代码库信息、触发事件和工作流执行变量等。 - 修改代码并提交到代码库后,会触发工作流执行,自动完成
构建 -> 部署 -> 自动化测试 -> 数据清理流程,既保障本次变更的质量,又确保下次的自动化测试执行无后顾之忧。
探索更多实践
本文主要讲解了如何在 Zadig 上实现 MySQL 数据以及代码的一站式变更实践。如果官方提供的 MySQL 数据变更任务不能满足日常需求,可以参考 自定义任务 | Zadig 文档 编写符合自己情况的自定义任务,也欢迎在 Zadig 论坛 分享你的实践~
Zadig,让工程师更专注创造。欢迎加入 开源吐槽群🔥











