作为一款开源的关系型数据库管理系统,MySQL因其体积小灵活性强、运行速度快、成本低而被企业和社区广泛使用。然而在业务迭代中,随着数据的积累和业务场景的复杂化,涉及到数据变更的操作往往会带来额外的心智负担。本文将分析这些痛点,并结合 Zadig 的自定义工作流阐述解决问题的实践,enjoy~

数据变更的痛点

日常研发流程中,涉及到数据变更的场景和痛点包括但不限于:


  1. 开发工程师在 dev 环境进行开发和自测,某次变更既涉及到数据变更(比如引入新的字段),又有业务代码变更,此时只能先登录到数据库中手动执行变更脚本后,再将代码变更部署到 dev 环境中。

  2. 业务数据存放于 MySQL 数据库中(比如账号登录信息、用户下单信息),测试(开发)工程师日常在 qa 环境验收时创建了很多临时测试数据,每次测试完毕都需要手动清理这部分脏数据,将数据恢复至初始状态。

下面以 Zadig 官方提供的 MySQL 数据库变更任务为例,就上述场景分别说明如何在 Zadig 中实现 MySQL 代码、数据的一站式变更,将重复的事情自动化。

准备工作

  1. 搭建项目 microservice-demo,参考教程如何使用 GitLab + Zadig 实现产品级持续交付[1]

  2. 官方提供的 MySQL 数据库变更任务说明:

    1. 实现的功能:连接 MySQL 数据库并执行指定的 SQL 脚本,详细逻辑可在 main.go 源码中查阅。

    2. 源码:mysql-runner[2],目录结构如下:


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-hostMySQL 数据库的地址,指定为固定值

  • mysql-portMySQL 数据库的端口号,指定为固定值

  • usernameMySQL 数据库的用户名,指定为固定值

  • passwordMySQL 数据库的密码,指定为固定值并设置为敏感信息

  • query要执行的 SQL 脚本,指定为运行时输入

打开网易新闻 查看精彩图片

至此,数据变更任务配置完毕。


配置构建任务

添加「构建」阶段 -> 点击「+任务」-> 选择「构建」。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

配置任务名称「build-myapps」 -> 选择镜像仓库 -> 选择服务组件及构建名称后点击「确定」。

打开网易新闻 查看精彩图片

至此,构建任务配置完毕。

配置部署任务

添加「部署」阶段 -> 点击「+任务」-> 选择「部署」。

打开网易新闻 查看精彩图片

打开网易新闻 查看精彩图片

配置任务名称「deploy-myapps」-> 选择环境 dev -> 指定服务为「其他任务输出」并选择任务 「build-myapps」-> 点击「保存」完成工作流的配置。

打开网易新闻 查看精彩图片

第二步:执行工作流

点击执行 -> 填写要执行的 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」参考实践一,此处不再赘述,下面详细介绍自动化测试和数据清理任务的配置。


配置自动化测试任务

添加阶段「自动化测试」-> 添加任务 -> 选择通用任务 -> 填写任务配置。

自动化任务配置请根据自己的实际情况配置,本例中自动化测试用于测试商品创建和修改,运行完毕后会导致系统中遗留状态错误的商品数据。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

配置数据清理任务

添加阶段「数据清理」-> 添加任务 -> 选择「MySQL 数据库变更」-> 填写任务配置。本例中配置说明如下:

  • 任务名称:handle-dirty-data

  • mysql-host:MySQL 数据库的地址,指定为固定值

  • mysql-port:MySQL 数据库的端口号,指定为固定值

  • username:MySQL 数据库的用户名,指定为固定值

  • password:MySQL 数据库的密码,指定为固定值并设置为敏感信息

  • query:要执行的 SQL 脚本,指定为固定值,本例中脚本如下(删除状态为不在线的商品数据):

