作为一款开源的关系型数据库管理系统,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";
数据变更任务执行完毕前后分别查看 MySQL 数据效果如下(其中 1 为任务执行前,2 为执行后): 第一个数据变更任务执行完毕后,会自动执行后续的构建和部署任务,实现数据和业务的一站式变更。
实践二:脏数据一键自动清理
第一步:配置工作流
包括:新建自定义工作流 -> 配置构建任务 -> 配置部署任务 -> 配置自动化测试任务 -> 配置数据清理任务。
其中新建自定义工作流 workflow-qa
、配置构建任务 build-myapps
、部署任务 deploy-myapps
参考实践一,此处不再赘述,下面详细介绍自动化测试和数据清理任务的配置。
- 配置自动化测试任务:添加阶段
自动化测试
-> 添加任务 -> 选择通用任务 -> 填写任务配置。
自动化任务配置请根据自己的实际情况配置,本例中自动化测试用于测试商品创建和修改,运行完毕后会导致系统中遗留状态错误的商品数据。
2. 配置数据清理任务:添加阶段数据清理
-> 添加任务 -> 选择 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,让工程师更专注创造。欢迎加入 开源吐槽群?