PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration

本文主要是介绍PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!


注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:

1、参考书籍:《PostgreSQL数据库内核分析》
2、参考书籍:《数据库事务处理的艺术:事务管理与并发控制》
3、PostgreSQL数据库仓库链接,点击前往
4、日本著名PostgreSQL数据库专家 铃木启修 网站主页,点击前往
5、参考书籍:《PostgreSQL中文手册》
6、参考书籍:《PostgreSQL指南:内幕探索》,点击前往
7、参考书籍:《事务处理 概念与技术》


1、本文内容全部来源于开源社区 GitHub和以上博主的贡献,本文也免费开源(可能会存在问题,评论区等待大佬们的指正)
2、本文目的:开源共享 抛砖引玉 一起学习
3、本文不提供任何资源 不存在任何交易 与任何组织和机构无关
4、大家可以根据需要自行 复制粘贴以及作为其他个人用途,但是不允许转载 不允许商用 (写作不易,还请见谅 💖)
5、本文内容基于PostgreSQL master源码开发而成


PostgreSQL数据库数据库之 Continuous Integration

  • 文章快速说明索引
  • 功能使用背景说明
    • README
    • Wiki
  • How to Add More Environments to the Postgres CI



文章快速说明索引

学习目标:

做数据库内核开发久了就会有一种 少年得志,年少轻狂 的错觉,然鹅细细一品觉得自己其实不算特别优秀 远远没有达到自己想要的。也许光鲜的表面掩盖了空洞的内在,每每想到于此,皆有夜半临渊如履薄冰之感。为了睡上几个踏实觉,即日起 暂缓其他基于PostgreSQL数据库的兼容功能开发,近段时间 将着重于学习分享Postgres的基础知识和实践内幕。


学习内容:(详见目录)

1、PostgreSQL数据库数据库之 Continuous Integration


学习时间:

2024年05月09日 20:43:46


学习产出:

1、PostgreSQL数据库基础知识回顾 1个
2、CSDN 技术博客 1篇
3、PostgreSQL数据库内核深入学习


注:下面我们所有的学习环境是Centos8+PostgreSQL master +Oracle19C+MySQL8.0

postgres=# select version();version                                                   
------------------------------------------------------------------------------------------------------------PostgreSQL 17devel on x86_64-pc-linux-gnu, compiled by gcc (GCC) 8.5.0 20210514 (Red Hat 8.5.0-21), 64-bit
(1 row)postgres=##-----------------------------------------------------------------------------#SQL> select * from v$version;          BANNER        Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production	
BANNER_FULL	  Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production Version 19.17.0.0.0	
BANNER_LEGACY Oracle Database 19c EE Extreme Perf Release 19.0.0.0.0 - Production	
CON_ID 0#-----------------------------------------------------------------------------#mysql> select version();
+-----------+
| version() |
+-----------+
| 8.0.27    |
+-----------+
1 row in set (0.06 sec)mysql>

功能使用背景说明

README

下面是PostgreSQL的 https://github.com/postgres/postgres/blob/master/src/tools/ci/README 的内容,如下:

Postgres Continuous Integration (CI)

Postgres 有两种形式的 CI:

  1. main postgres 存储库中所有支持的分支都通过 buildfarm 进行持续测试。由于这仅涵盖主存储库,因此不能在功能开发过程中使用它。有关详细信息,请参阅 https://buildfarm.postgresql.org/

  2. 对于尚未合并的开发工作,可以为一些 git 托管提供商启用 CI。这使得开发人员可以在合并(甚至提交)补丁之前在多个平台上测试补丁。


Configuring CI on personal repositories

目前,postgres 包含利用 cirrus-ci 的 CI 支持。cirrus-ci 目前仅适用于 github。


Enabling cirrus-ci in a github repository

要在存储库上启用 cirrus-ci,请访问 https://github.com/marketplace/cirrus-ci:

  • 并选择"Public Repositories"
  • 然后"Install it for free""Complete order"
  • 下一页允许配置 cirrus-ci 可以访问的存储库。选择相关存储库并"Install"

See also https://cirrus-ci.org/guide/quick-start/

一旦在存储库上启用,该存储库中未来的提交和拉取请求将自动触发 CI 构建。这些可以从提交历史记录/PR 中看到,也可以在 cirrus-ci UI 中查看:

https://cirrus-ci.com/github/<username>/<reponame>/-- 例如本人的
-- https://cirrus-ci.com/github/TsinghuaLucky912/postgres