添加任务 -> 选择 MySQL 数据库变更 -> 填写任务配置。本例中配置说明如下:"},"attribs":{"0":"*0+d*0*1+4*0+f*0*1+b*0+l"}},"apool":{"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]},"nextNum":2}},"align":"","folded":false,"seq":"2"}},"doxcne4oiYsommGuUoLbO9MCBFx":{"id":"doxcne4oiYsommGuUoLbO9MCBFx","snapshot":{"type":"ordered","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+4*0+i"},"text":{"0":"任务名称:handle-dirty-data"}}},"align":"","folded":false,"seq":"1"}},"doxcnw8k6kGusCyQKJSoSzez8E7":{"id":"doxcnw8k6kGusCyQKJSoSzez8E7","snapshot":{"type":"ordered","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+a*0+k"},"text":{"0":"mysql_host:MySQL 数据库的地址,指定为固定值"}}},"align":"","folded":false,"seq":"auto"}},"doxcnk8aAG2U4sKUG8lKXEyIu9e":{"id":"doxcnk8aAG2U4sKUG8lKXEyIu9e","snapshot":{"type":"ordered","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+a*0+l"},"text":{"0":"mysql_port:MySQL 数据库的端口号,指定为固定值"}}},"align":"","folded":false,"seq":"auto"}},"doxcnoWIGyCkgUO0icbQgnWUlVd":{"id":"doxcnoWIGyCkgUO0icbQgnWUlVd","snapshot":{"type":"ordered","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+8*0+l"},"text":{"0":"username:MySQL 数据库的用户名,指定为固定值"}}},"align":"","folded":false,"seq":"auto"}},"doxcnACuskgkmmcgKU1G60TAnBb":{"id":"doxcnACuskgkmmcgKU1G60TAnBb","snapshot":{"type":"ordered","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+8*0+s"},"text":{"0":"password:MySQL 数据库的密码,指定为固定值并设置为敏感信息"}}},"align":"","folded":false,"seq":"auto"}},"doxcnIeMQis4YqKC0kLstd6LTsh":{"id":"doxcnIeMQis4YqKC0kLstd6LTsh","snapshot":{"type":"ordered","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"initialAttributedTexts":{"text":{"0":"query:要执行的 SQL 脚本,指定为固定值,本例中脚本如下(删除状态为不在线的商品数据):"},"attribs":{"0":"*0*1+5*0+17"}},"apool":{"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]},"nextNum":2}},"align":"","folded":false,"seq":"auto"}},"doxcn6oiqas6EoSc6Yi1ZExT8CC":{"id":"doxcn6oiqas6EoSc6Yi1ZExT8CC","snapshot":{"type":"code","parent_id":"doxcn8gGo8UkWk2YyiIpsG55Fze","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"apool":{"nextNum":1,"numToAttrib":{"0":["author","6999256783185248260"]}},"initialAttributedTexts":{"attribs":{"0":"*0|1+g*0+11"},"text":{"0":"use order_info;\ndelete from product where status = 0;"}}},"align":"","folded":false,"language":"SQL"}},"doxcn2SJcTo6gFJh1kGsRtpSrdl":{"id":"doxcn2SJcTo6gFJh1kGsRtpSrdl","snapshot":{"type":"page","parent_id":"","comments":["7137647336443904002"],"locked":false,"hidden":false,"author":"6999256783185248260","children":["doxcn6GIi4wuAWmYiqytzaP7Oqb","doxcnAoouasEksySYy04xiNxK7d","doxcn0WQCSAeYwA4cs7Npqdq4ph","doxcn8gIcosMWw6mo2zd2AFC9zh","doxcneSOCM8kkKWq2We8kLttgDe","doxcncKSoquAsEEmmSA4kQBapYd","doxcnQCUKWsYMKAGEyA78ALOhnd","doxcn64cigmIyOgeEk1O4tyQrKh","doxcnIUiOSKOgYMq22puXCN0aug","doxcnIgge8mkyKyGyCG8c9s378L","doxcnAw2kMuaIqO6sMdUUYrOQNc","doxcnK4cg0Ee4eAOC2ByKjIuz6e","doxcnq2ASMwUeKAYeYTqJ6TuCsf","doxcnSos8k8S8Wawq44chfDT9me","doxcnUIYm4y40ISGU8njAeCZcge","doxcnKSomaIaSWkkY6ezO6gT2nf","doxcnQuaoEsoaIyEI6ClMRwSJWh","doxcngwYIoeSy2cSqwVUnWwawQe","doxcniaiCK6omM6KyofteqNcv4c","doxcng2SsAa2kMCGUsVR5cc9BAW","doxcnGg6KQQOyQam2wRH1WfrEsb","doxcnmIKkMgOIc2IkSqBWnZvqwe","doxcn6UEKyUiys6uCofTFRhGWed","doxcnGw2iUwa8ykikg7eXvwH2ld","doxcn08GCcg4ouoyOSaXnBvm2kf","doxcnAU8MMiI8s6MWkxVHPWnm8g","doxcnIQk0Iyiwao6uOSrTgcYkGb","doxcn8WQQgYA0cASW4m8R4p3bZ6","doxcnqEOAYW4qoSeCmSRYwTtJ2e","doxcnOaAGAwykgsU0a4yLR9IaXe","doxcn020AA2CGSOkGC0deZQOfzg","doxcnO6wuAcOU0uMMITVmlZ7muc","doxcnk6Wiw42CeasoghSkB7OZ9d","doxcnGYeSi4KWOeAIwVexE0Advd","doxcnQkgaGyQ6cgSeo9v1yESWyh","doxcnowgIgMk4eYEYs1Y8xgvFrg","doxcnOyu2m2QQIYGuQJt3DCFmnd","doxcn8gGo8UkWk2YyiIpsG55Fze","doxcnkK0OmEgcMW4WUhyqgMFyUh","doxcnseMug2I4GC8mqa6Y2cVx2b","doxcnUISuSY4SaCy0t0sx4ZH0sJ","doxcnyWGois0AiIGawNqVDZtdnd","doxcnKkOaMAeI2uO4869c1tk7Ab","doxcngCSiYAeKeGAgg3gIILqPFf","doxcnWG88ceGuA2euuKbKmhRuuh","doxcnYsqw4gesM0IUaQXlglxFOX","doxcnsKWusmkikkKESUaSaSUGpf","doxcnUWAI8MkY6ciSqOq9Y32WEe","doxcnoAS2Uq2QEaawUv99kobEJg","doxcnMSAuGEa6Qe4ueUyQFBiTje","doxcnemoK4Ii2OQiOC6OGDkHYpf","doxcnmioCK0GE0q0qQ96Vz3e0Uf","doxcny2wKYK6sCKoYYLqzIcbXag","doxcnWCa8ueWKuCogxQo15i6qJl","doxcneeW06i4kU44MaIcuPslQ92","doxcnScSy8GS62CCocD2JEcatUe","doxcnq6YSySogQEYWwNuQ5IZCXb","doxcn8YiyS648q0SU0yBlWjoC8b","doxcn2gAkaaUMMqA2QL2JCHgT5g","doxcnCQSKqUAEOyqI2FW5w7GzQe","doxcnGCMi6aykG0Ku8r7614P9ed","doxcncqUeUi4aA20IIWG8bWSydb","doxcnSSg0O8EsC0MwM7cJZhlwFg","doxcnwIYSIoak2uIseGxf5Je4oc"],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["comment-id-7137647336443904002","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+x"},"text":{"0":"Zadig + Mysql 代码、数据变更一站式编排,可靠丝滑交付"}}},"align":""}}},"payloadMap":{},"extra":{"mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"pasteFlag":"ca8bcf57-f51e-4d90-b904-4d060fc7d800"}" data-lark-record-format="docx/record">

use order_info;
delete from product where status = 0;

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

至此,工作流配置完毕。

第二步:执行工作流

点击「执行」-> 选择要更新的服务组件及代码信息 -> 选择 qa 环境 -> 启动任务。

打开网易新闻 查看精彩图片

系统会按照顺序依次执行以下阶段:构建 -> 部署 -> 自动化测试 -> 数据清理。

打开网易新闻 查看精彩图片

待自动化测试执行完毕后,查看数据库中数据如下:

打开网易新闻 查看精彩图片

待数据清理执行完毕后,查看数据库中数据如下,可以看到因自动化测试产生的错误状态数据已被自动清理。

打开网易新闻 查看精彩图片

第三步(进阶):配置 Git 触发器,自动清理

配置触发器:编辑工作流「workflow-qa」-> 点击「触发器」 -> 配置代码库信息、触发事件和工作流执行变量等。

打开网易新闻 查看精彩图片
打开网易新闻 查看精彩图片

修改代码并提交到代码库后,会触发工作流执行,自动完成构建 -> 部署 -> 自动化测试 -> 数据清理流程,既保障本次变更的质量,又确保下次的自动化测试执行无后顾之忧。

打开网易新闻 查看精彩图片

点击触发器 -> 配置代码库信息、触发事件和工作流执行变量等。"},"attribs":{"0":"*0+c*0*1+b*0+6*0*1+3*0+q"}},"apool":{"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]},"nextNum":2}},"align":"","folded":false,"seq":"1"}},"doxcny2wKYK6sCKoYYLqzIcbXag":{"id":"doxcny2wKYK6sCKoYYLqzIcbXag","snapshot":{"type":"ordered","parent_id":"doxcn2SJcTo6gFJh1kGsRtpSrdl","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":[],"text":{"initialAttributedTexts":{"text":{"0":"修改代码并提交到代码库后,会触发工作流执行,自动完成 构建 -> 部署 -> 自动化测试 -> 数据清理 流程,既保障本次变更的质量,又确保下次的自动化测试执行无后顾之忧。"},"attribs":{"0":"*0+r*0*1+p*0+y"}},"apool":{"numToAttrib":{"0":["author","6999256783185248260"],"1":["inlineCode","true"]},"nextNum":2}},"align":"","folded":false,"seq":"auto"}},"doxcnQEguiiCUK0eoKiVOvy0aNg":{"id":"doxcnQEguiiCUK0eoKiVOvy0aNg","snapshot":{"type":"image","parent_id":"doxcnMC2geuimo4kwKGQE9cKIkb","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","align":"center","image":{"token":"boxcnNtcbmsVmTWcWUV7yIKTFSh","mimeType":"image/png","size":307384,"scale":0.24678837052062205,"width":2958,"height":1608,"name":"image.png"}}},"doxcnSKiQE2MSUm0EKoiNOyKMnf":{"id":"doxcnSKiQE2MSUm0EKoiNOyKMnf","snapshot":{"type":"image","parent_id":"doxcnGmQSIQiqkAAQorwcyoMkFc","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","align":"center","image":{"token":"boxcniDQ9sVSGIw1rO66RwDjVKe","mimeType":"image/png","size":329279,"scale":0.24712254570074474,"width":2954,"height":1606,"name":"image.png"}}},"doxcnmioCK0GE0q0qQ96Vz3e0Uf":{"id":"doxcnmioCK0GE0q0qQ96Vz3e0Uf","snapshot":{"type":"grid","parent_id":"doxcn2SJcTo6gFJh1kGsRtpSrdl","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":["doxcnMC2geuimo4kwKGQE9cKIkb","doxcnGmQSIQiqkAAQorwcyoMkFc"]}},"doxcnMC2geuimo4kwKGQE9cKIkb":{"id":"doxcnMC2geuimo4kwKGQE9cKIkb","snapshot":{"type":"grid_column","parent_id":"doxcnmioCK0GE0q0qQ96Vz3e0Uf","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":["doxcnQEguiiCUK0eoKiVOvy0aNg"],"width_ratio":0.5000268586341823}},"doxcnGmQSIQiqkAAQorwcyoMkFc":{"id":"doxcnGmQSIQiqkAAQorwcyoMkFc","snapshot":{"type":"grid_column","parent_id":"doxcnmioCK0GE0q0qQ96Vz3e0Uf","comments":[],"locked":false,"hidden":false,"author":"6999256783185248260","children":["doxcnSKiQE2MSUm0EKoiNOyKMnf"],"width_ratio":0.49997314136581766}},"doxcn2SJcTo6gFJh1kGsRtpSrdl":{"id":"doxcn2SJcTo6gFJh1kGsRtpSrdl","snapshot":{"type":"page","parent_id":"","comments":["7137647336443904002"],"locked":false,"hidden":false,"author":"6999256783185248260","children":["doxcn6GIi4wuAWmYiqytzaP7Oqb","doxcnAoouasEksySYy04xiNxK7d","doxcn0WQCSAeYwA4cs7Npqdq4ph","doxcn8gIcosMWw6mo2zd2AFC9zh","doxcneSOCM8kkKWq2We8kLttgDe","doxcncKSoquAsEEmmSA4kQBapYd","doxcnQCUKWsYMKAGEyA78ALOhnd","doxcn64cigmIyOgeEk1O4tyQrKh","doxcnIUiOSKOgYMq22puXCN0aug","doxcnIgge8mkyKyGyCG8c9s378L","doxcnAw2kMuaIqO6sMdUUYrOQNc","doxcnK4cg0Ee4eAOC2ByKjIuz6e","doxcnq2ASMwUeKAYeYTqJ6TuCsf","doxcnSos8k8S8Wawq44chfDT9me","doxcnUIYm4y40ISGU8njAeCZcge","doxcnKSomaIaSWkkY6ezO6gT2nf","doxcnQuaoEsoaIyEI6ClMRwSJWh","doxcngwYIoeSy2cSqwVUnWwawQe","doxcniaiCK6omM6KyofteqNcv4c","doxcng2SsAa2kMCGUsVR5cc9BAW","doxcnGg6KQQOyQam2wRH1WfrEsb","doxcnmIKkMgOIc2IkSqBWnZvqwe","doxcn6UEKyUiys6uCofTFRhGWed","doxcnGw2iUwa8ykikg7eXvwH2ld","doxcn08GCcg4ouoyOSaXnBvm2kf","doxcnAU8MMiI8s6MWkxVHPWnm8g","doxcnIQk0Iyiwao6uOSrTgcYkGb","doxcn8WQQgYA0cASW4m8R4p3bZ6","doxcnqEOAYW4qoSeCmSRYwTtJ2e","doxcnOaAGAwykgsU0a4yLR9IaXe","doxcn020AA2CGSOkGC0deZQOfzg","doxcnO6wuAcOU0uMMITVmlZ7muc","doxcnk6Wiw42CeasoghSkB7OZ9d","doxcnGYeSi4KWOeAIwVexE0Advd","doxcnQkgaGyQ6cgSeo9v1yESWyh","doxcnowgIgMk4eYEYs1Y8xgvFrg","doxcnOyu2m2QQIYGuQJt3DCFmnd","doxcn8gGo8UkWk2YyiIpsG55Fze","doxcnkK0OmEgcMW4WUhyqgMFyUh","doxcnseMug2I4GC8mqa6Y2cVx2b","doxcnUISuSY4SaCy0t0sx4ZH0sJ","doxcnyWGois0AiIGawNqVDZtdnd","doxcnKkOaMAeI2uO4869c1tk7Ab","doxcngCSiYAeKeGAgg3gIILqPFf","doxcnWG88ceGuA2euuKbKmhRuuh","doxcnYsqw4gesM0IUaQXlglxFOX","doxcnsKWusmkikkKESUaSaSUGpf","doxcnUWAI8MkY6ciSqOq9Y32WEe","doxcnoAS2Uq2QEaawUv99kobEJg","doxcnMSAuGEa6Qe4ueUyQFBiTje","doxcnemoK4Ii2OQiOC6OGDkHYpf","doxcnmioCK0GE0q0qQ96Vz3e0Uf","doxcny2wKYK6sCKoYYLqzIcbXag","doxcnWCa8ueWKuCogxQo15i6qJl","doxcneeW06i4kU44MaIcuPslQ92","doxcnScSy8GS62CCocD2JEcatUe","doxcnq6YSySogQEYWwNuQ5IZCXb","doxcn8YiyS648q0SU0yBlWjoC8b","doxcn2gAkaaUMMqA2QL2JCHgT5g","doxcnCQSKqUAEOyqI2FW5w7GzQe","doxcnGCMi6aykG0Ku8r7614P9ed","doxcncqUeUi4aA20IIWG8bWSydb","doxcnSSg0O8EsC0MwM7cJZhlwFg","doxcnwIYSIoak2uIseGxf5Je4oc"],"text":{"apool":{"nextNum":2,"numToAttrib":{"0":["author","6999256783185248260"],"1":["comment-id-7137647336443904002","true"]}},"initialAttributedTexts":{"attribs":{"0":"*0*1+x"},"text":{"0":"Zadig + Mysql 代码、数据变更一站式编排,可靠丝滑交付"}}},"align":""}}},"payloadMap":{},"extra":{"mention_page_title":{},"external_mention_url":{}},"isKeepQuoteContainer":false,"pasteFlag":"ca8bcf57-f51e-4d90-b904-4d060fc7d800"}" data-lark-record-format="docx/record">

打开网易新闻 查看精彩图片


探索更多实践

本文主要讲解了如何在 Zadig 上实现 MySQL 数据以及代码的一站式变更实践。如果官方提供的 MySQL 数据变更任务不能满足日常需求,可以参考自定义任务 | Zadig 文档[3]编写符合自己情况的自定义任务,也欢迎在Zadig 论坛[4]分享你的实践~

[1] https://koderover.com/tutorials/codelabs/GitLab/index.html

[2] https://github.com/koderover/zadig/tree/release-1.14.0/pkg/microservice/aslan/core/workflow/service/workflow/plugins

[3] https://docs.koderover.com/zadig/v1.14.0/settings/custom-task/

[4] https://community.koderover.com