通过 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

相关文章

LiteFlow轻量级工作流引擎使用示例详解

《LiteFlow轻量级工作流引擎使用示例详解》:本文主要介绍LiteFlow是一个灵活、简洁且轻量的工作流引擎,适合用于中小型项目和微服务架构中的流程编排,本文给大家介绍LiteFlow轻量级工... 目录1. LiteFlow 主要特点2. 工作流定义方式3. LiteFlow 流程示例4. LiteF

SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程

《SpringBoot集成LiteFlow实现轻量级工作流引擎的详细过程》LiteFlow是一款专注于逻辑驱动流程编排的轻量级框架,它以组件化方式快速构建和执行业务流程,有效解耦复杂业务逻辑,下面给大... 目录一、基础概念1.1 组件(Component)1.2 规则(Rule)1.3 上下文(Conte

github打不开的问题分析及解决

《github打不开的问题分析及解决》:本文主要介绍github打不开的问题分析及解决,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录一、找到github.com域名解析的ip地址二、找到github.global.ssl.fastly.net网址解析的ip地址三

详解如何使用Python构建从数据到文档的自动化工作流

《详解如何使用Python构建从数据到文档的自动化工作流》这篇文章将通过真实工作场景拆解,为大家展示如何用Python构建自动化工作流,让工具代替人力完成这些数字苦力活,感兴趣的小伙伴可以跟随小编一起... 目录一、Excel处理:从数据搬运工到智能分析师二、PDF处理:文档工厂的智能生产线三、邮件自动化:

基于Python开发一个有趣的工作时长计算器

《基于Python开发一个有趣的工作时长计算器》随着远程办公和弹性工作制的兴起,个人及团队对于工作时长的准确统计需求日益增长,本文将使用Python和PyQt5打造一个工作时长计算器,感兴趣的小伙伴可... 目录概述功能介绍界面展示php软件使用步骤说明代码详解1.窗口初始化与布局2.工作时长计算核心逻辑3

RabbitMQ工作模式中的RPC通信模式详解

《RabbitMQ工作模式中的RPC通信模式详解》在RabbitMQ中,RPC模式通过消息队列实现远程调用功能,这篇文章给大家介绍RabbitMQ工作模式之RPC通信模式,感兴趣的朋友一起看看吧... 目录RPC通信模式概述工作流程代码案例引入依赖常量类编写客户端代码编写服务端代码RPC通信模式概述在R

Druid连接池实现自定义数据库密码加解密功能

《Druid连接池实现自定义数据库密码加解密功能》在现代应用开发中,数据安全是至关重要的,本文将介绍如何在​​Druid​​连接池中实现自定义的数据库密码加解密功能,有需要的小伙伴可以参考一下... 目录1. 环境准备2. 密码加密算法的选择3. 自定义 ​​DruidDataSource​​ 的密码解密3

Maven项目中集成数据库文档生成工具的操作步骤

《Maven项目中集成数据库文档生成工具的操作步骤》在Maven项目中,可以通过集成数据库文档生成工具来自动生成数据库文档,本文为大家整理了使用screw-maven-plugin(推荐)的完... 目录1. 添加插件配置到 pom.XML2. 配置数据库信息3. 执行生成命令4. 高级配置选项5. 注意事

在Java中基于Geotools对PostGIS数据库的空间查询实践教程

《在Java中基于Geotools对PostGIS数据库的空间查询实践教程》本文将深入探讨这一实践,从连接配置到复杂空间查询操作,包括点查询、区域范围查询以及空间关系判断等,全方位展示如何在Java环... 目录前言一、相关技术背景介绍1、评价对象AOI2、数据处理流程二、对AOI空间范围查询实践1、空间查

Python+PyQt5实现MySQL数据库备份神器

《Python+PyQt5实现MySQL数据库备份神器》在数据库管理工作中,定期备份是确保数据安全的重要措施,本文将介绍如何使用Python+PyQt5开发一个高颜值,多功能的MySQL数据库备份工具... 目录概述功能特性核心功能矩阵特色功能界面展示主界面设计动态效果演示使用教程环境准备操作流程代码深度解