在这里插入图片描述

提示:所有构建日志文件都会上传到 cirrus-ci,并且可以在单击构建摘要页面上的特定任务后从 cirrus-ci UI 的"Artifacts"部分下载。


Images used for CI

为了保持 CI 时间可以忍受,大多数平台都使用预先生成的图像。一些平台使用容器,其他平台使用完整的虚拟机。两者的镜像都是从 CI 运行中单独生成的,否则每个正在测试的 git 存储库都需要构建自己的一组容器,这将是浪费(在空间和时间上)。

这些镜像是根据 https://github.com/anarazel/pg-vm-images/ 中的规范每天构建的。


Controlling CI via commit messages

CI 的行为可以通过提交消息中的特殊内容来控制。目前可以使用以下控件:

  • ci-os-only: {(freebsd|linux|macos|windows|mingw)}

仅在指定的操作系统上运行 CI。当解决仅影响平台子集的可移植性问题时,这非常有用。


Using custom compute resources for CI

在存储库中运行大量测试时,cirrus-ci 的免费积分是不够的。在这些情况下,可以将存储库配置为使用其他基础设施来运行测试。为此,可以在 cirrus-ci Web 界面中为存储库配置 REPO_CI_CONFIG_GIT_URL 变量,网址为 https://cirrus-ci.com/github/<用户或组织>。该变量引用的文件(参见 https://cirrus-ci.org/guide/programming-tasks/#fs )可以覆盖不同操作系统的默认执行方法,该方法定义在 .cirrus.yml 中(通过重新定义相关的yaml锚)

可以使用以下方式提供自定义计算资源:

  • https://cirrus-ci.org/guide/supported-computing-services/
  • https://cirrus-ci.org/guide/persistent-workers/

Wiki

wiki链接:https://wiki.postgresql.org/wiki/Continuous_Integration

这里有一些关于如何使用各种免费持续集成服务的信息,供 PostgreSQL 黑客使用。您需要一个 BitBucket、GitHub、GitLab 或其他公共源存储库帐户。然后,您需要选择一项或多项 CI 服务并告诉它监视您的帐户。对于流行的存储库主机,您不必在 CI 提供商网站上创建新帐户 - 您只需授予访问权限。最后,您必须告诉它如何使用源树中的一个或多个控制文件构建分支。您可以在仅存在于功能开发分支中的额外提交中添加控制文件。

非官方的 PostgreSQL Cfbot Patch Tester 使用其中的几个服务来测试发布到 -hackers 邮件列表的补丁,它创建的分支包含一些可能有用的示例控制文件。


Postgres CI on github

这是在各种环境上测试补丁的推荐方法,使用与非官方 commit fest 机器人相同的 CI。您可以按照 https://github.com/postgres/postgres/blob/master/src/tools/ci/README 中的说明在自己的 github 存储库上配置它。它非常简单,几分钟内即可完成配置。


AppVeyor

AppVeyor 在 Windows、Linux、macOS 上构建和测试代码。支持 GitHub、GitHub Enterprise、Bitbucket、GitLab、VSTS、Kiln 或自定义可公开访问的存储库。来自 Peter Eisentraut 的 讨论 的 MingGW、Cygwin、MSVC appveyor.yml 文件


Cirrus CI

Cirrus CI 至少支持 Windows、Linux、FreeBSD 和 macOS,因此它目前拥有 PostgreSQL 所针对的最广泛的操作系统(并且可能很快还会有更多)。它仅支持 Github 作为源,并且可以从 Github Marketplace 轻松地为您的帐户启用。对于开源项目来说它是免费的。

这是一个正在进行的示例,说明如何使用它在这四个操作系统上构建 PostgreSQL 分支。单击绿色复选标记查看结果,然后查看该分支中的顶部提交以获取控制文件。.cirrus.yml 文件包含进一步工作的待办事项列表…


CodeCov

CodeCov 不是 CI 系统,但与之密切相关且值得一提。如果您配置 Travis CI 来构建和测试启用了覆盖率的分支,您可能还会有兴趣在 CodeCov 上漂亮的 Web 界面中查看代码覆盖率信息。


Travis CI

Travis CI 支持 Linux、macOS 甚至更多。仅适用于 GitHub。由 .travis.yml 文件控制。


How to Add More Environments to the Postgres CI

  • 原文链接:How to Add More Environments to the Postgres CI,点击前往

