通过 GitHub Actions 执行数据库 Schema 变更工作流

2024-09-02 18:44

本文主要是介绍通过 GitHub Actions 执行数据库 Schema 变更工作流,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原文地址 https://www.bytebase.com/docs/tutorials/github-ci/

教程库:https://github.com/bytebase/github-action-example

开发者们喜欢将 Schema 变更脚本与应用程序代码一起保存在 Git 中,这样变更脚本就能像应用程序代码一样接受审核和版本控制,但仍需将变更脚本手动粘贴到 SQL 客户端,或要求 DBA 针对目标数据库运行该脚本。这样做既效率低下,又容易出错:

  • 如果错贴 / 漏贴脚本怎么办?
  • 如果对错误的数据库运行了脚本怎么办?

本教程教你使用 GitHub Actions 和 Bytebase API 实现数据库 Schema 变更的自动化。

在这里插入图片描述

以上是一个典型的工作流:

  1. 开发者创建包含变更脚本的 PR 后,触发 GitHub 调用 Bytebase SQL Review API。
  2. TL 批准 PR。
  3. GitHub 创建 Bytebase 的发布实例,该实例包含迁移脚本的变化。
  4. 根据所配置的策略,可能需要 DBA 手动批准和发布。GitHub 先阻止 PR 合并,直到 Bytebase 发布 Schema 变更。这种设置可确保 PR 同时包含代码和 Schema 变更时,在代码部署之前应用 Schema 变更。
  5. Bytebase 部署 Schema 变更,并将问题标记为「完成」。
  6. PR 重新运行变更状态检查。
  7. 检查后出现绿色标记,表示 PR 可以合并。

(一)准备 Bytebase

假设 Bytebase 运行于 https://bytebase.example.com/。首先,我们将设置必要的数据,以支持我们的 API 交互。

服务账户: 作为管理员,添加一个具有 Workspace DBA 角色的服务账户 ci@service.bytebase.com,用于验证 API 调用。

为限制服务账户的权限,可以选择授予工作区成员而非工作区 DBA,再在特定项目中,授予该账户创建实例的权限。

项目中的数据库:我们有一个项目 Example 和一个数据库 example。

在这里插入图片描述

(二)准备 GitHub 操作

可在 https://github.com/bytebase/ci-example 查看示例。该库包含多个 GitHub Action 工作流,可前往 .github/workflows 查看。

在这里插入图片描述

我们将使用以下工作流:

  • bytebase-sql-review.yml:在 PR 更改时触发。因此任何违反 SQL 审查的行为都会阻止 PR。
  • bytebase-upsert-migration.yml:在 PR 批准时触发。批准后创建 Bytebase 变更实例。只要变更脚本变化,变更实例也会相应更新。
  • bytebase-check-migration-status.yml:在 PR 变化时触发。PR 将被阻止,直到变更完成。

(三)工作流样例 - 四个阶段

阶段一:未在 GitHub 上通过 SQL 审核

先在 Bytebase 中设置 SQL 审核策略。在示例数据库所在的 Prod 环境中配置。审核策略中有一个是检查 NOT NULL 约束,而我们将在 PR 中违反该约束。

在这里插入图片描述
在这里插入图片描述

PR 变更时会触发 bytebase-sql-review.yml 工作流。它会扫描 PR 中以 **.up.sql 模式命名的 SQL 文件,并报告任何违反 SQL 审核策略的情况。

配置环境。

bytebase-sql-review:runs-on: ubuntu-latestenv:BYTEBASE_URL: "https://bytebase-ci.zeabur.app"BYTEBASE_SERVICE_ACCOUNT: "ci@service.bytebase.com"DATABASE: "instances/prod-instance/databases/example"...

通过身份验证后,我们会调用 Bytebase API / sql / check 来检查变更文件。我们会解析响应,并为每条建议生成 GitHub 内嵌注释。如果发现任何 ERROR 或 WARNING,则将检查标记为失败。

name: SQL Reviewsteps:- name: Checkoutuses: actions/checkout@v4- name: Login to Bytebase...- name: Reviewid: reviewuses: ./.github/actions/sql-reviewwith:github-token: ${{ secrets.GITHUB_TOKEN }}pattern: "**/*.up.sql"url: ${{ env.BYTEBASE_URL }}token: ${{ steps.login.outputs.token }}headers: '{"Accept-Encoding": "deflate, gzip"}'database: ${{ env.DATABASE }}...

