实现基于 Azure DevOps 的数据库 CI/CD 最佳实践

news2024/11/23 3:52:00

数据库变更一直是整个应用发布过程中效率最低、流程最复杂、风险最高的环节,也是 DevOps 流程中最难以攻克的阵地。那我们是否能在具体的 CI/CD 流程中,像处理代码那样处理数据库变更呢?

file

DORA 调研报告

DORA(DevOps Research & Assessment)是一家专注于 DevOps 的研究机构, 在该领域以专业与客观著称。自 2014 年以来,DevOps 调研了全球范围内超过 32,000 名专业人员,并以年度报告的形式对外发布研究成果。DORA 明确指出,将数据库变更纳入应用发布流程将显著提升整体发布效率。

file

这一结论并不令人意外。问题是,该怎么做?

一个完整的基于 Azure DevOps 的数据库 CI/CD 工作流

file

通过 Bytebase,我们将实现一个完整的基于 Azure DevOps 的数据库 CI/CD 工作流:

  • 开发者将变更 SQL 脚本提交到代码分支;
  • 触发 Bytebase 提供的 SQL 审核 CI 进行自动化 SQL 审核,并给出修改建议;
  • 修改完成后的 SQL 脚本合并入主分支;
  • 自动触发发布流程,脚本将被推送到 Bytebase 中;
  • Bytebase 内置的自动审核将对变更语句进行二次确认,根据变更风险等级自动匹配审批流,根据审批流进行审批;
  • 审批后的语句可手动或自动触发在目标库中执行;
  • 变更完成后的数据库最新 schema 结构将被自动回写入代码仓库;
  • 确认变更完成后,触发下一阶段的应用发布流程。

通过 Bytebase 社区版实现

让我们一步一步看看这个过程怎样实现的。

第一步 通过 Docker 启动 Bytebase,并配置外部 URL

ngrok 是一个反向代理工具,我们需要它的公网地址,以便从 GitHub 接收 webhooks。这里使用 ngrok 是出于测试目的;对于生产使用,我们建议使用 Caddy。

file

  1. 登录 ngrok Dashboard,并按照 Getting Started 步骤进行安装和配置。
  2. 在 Docker 中运行 Bytebase:
docker run --init \
  --name bytebase \
  --restart always \
  --publish 5678:8080 \
  --health-cmd "curl --fail http://localhost:5678/healthz || exit 1" \
  --health-interval 5m \
  --health-timeout 60s \
  --volume ~/.bytebase/data:/var/opt/bytebase \
  bytebase/bytebase:2.10.0 \
  --data /var/opt/bytebase \
  --port 8080
  1. Bytebase 在 Docker 中成功启动,你可以通过 localhost:5678 来访问。注册一个管理员账号。
  2. 在命令行运行 ngrok http 5678,并获得公共 URL。

file

  1. 登录 Bytebase,点击右上角的齿轮,将公共 URL 填入到网络部分的外部 URL,点击更新。

第二步 在 Bytebase 种添加 Azure DevOps Service 作为 Git Provider

  1. 通过公共 URL 来访问 Bytebase,点击右上角的齿轮 > 集成 > GitOps,选择 Azure DevOps Service,点击下一步。你会进入到第二步,拷贝 Redirect URI。点击 直达链接 访问你的 Azure DevOps 账号。

file file

  1. 在 Azure DevOps 的应用注册页面,填写表格如下并保存:
  • Company name: 可以任取一个名字,比如 bb
  • Homepage URL: https://bytebase.com
  • Authorization callback URL: 从 Bytebase 步骤 2 复制的 Redirect URI
  • Authorizied scopes: 找到 Code (full), Identity (read), Project and team (read), Build (read and execute)
  • file
  1. 点击 show,复制 Application ID 和 Client Secret,然后粘贴到 Bytebase 的 GitOps 配置页面步骤 2 里。

file file

第三步 在 Bytebase 中配置一个 GitOps 工作流

  1. 访问 Azure DevOps,并建立一个新项目 bytebase-gitops。
  2. 访问 Bytebase,进入项目 Sample Project。点击 GitOps 标签,选择 GitOps 工作流。点击 配置 GitOps。
  3. 选择 Azure DevOps(就是你在上一步配置的),然后选择 bytebase-gitops 这个项目。你会来到步骤三,保持其它参数不变,滑动到页面底部,勾选 基于 Azure DevOps Pipeline 开启 SQL 审核。点击完成。

file

  1. 系统会自动在 Azure DevOps 中建立实现 CI 的 PR,点击 Complete 手动合并。回到目录,可以看到 pipeline 自动生成。

file

  1. 回到 Bytebase,你会见到 GitOps 工作流已设置成功。

第四步 建立一个 PR(合并请求)去触发 SQL 审核 CI

  1. 点击界面顶端环境,你可以看到在 Prod 最下方有了一个 SQL 审核策略,点击编辑,你会看到有 3 条开启的规则。它们将通过 CI 应用。我们将非空的等级调为错误。

file

  1. 为了测试 SQL 审核 CI,我们将创建一个合并请求来更改 Prod 数据库 schema。不过,我们会让它先违反下 SQL 审核策略。Azure DevOps 上的 bytebase-gitops-az。单击新建分支,命名为 add-nickname-table-employee,点击创建分支。
  2. 在新分支上创建子目录 bytebase,并创建子子目录 prod。在 prod 目录中创建文件 employee##202310201700##ddl##add_nickname_table_employee.sql。将以下 SQL 脚本复制到文件中,并提交更改。

ALTER TABLE "public"."employee" ADD COLUMN "nick_name" text;

  1. 创建包含上述提交的合并请求。SQL 审核 CI 将自动运行并显示失败消息。点击 Tests 可以看到具体的违反规则。

file file

  1. 更新 SQL 脚本并提交到当前分支。SQL 审核 CI 将再次运行并显示通过信息。单击 Complete。

ALTER TABLE "public"."employee" ADD COLUMN "nick_name" text NOT NULL DEFAULT '';

file

  1. 返回 Bytebase 中的 Sample Project,你会看到推送事件开启了一个工单。

file

  1. 到问题详情页面。因为没有配置审批流或手动发布,此工单会自动发布。你可以点击查看变更来查看差异。

file

通过 Bytebase 企业版解锁更多功能

你可以升级到企业版,解锁更多功能。点击页面左下角的开始免费试用并升级到企业版,点击顶部实例,为现有的两个实例分配证书。

手动发布

在环境 > 2.Prod,找到发布策略,然后选择 人工发布 > 需要 DBA 或者 Bytebase 实例所有者发布。

file

自定义审批

  1. 访问设置 > 安全性 & 策略 > 自定义审批。将项目 Project Owner -> DBA 设置为DDL > 高风险的审批流。

file

  1. 访问设置 > 安全性 & 策略 > 风险中心。点击添加规则,然后点击加载第一个模板,点击添加。

file

最新 schema 写回

Schema 变更完成后,Bytebase 会将最新 schema 写回 Git 代码库。这样,团队在 Git 中就始终有一个数据库 schema 的标准真实源。

  1. 返回 Azure DevOps,新建一个分支 add-country-table-employee。在 bytebase/prod 目录下创建文件 employee##202310201700##ddl##add_country_table_employee.sql。将以下 SQL 脚本复制到文件中并提交更改。 ALTER TABLE "public"."employee" ADD COLUMN "country" text NOT NULL DEFAULT '';
  2. 返回 Bytebase,转到新创建的工单,它符合 Project Owner -> DBA 的审批流程。

file

  1. 按照审批流程点击批准后,横幅将显示等待发布。然后,负责人就可以点击发布了。
  2. 回到 GitLab,你会发现在 bytebase/prod/ 下有一个新的文件 .employee##LATEST.sql,包含了 Bytebase 写回的最新 schema。(这里需要开启推送到 main 的权限)

file

Schema 漂移