您是否曾经使用过 Postgres 源代码并且不确定是否破坏了任何东西?Postgres 有一个相当全面的回归测试套件,有助于确保没有任何问题。当然,您可以在您的计算机上运行这些测试并检查您的 Postgres 版本是否正常工作。但它总是可以在你的机器上运行,对吗? 其他环境呢?

在这篇博文中,您将根据我创建第一个 Postgres 补丁的经验和学习,了解如何启用和使用 Postgres CI(以及如何为其做出贡献!)。具体来说,您将学到:

  1. 如何为 GitHub 分支启用 PostgreSQL 的 CI
  2. 如何在 MinGW 环境中在 Windows 上构建和测试 Postgres
  3. 如何将新环境添加到 PostgreSQL CI 中

在这里插入图片描述

如何在 GitHub 分支中启用 PostgreSQL 的 CI

Postgres 因在多个不同平台上运行而享有盛誉。因此,验证您的代码是否可以跨这些不同的平台运行非常重要。这就是 CI 工具派上用场的地方。PostgreSQL 自带了自己推荐的 CI:Cirrus CI。您可以检查并了解 Postgres 的 CI 并在您的 fork 上运行 CI。Cirrus CI 支持 Windows、Linux、FreeBSD 和 macOS,并允许您在这些操作系统上测试您的更改。

要通过 Cirrus CI 运行测试,只需按照以下步骤操作:

  1. 在 GitHub 上分叉 PostgreSQL 存储库
  2. 在 GitHub 市场上搜索 Cirrus CI 应用程序并将该应用程序添加到您的帐户
    GitHub 市场上的 Cirrus CI 应用程序的屏幕截图。您可以轻松设置免费试用并开始使用 Cirrus
  3. 确保 Cirrus CI 应用程序可以访问您刚刚在步骤 1 中分叉的 Postgres 存储库
  4. Cirrus CI 现在已准备好运行。一旦您将提交推送到 Postgres 分支,Cirrus 将使用您最近的提交运行 CI 任务

随着您的新提交,GitHub 将向您显示 CI 检查已排队或正在运行。例如 我前几天写的一个功能的CI,如下:

设置具有存储库访问权限的 Cirrus CI 后,Cirrus CI 在 GitHub 上检查 Postgres 存储库中的提交的屏幕截图

在这里插入图片描述

您还可以通过导航到 Cirrus 查看更多详细信息。Cirrus CI 上的官方 Postgres 存储库如下所示:

官方 Postgres 存储库的概述类似于 Cirrus CI 上的内容。您可以查看提交的历史记录及其 CI 结果

Cirrus CI 将向您显示每次提交的构建结果,并在出现错误时上传日志文件。

现在您知道需要做什么才能从 Postgres 的 CI 中受益。即使 Cirrus CI 目前是其他 Postgres CI 中操作系统范围最广的一个,但支持的环境数量仍然有限。目前,Cirrus CI 上的 Postgres 只有四种操作系统可用。如果您需要更多,您当然可以通过以下两个步骤将环境添加到 PostgreSQL 的 CI 中:

  1. 在目标环境中成功构建 Postgres
  2. 将该环境添加到 Postgres 的 CI 中

如何在 MinGW 环境中在 Windows 上构建和测试 Postgres

本节介绍如何使用 MinGW 在 Windows 上构建 Postgres。MinGW 代表 Minimal GNU for Windows,我选择它作为添加到 Postgres CI 的新环境。如果您已经熟悉在 MinGW 上构建 Postgres 或者您的目标环境不同,则可以跳过本节。

如果您曾经研究过如何在 Windows 上构建 Postgres,您就会知道有不止一种方法可以做到这一点。

  • 使用 Visual Studio:构建 Postgres 的最 Windows 方式是使用 Microsoft Visual Studio。Postgres 已经有了 Visual Studio 的 CI 任务。
  • 使用 MinGW:另一种方法是在 Windows 上使用 MinGW。我个人喜欢在 Windows 上使用 MinGW for Postgres,因为它允许您使用 GNU 工具在 Windows 上构建 Postgres。既然如此,本文中添加到 Postgres CI 中的环境就是 MinGW。

将 MinGW 与 MSYS2 结合使用:如果您也决定使用 MinGW,我建议安装 MSYS2,这是一个提供 MinGW 环境等的工具。MSYS2 附带了您可能熟悉的 Unix 环境工具和包管理器,使我们能够获取为 Windows 原生构建的包。