我们创建了一个包含多个 SQL 文件的 PR,同时触发了 bytebase-sql-review.yml 和 bytebase-check-migration-status.yml。这些检查完成后,PR 会因故障而被阻止。

在这里插入图片描述

单击「详情」查看 SQL 审核。

在这里插入图片描述

也可以访问「文件更改」页面来查看注释。

在这里插入图片描述

阶段二:通过 SQL 审核,等待 TL 在 GitHub 上批准

修复 SQL 文件并推送。完成这些检查后,PR 仍会因故障而受阻,但这次 SQL 审核已经通过。

实际应用中,PR 还包括应用程序代码。由于 SQL 变更已经通过了基本的 SQL 审核检查,现在就需要技术负责人批准此 PR 了。

在这里插入图片描述

创建 PR 的开发者会指派技术负责人在 GitHub 上进行审核。

在这里插入图片描述

阶段三:TL 在 GitHub 上批准,在 Bytebase 中创建变更实例

指定的技术负责人批准 PR,并触发另一个工作流 bytebase-upsert-migration.yml。

在这里插入图片描述

它会检查 PR 中命名为 **.up.sql 的 SQL 文件,并在 Bytebase 中创建一个发布实例。

bytebase-upsert-migration:runs-on: ubuntu-latest# Runs only if PR is approved and target branch is mainif: github.event.review.state == 'approved' && github.event.pull_request.base.ref == 'main'env:BYTEBASE_URL: "https://bytebase-ci.zeabur.app"BYTEBASE_SERVICE_ACCOUNT: "ci@service.bytebase.com"PROJECT: "example"DATABASE: "instances/prod-instance/databases/example"ISSUE_TITLE: "[${{ github.repository }}#${{ github.event.pull_request.number }}] ${{ github.event.pull_request.title }}"DESCRIPTION: "Triggered by ${{ github.event.repository.html_url }}/pull/${{ github.event.pull_request.number }} ${{ github.event.pull_request.title }}"name: Upsert Migrationsteps:...

转到 Bytebase 并查看创建的实例,该实例由两个任务组成,与 PR 中存在的两个 **.up.sql 文件相对应。

在这里插入图片描述

注意到创建的实例上附有审批流程,这是因为我们为 DDL 设置了默认的自定义审批流程。

在这里插入图片描述

阶段四:变更成功,PR 在 GitHub 上合并

在 DBA 批准并启动变更后,实例状态将变为「完成」。

在这里插入图片描述

返回 GitHub,点击失败的 bytebase-check-migration-status.yml 工作流的详细信息,然后点击「重新运行所有作业」。

在这里插入图片描述
在这里插入图片描述

它会检查 Bytebase 中的变更状态,如果是「完成」,则返回「通过」,表示数据库变更已经完成。现在,PR 可以合并了,即应用程序代码可以部署了。

在这里插入图片描述
在这里插入图片描述

(四)总结

请注意,工作流可以根据企业的需求调整:

  • 可以根据分支策略(如是否基于主干)将工作流附加到不同的分支。
  • 可以使用不同的变更文件格式和结构。
  • 可以决定何时创建变更实例,是在 PR 批准时还是创建时。

无论选择哪种工作流,在 GitHub Actions 和 Bytebase API 的帮助下,你都可以将变更脚本保存在库中,让它们通过相同的代码审查流程,并自动进行 Schema 变更部署。


💡 更多资讯,请关注 Bytebase 公号:Bytebase

这篇关于通过 GitHub Actions 执行数据库 Schema 变更工作流的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1130766

相关文章

Spring Security基于数据库验证流程详解

