注:提前言明 本文借鉴了以下博主、书籍或网站的内容,其列表如下:
PostgreSQL数据库数据库之 Continuous Integration
文章快速说明索引
学习目标:
做数据库内核开发久了就会有一种 少年得志,年少轻狂 的错觉,然鹅细细一品觉得自己其实不算特别优秀 远远没有达到自己想要的。也许光鲜的表面掩盖了空洞的内在,每每想到于此,皆有夜半临渊如履薄冰之感。为了睡上几个踏实觉,即日起 暂缓其他基于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:
-
main postgres 存储库中所有支持的分支都通过 buildfarm 进行持续测试。由于这仅涵盖主存储库,因此不能在功能开发过程中使用它。有关详细信息,请参阅 https://buildfarm.postgresql.org/
-
对于尚未合并的开发工作,可以为一些 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
您是否曾经使用过 Postgres 源代码并且不确定是否破坏了任何东西?Postgres 有一个相当全面的回归测试套件,有助于确保没有任何问题。当然,您可以在您的计算机上运行这些测试并检查您的 Postgres 版本是否正常工作。但它总是可以在你的机器上运行,对吗? 其他环境呢?
在这篇博文中,您将根据我创建第一个 Postgres 补丁的经验和学习,了解如何启用和使用 Postgres CI(以及如何为其做出贡献!)。具体来说,您将学到:
- 如何为 GitHub 分支启用 PostgreSQL 的 CI
- 如何在 MinGW 环境中在 Windows 上构建和测试 Postgres
- 如何将新环境添加到 PostgreSQL CI 中
如何在 GitHub 分支中启用 PostgreSQL 的 CI
Postgres 因在多个不同平台上运行而享有盛誉。因此,验证您的代码是否可以跨这些不同的平台运行非常重要。这就是 CI 工具派上用场的地方。PostgreSQL 自带了自己推荐的 CI:Cirrus CI。您可以检查并了解 Postgres 的 CI 并在您的 fork 上运行 CI。Cirrus CI 支持 Windows、Linux、FreeBSD 和 macOS,并允许您在这些操作系统上测试您的更改。
要通过 Cirrus CI 运行测试,只需按照以下步骤操作:
- 在 GitHub 上分叉 PostgreSQL 存储库
- 在 GitHub 市场上搜索 Cirrus CI 应用程序并将该应用程序添加到您的帐户
- 确保 Cirrus CI 应用程序可以访问您刚刚在步骤 1 中分叉的 Postgres 存储库
- Cirrus CI 现在已准备好运行。一旦您将提交推送到 Postgres 分支,Cirrus 将使用您最近的提交运行 CI 任务
随着您的新提交,GitHub 将向您显示 CI 检查已排队或正在运行。例如 我前几天写的一个功能的CI,如下:
您还可以通过导航到 Cirrus 查看更多详细信息。Cirrus CI 上的官方 Postgres 存储库如下所示:
Cirrus CI 将向您显示每次提交的构建结果,并在出现错误时上传日志文件。
现在您知道需要做什么才能从 Postgres 的 CI 中受益。即使 Cirrus CI 目前是其他 Postgres CI 中操作系统范围最广的一个,但支持的环境数量仍然有限。目前,Cirrus CI 上的 Postgres 只有四种操作系统可用。如果您需要更多,您当然可以通过以下两个步骤将环境添加到 PostgreSQL 的 CI 中:
- 在目标环境中成功构建 Postgres
- 将该环境添加到 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 的步骤:
- 您可以通过在 Windows 上搜索
MSYS2 MinGW UCRT x64
或将名为MSYSTEM
的环境变量设置为UCRT64
来运行带有 UCRT shell 的 MinGW。默认的 MSYS2 环境由MSYSTEM
变量(如果已设置)决定。 - 设置
MSYSTEM
后,您可以通过 PowerShell 运行以下命令,使用 UCRT shell 启动 MinGW:
$env:MSYSTEM = ‘UCRT64’
C:\<Path to MSYS installation>\usr\bin\bash.exe -l
- 如果您是第一次启动 MinGW,请首先更新基础包和数据库。
pacman -Suy
- 然后安装所需的软件包以在 MinGW 上构建 Postgres
pacman -S --needed git bison flex diffutils make ucrt64/mingw-w64-ucrt-x86_64-gcc
- 现在您已完成 MinGW 环境设置。让我们继续查看 Postgres 文档中的安装说明。在此之后,该过程就像我们如何在基于 Unix 的环境中构建 Postgres 一样。您需要运行configure 和make 命令,它们将完成工作。
./configure --enable-cassert --enable-debug
- 如果所有这些步骤都成功,您可以运行 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, MinGW64
windows_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-lz4
build_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 上运行。
使用 Postgres CI 并为其做出贡献使我们所有 PG 开发人员的生活变得更轻松
将 MinGW 添加到 Postgres 的 CI 中的这项工作是我对 Postgres 的第一个补丁。(尚未提交,但正在接受审核。)您可以查看补丁以了解有关如何将新任务添加到 CI 中的更多信息。
这篇博文向您展示了如何使用 Postgres 的 CI 并为其做出贡献,以及如何使用 MinGW 构建 Postgres。为您的分支启用 Cirrus CI 将帮助您查看针对 Postgres 更改的测试结果。为 Postgres CI 做出贡献是让 Postgres 变得更好的好方法,特别是当您需要比现有更多的环境或操作系统时。