MSYS2 并没有为我们提供单一的 MinGW 环境。MSYS2 上有两种 C 标准库变体:

  • Microsoft Visual C++ 运行时 (MSVCRT)。然而,即使 MSVCRT 在 Windows 上也可用,它也是一个较旧的库,不兼容 C99。
  • 通用 C 运行时 (UCRT)。UCRT 是最新版本,默认情况下由 Microsoft Visual Studio 使用,因此 UCRT 的构建行为就像本地构建一样。

如果您已准备好 MSYS2,则可以继续使用 MinGW 和 UCRT 环境来实际从源代码构建 Postgres。


通过 MinGW 和 UCRT 构建 PostgreSQL 的步骤

  1. 您可以通过在 Windows 上搜索 MSYS2 MinGW UCRT x64 或将名为 MSYSTEM 的环境变量设置为 UCRT64 来运行带有 UCRT shell 的 MinGW。默认的 MSYS2 环境由 MSYSTEM 变量(如果已设置)决定。
  2. 设置 MSYSTEM 后,您可以通过 PowerShell 运行以下命令,使用 UCRT shell 启动 MinGW:
$env:MSYSTEM = ‘UCRT64’
C:\<Path to MSYS installation>\usr\bin\bash.exe -l
  1. 如果您是第一次启动 MinGW,请首先更新基础包和数据库。
pacman -Suy
  1. 然后安装所需的软件包以在 MinGW 上构建 Postgres
pacman -S --needed git bison flex diffutils make ucrt64/mingw-w64-ucrt-x86_64-gcc 
  1. 现在您已完成 MinGW 环境设置。让我们继续查看 Postgres 文档中的安装说明。在此之后,该过程就像我们如何在基于 Unix 的环境中构建 Postgres 一样。您需要运行configure 和make 命令,它们将完成工作。
./configure --enable-cassert --enable-debug 
  1. 如果所有这些步骤都成功,您可以运行 make check 并查看新构建的 Postgres 是否一切正常。您可能还想启用一些附加配置选项。尽管 MinGW 中并非提供所有这些选项,但您可以尝试使用其中一些选项进行构建,例如 icu、lz4 等。以下是如何通过运行安装一小部分 Postgres 依赖项:
pacman -S ucrt64/mingw-w64-ucrt-x86_64-{icu,libxml2,libxslt,lz4}## 然后相应地更改配置命令:
./configure --host=x86_64-w64-mingw32 --with-icu --with-libxml --with-libxslt --with-lz4 

如何将您的环境添加到 Postgres CI 中

现在您知道如何准备 MinGW 环境以及构建 Postgres 所需的步骤。如果 Cirrus CI 可以为我们完成所有这些工作,那不是很棒吗?令人高兴的是,您可以告诉 Cirrus 运行构建 Postgres 所需的命令。

首先要让 Cirrus 知道要在哪个环境上运行。此环境可以是 Cirrus CI 默认提供的环境之一,或者 Cirrus 也可以使用用户创建的 VM 或 Docker 容器映像。

您可以在 pg-vm-images 存储库中找到 Postgres 使用的 VM 和容器映像。尽管 Cirrus CI 已经提供了 Windows 容器,但您可能需要在映像上安装和配置许多不同的东西。在 MinGW 的情况下,需要一个 Windows Docker 映像,其中包含按本博客文章前面部分所述安装的 MinGW。您可以找到添加此类 Windows 映像的 PR。

合并准备 VM 或容器映像的 PR 后,您可以进入下一步:将脚本添加到 cirrus.yml 文件。我们已经有了用于 MinGW 构建的配置和构建命令。

首先,您需要创建一个新任务并指定新任务将使用您添加到 pg-vm-images 中的容器。

task:name: Windows - Server 2019, MinGW64windows_container:image: $CONTAINER_REPO/windows_ci_mingw64:latest 

Cirrus 有一个名为 CIRRUS_WORKING_DIR 的环境变量,它是 Cirrus 运行的目录。在此路径下,指定 BUILD_DIR 变量作为 Postgres 的构建目录。

env:BUILD_DIR: "%CIRRUS_WORKING_DIR%/build" 

然后,您可以将配置、构建和测试脚本添加到新任务中。

configure_script:- C:\msys64\usr\bin\dash.exe -lc "mkdir %BUILD_DIR% &&cd %BUILD_DIR% &&%CIRRUS_WORKING_DIR%/configure--enable-cassert--enable-debug--with-icu--with-libxml--with-libxslt--with-lz4build_script:C:\msys64\usr\bin\dash.exe -lc "cd %BUILD_DIR% && make world-bin"tests_script:- C:\msys64\usr\bin\dash.exe -lc "cd %BUILD_DIR% && make check-world TMPDIR=%BUILD_DIR%/tmp_install" 