Spring Security 校验流程图 相关解释说明(认真看哦) AbstractAuthenticationProcessingFilter 抽象类 /*** 调用 #requiresAuthentication(HttpServletRequest, HttpServletResponse) 决定是否需要进行验证操作。* 如果需要验证,则会调用 #attemptAuthentica

MySQL数据库宕机,启动不起来,教你一招搞定!

作者介绍:老苏,10余年DBA工作运维经验,擅长Oracle、MySQL、PG、Mongodb数据库运维(如安装迁移,性能优化、故障应急处理等)公众号:老苏畅谈运维欢迎关注本人公众号,更多精彩与您分享。 MySQL数据库宕机,数据页损坏问题,启动不起来,该如何排查和解决,本文将为你说明具体的排查过程。 查看MySQL error日志 查看 MySQL error日志,排查哪个表(表空间

maven 编译构建可以执行的jar包

💝💝💝欢迎莅临我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:「stormsha的主页」👈,「stormsha的知识库」👈持续学习,不断总结,共同进步,为了踏实,做好当下事儿~ 专栏导航 Python系列: Python面试题合集,剑指大厂Git系列: Git操作技巧GO

工作常用指令与快捷键

Git提交代码 git fetch  git add .  git commit -m “desc”  git pull  git push Git查看当前分支 git symbolic-ref --short -q HEAD Git创建新的分支并切换 git checkout -b XXXXXXXXXXXXXX git push origin XXXXXXXXXXXXXX

深入理解数据库的 4NF:多值依赖与消除数据异常

在数据库设计中, "范式" 是一个常常被提到的重要概念。许多初学者在学习数据库设计时,经常听到第一范式(1NF)、第二范式(2NF)、第三范式(3NF)以及 BCNF(Boyce-Codd范式)。这些范式都旨在通过消除数据冗余和异常来优化数据库结构。然而,当我们谈到 4NF(第四范式)时,事情变得更加复杂。本文将带你深入了解 多值依赖 和 4NF,帮助你在数据库设计中消除更高级别的异常。 什么是

DM8数据库安装后配置

1 前言 在上篇文章中,我们已经成功将库装好。在安装完成后,为了能够更好地满足应用需求和保障系统的安全稳定运行,通常需要进行一些基本的配置。下面是一些常见的配置项: 数据库服务注册:默认包含14个功能模块,将这些模块注册成服务后,可以更好的启动和管理这些功能;基本的实例参数配置:契合应用场景和发挥系统的最大性能;备份:有备无患;… 2 注册实例服务 注册了实例服务后,可以使用系统服务管理,

速了解MySQL 数据库不同存储引擎

快速了解MySQL 数据库不同存储引擎 MySQL 提供了多种存储引擎,每种存储引擎都有其特定的特性和适用场景。了解这些存储引擎的特性,有助于在设计数据库时做出合理的选择。以下是 MySQL 中几种常用存储引擎的详细介绍。 1. InnoDB 特点: 事务支持:InnoDB 是一个支持 ACID(原子性、一致性、隔离性、持久性)事务的存储引擎。行级锁:使用行级锁来提高并发性,减少锁竞争

如何提高 GitHub 的下载速度

如何提高 GitHub 的下载速度 文章目录 如何提高 GitHub 的下载速度1. 注册账号2. 准备好链接3. 创建仓库4. 在码云上下载代码5. 仓库更新了怎么办 一般来说,国内的朋友从 GitHub 上面下载代码,速度最大是 20KB/s,这种龟速,谁能忍受呢? 本文介绍一种方法——利用“码云”,可以大大提高下载速度,亲测有效。 1. 注册账号 去“码云”注册一

嵌入式方向的毕业生,找工作很迷茫

一个应届硕士生的问题: 虽然我明白想成为技术大牛需要日积月累的磨练,但我总感觉自己学习方法或者哪些方面有问题,时间一天天过去,自己也每天不停学习,但总感觉自己没有想象中那样进步,总感觉找不到一个很清晰的学习规划……眼看 9 月份就要参加秋招了,我想毕业了去大城市磨练几年,涨涨见识,拓开眼界多学点东西。但是感觉自己的实力还是很不够,内心慌得不行,总怕浪费了这人生唯一的校招机会,当然我也明白,毕业

开源分布式数据库中间件

转自:https://www.csdn.net/article/2015-07-16/2825228 MyCat:开源分布式数据库中间件 为什么需要MyCat? 虽然云计算时代,传统数据库存在着先天性的弊端,但是NoSQL数据库又无法将其替代。如果传统数据易于扩展,可切分,就可以避免单机(单库)的性能缺陷。 MyCat的目标就是:低成本地将现有的单机数据库和应用平滑迁移到“云”端