Bytebase 内置了 schema 漂移检测功能,可以检测到意外的 schema 变更。让我们使用 SQL 编辑器管理员模式来模拟一下。

  1. 点击右上角的终端图标(SQL 编辑器)。你将跳转到 SQL 编辑器。点击管理员模式。在此模式下所做的一切与直接连接服务器相同,Bytebase 不会记录。

  2. 选择左侧的 (Prod) Employee,粘贴并运行以下脚本:

ALTER TABLE "public"."employee" ADD COLUMN "city" text NOT NULL DEFAULT '';

  1. 返回 Bytebase 主页,点击顶部的数据库, 选择 Prod 下的 employee。点击现在同步。看到成功消息后,刷新页面。你将看到 schema 漂移。你可以在实例详情页配置自动扫描,以避免手动同步。

file

  1. 访问异常中心,也会看到 schema 漂移。

总结

有了 Bytebase,你就有了一套完整的 Azure DevOps 数据库 CI/CD 工作流程。你可以将此工作流程应用到自己的项目中,并根据自己的需要进行定制。 Bytebase 也支持 GitLab,GitHub,以及 Bitbucket。具体的配置步骤可以查看 Bytebase 官网文档。


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1153231.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

图纸管理制度《七》

1、目的: 明确技术图样与文件的签署、更改及标准化等内容,对技术图样与文件进行有效的控制。技术文化是公司的核心秘密,是公司能够持续发展并在市场上保持强势竞争力的有力保障,公司的技术文件属于公司所有,公司的每一…

C++:关联式容器set的介绍

1、set的介绍 set是按照一定次序存储元素的容器 在set中,元素的value也标识它(value就是key,类型为T),并且每个value必须是唯一的。 set中的元素不能在容器中修改(元素总是const),但是可以从容器中插入或删除它们。 在内部&#…

xmind2testcase使用与二次开发

xmind2testcase安装、简单二次开发与使用说明: 添加xmind文件备份 重构生成CSV文件 preview预览页面数据显示重构 一、安装 1.xmind2testcase安装 pip install xmind2testcase 2.启动服务 进入默认位置:C:\Users\dell\AppData\Roaming\Python\Py…

医院能耗管控平台,医院节能降耗的有效利器

随着人们对医院舒适度要求的不断提升,医院采用新技术及信息化建设等手段来提升服务,导致能源使用效率高,医院能耗管控平台可以帮助医院在运行的基础上,促进医院节能降耗等工作。 医院目前存在的问题 1、医院人口密度大、用能系统…

2023年05月 Python(二级)真题解析#中国电子学会#全国青少年软件编程等级考试

Python等级考试(1~6级)全部真题・点这里 一、单选题(共25题,每题2分,共50分) 第1题 运行以下程序,如果通过键盘先后输入的数是1和3,输出的结果是?( &#x…

springweb flux拦截请求获取参数和方法做接口签名防重放校验

在给spring webflux做接口签名、防重放的时候,往往需要获取请求参数,请求方法等,而spring webflux无法像spring mvc那样好获取,这里根据之前的实践特地说明一下: 总体思路: 1、利用过滤器,从原…

Yuhan Blu-ray DVD Creator for Mac: 打造专属的高清视听盛宴

在如今的高清时代,谁能拒绝一款能够轻松将高清影片刻录成蓝光DVD的刻录机呢?而Yuhan Blu-ray DVD Creator for Mac正是这样一款令人惊艳的软件。 作为一款专为Mac用户打造的蓝光DVD刻录机,Yuhan Blu-ray DVD Creator for Mac支持将各种高清视…

涛思数据与胜软科技达成战略合作,共同赋能石油行业数字化转型

近日,北京涛思数据科技有限公司(以下简称“涛思数据”)与山东胜软科技股份有限公司(以下简称“胜软科技”)于山东东营签署战略合作协议。双方围绕石油行业数字化转型趋势,合力打造石油行业数字化转型解决方…

设计模式_观察者模式

观察者模式 介绍 设计模式定义案例问题堆积在哪里解决办法观察者是行为型设计模式 多个对象 观察 1个对象小强考试完 成绩公布了 家长/同学得知成绩后 做出不同反应一个一个通知很麻烦 先通知谁 也有讲究的 信息发布方 抽象出一个信息管理类 负责管理监听者 类图 代码 Obse…

【Apache Flink】Flink DataStream API的基本使用

Flink DataStream API的基本使用 文章目录 前言1. 基本使用方法2. 核心示例代码3. 完成工程代码pom.xmlWordCountExample测试验证 4. Stream 执行环境5. 参考文档 前言 Flink DataStream API主要用于处理无界和有界数据流 。 无界数据流是一个持续生成数据的数据源&#xff0…

如何理解 Spring Boot 中的 Starter?

Starter 是 Spring Boot 的四大核心功能特性之一,除此之外,Spring Boot 还有自动装配、Actuator 监控等特性。Spring Boot 里面的这些特性,都是为了让开发者在开发基于 Spring 生态下的企业级应用时,只需要关心业务逻辑,减少对配置…

初识FFmpeg

前言 无意间见到群里的小伙伴展示视频工具。功能比较多,包括视频编码修改,画质处理,比例处理、名称提取,剪辑、标题拆解。因此开始了FFmpeg学习。以下摘自百度百科的解释。 FFmpeg是一套可以用来记录、转换数字音频、视频&#xf…

【LVS实战】02 搭建一个LVS-NAT实验

一、网络结构 用虚拟机搭建如下的几台机器,并配置如下的ip 关于虚拟机网卡和网络的配置,可以参考 iptables章节,05节:网络转发实验 主机A模拟外网的机器 B为负载均衡的机器 C和D为 RealServer 二、C和D主机的网关设置 C和D机…

vue项目引入elementui样式组件05

vue前端开发,关于样式部分,不需要自己去写,可以引用现有的一些组件,比如elemtnui,可官网查看 1、下载对应的包到vue项目中 通过npm进行安装 npm i element-ui -S2、引入到项目中,官网也提供了例子 3、运…

Shopee流量和销量不佳?或许你没有掌握正确的引流方法

很多卖家做了很久,但是发现流量和销量都没怎么增长,今天陈哥就分享一下如何正确的引流。 以下是一些有效的引流策略: 1. 站内引流:选择高性价比的潮流商品,根据目标客户群和重点品类进行选品。优化商品名称和描述&am…

顺序表练习

顺序表练习 图解插入与删除,详见相关内容:顺序存储结构的插入与删除 //顺序表的定义、创建、插入、删除、查找 //定义:结构体中数组、表长 //创建:输入元素,表长 //插入:判断表是否已满、判断位序合法性 //插入位序k…

好用的视频下载工具推荐

我不允许还有人不知道这款视频下载工具, 真的太好用了! !! 随着视频行业的崛起,如今网络上各种各样的视频层出不穷, 那我们看到喜欢的视频该如何下载呢?今天小编来给大家分享一款非常实用的视频下载工具——Downni, 它兼容国内外大多数视频网…

网络编程服务端与客户端存在的端口问题

服务端的窗口不能再次使用的原因如下: 服务器端的窗口不能再次使用的原因可能有以下几点: 1. 窗口已经关闭:如果服务器端的窗口已经被关闭,那么就无法再次使用。关闭窗口后,服务器会释放相关资源,包括与该…

深度学习入门(二)之神经网络

文章目录 从感知机到神经网络神经网络的例子复习感知机激活函数 激活函数sigmoid函数阶跃函数的实现阶跃函数的图形sigmoid函数的图形sigmoid函数与阶跃函数比较非线性函数ReLU函数 多维数组的运算多维数组矩阵乘法神经网络的内积 三层神经网络的实现符号确认各层间信号传递的实…

视频剪辑达人教您:如何运用嵌套合并技巧制作固定片尾

在视频剪辑的过程中,嵌套合并技巧是一种非常实用的技术,可以帮助您将多个素材叠加在一起,制作出更加丰富多彩的视频。本文将由视频剪辑达人为您详细介绍如何运用云炫AI智剪嵌套合并技巧制作固定片尾,让您的视频剪辑水平更上一层楼…