最后,您可能需要添加 on_failure 指令来告诉发生故障时该怎么做。您可以简单地使用 Autoconf 调用任务的现有 on_failure_ac 配置。

on_failure:<<: *on_failure_ac 

完成所有这些步骤后,您现在可以提交并将更改推送到 cirrus.yml 文件上。Cirrus CI 将通过 MinGW 识别您的新任务。您应该看到新的 MinGW 任务将在 Cirrus CI 上运行。

在 Cirrus CI 上运行的 CI 任务,包括最近添加的 MinGW 任务


使用 Postgres CI 并为其做出贡献使我们所有 PG 开发人员的生活变得更轻松

将 MinGW 添加到 Postgres 的 CI 中的这项工作是我对 Postgres 的第一个补丁。(尚未提交,但正在接受审核。)您可以查看补丁以了解有关如何将新任务添加到 CI 中的更多信息。

这篇博文向您展示了如何使用 Postgres 的 CI 并为其做出贡献,以及如何使用 MinGW 构建 Postgres。为您的分支启用 Cirrus CI 将帮助您查看针对 Postgres 更改的测试结果。为 Postgres CI 做出贡献是让 Postgres 变得更好的好方法,特别是当您需要比现有更多的环境或操作系统时。

这篇关于PostgreSQL的学习心得和知识总结(一百四十二)|深入理解PostgreSQL数据库数据库之 Continuous Integration的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



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

相关文章

深入理解C++ 空类大小

《深入理解C++空类大小》本文主要介绍了C++空类大小,规定空类大小为1字节,主要是为了保证对象的唯一性和可区分性,满足数组元素地址连续的要求,下面就来了解一下... 目录1. 保证对象的唯一性和可区分性2. 满足数组元素地址连续的要求3. 与C++的对象模型和内存管理机制相适配查看类对象内存在C++中,规

C#实现文件读写到SQLite数据库

《C#实现文件读写到SQLite数据库》这篇文章主要为大家详细介绍了使用C#将文件读写到SQLite数据库的几种方法,文中的示例代码讲解详细,感兴趣的小伙伴可以参考一下... 目录1. 使用 BLOB 存储文件2. 存储文件路径3. 分块存储文件《文件读写到SQLite数据库China编程的方法》博客中,介绍了文

Android数据库Room的实际使用过程总结

《Android数据库Room的实际使用过程总结》这篇文章主要给大家介绍了关于Android数据库Room的实际使用过程,详细介绍了如何创建实体类、数据访问对象(DAO)和数据库抽象类,需要的朋友可以... 目录前言一、Room的基本使用1.项目配置2.创建实体类(Entity)3.创建数据访问对象(DAO

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

Java向kettle8.0传递参数的方式总结

《Java向kettle8.0传递参数的方式总结》介绍了如何在Kettle中传递参数到转换和作业中,包括设置全局properties、使用TransMeta和JobMeta的parameterValu... 目录1.传递参数到转换中2.传递参数到作业中总结1.传递参数到转换中1.1. 通过设置Trans的

C# Task Cancellation使用总结

《C#TaskCancellation使用总结》本文主要介绍了在使用CancellationTokenSource取消任务时的行为,以及如何使用Task的ContinueWith方法来处理任务的延... 目录C# Task Cancellation总结1、调用cancellationTokenSource.

Oracle数据库执行计划的查看与分析技巧

《Oracle数据库执行计划的查看与分析技巧》在Oracle数据库中,执行计划能够帮助我们深入了解SQL语句在数据库内部的执行细节,进而优化查询性能、提升系统效率,执行计划是Oracle数据库优化器为... 目录一、什么是执行计划二、查看执行计划的方法(一)使用 EXPLAIN PLAN 命令(二)通过 S

PostgreSQL如何查询表结构和索引信息

《PostgreSQL如何查询表结构和索引信息》文章介绍了在PostgreSQL中查询表结构和索引信息的几种方法,包括使用`d`元命令、系统数据字典查询以及使用可视化工具DBeaver... 目录前言使用\d元命令查看表字段信息和索引信息通过系统数据字典查询表结构通过系统数据字典查询索引信息查询所有的表名可

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert