Melih Mutlu的这篇__关于PostgreSQL CI的__文章最初发表在Microsoft TechCommunity Blog上。
你曾经是否使用过Postgres源代码,但不确定自己是否破坏了其中的某些东西呢?Postgres有一个非常全面且有助于确保没有任何损坏的回归测试套件。你当然也可以在你的计算机上运行这些测试,并检查你的Postgres版本是否能够正常工作。但它总能在你的计算机上运行,对吧?那么其他环境呢?
这篇blog基于我在创建第一个Postgres补丁得到的经验和学习,将教你如何启用和使用Postgres CI(以及如何为它做出贡献!)。具体来说,你将了解:
如何在 GitHub 分叉中启用 PostgreSQL 's CI
Postgres在多个不同平台上运行方面享有很大的名气。因此,验证代码是否适用于这些不同平台非常重要。这就是 CI 工具派得上用处的地方。PostgreSQL带有自己推荐的CI:Cirrus CI。你可以查看并学习Postgres’s CI,并在你的分叉数据库上运行CI。Cirrus CI 支持 Windows、Linux、FreeBSD 和 macOS,并允许你在这些操作系统上测试你的更改。
要通过 Cirrus CI 运行测试,只需按照以下步骤:
-
在GitHub上分叉PostgreSQL存储库。
-
在GitHub 市场上搜索 Cirrus CI 应用程序,并将该应用程序添加到你的帐
**图1:**GitHub 市场上 Cirrus CI 应用程序的屏幕截图。你可以轻松设置免费试用版并开始使用 Cirrus。 -
确保 Cirrus CI 应用程序能够访问你刚刚在步骤 1 中分叉的 Postgres 存储库。
-
Cirrus CI现已准备好运行。一旦你把一个提交推送到你的Postgres分叉,Cirrus将用你最近的提交中进行CI任务的运行。
通过你的新提交,GitHub 将显示 CI 检查已被列入等待或正在运行。

**图2:**Cirrus CI 的屏幕截图在 GitHub 上检查 Postgres 存储库中的提交,之后设置了对存储库的访问权限的 Cirrus CI。
你还可以通过导航到 Cirrus 来查看更多详细信息。以下是Cirrus CI上的官方Postgres存储库的样子:

**图3:**一个官方 Postgres 回购的概述看起来与 Cirrus CI类似。你可以通过在图中看到提交的历史记录和它们的 CI 结果。
Cirrus CI 将在每次提交时向你显示构建结果,并在发生错误时上传日志文件。
现在你知道需要做什么才能从Postgres’CI中受益。即使Cirrus CI目前是其他Postgres CI中操作系统范围最广的一个,支持的环境数量仍然有限。目前只有四个操作系统可用于Cirrus CI上的Postgres。如果你需要更多,你可以通过以下两个步骤将环境添加到PostgreSQL’s CI中:
- 在目标环境中成功构建 Postgres。
- 将该环境添加到Postgres’s CI中。
如何在 MinGW 环境中在 Windows 上构建和测试 Postgres。
本节解释了如何使用MinGW在Windows上构建Postgres。MinGW代表“Minimal GNU for Windows”,以及这是我选择添加到Postgres CI的新环境。如果你已经熟悉了在 MinGW 上构建 Postgres,或者你的目标环境不同,那么你就可以跳过本节。
如果你曾经研究过如何在Windows上构建Postgres,你就会知道有不止一种方法可以做到这一点。
- 使用 VisualStudio: 生成 Postgres 最常用的 Windows 方式是使用 MicrosoftVisualStudio。Postgres 在 VisualStudio 中已经有一个 CI 任务。
- 使用 MinGW: 另一种方法是在 Windows 上使用 MinGW。我个人喜欢在 Windows 上使用 MinGW for Postgres,因为它允许你使用 GNU 工具在 Windows 上构建 Postgres。在这种情况下,添加到 Postgres ’ CI 中的环境是 MinGW。
结合 MSYS2使用 MinGW
如果你也决定使用 MinGW,我建议你安装 MSYS2,它是一个提供 MinGW 环境和更多功能的工具。MSYS2提供了你可能熟悉的 Unix 环境工具和一个包管理器,它允许我们获得为 Windows 本地构建的包。
MSYS2没有给我们提供一个单一的 MinGW 环境。 MSYS2上有两种不同的 C 标准库:
-
MicrosoftVisualC + + 运行时(MSVCRT)。然而,即使 MSVCRT 也可以在 Windows 上使用,它是一个不兼容 C99的旧库。
-
通用 C 运行时(UCRT)。UCRT 是最新版本,默认情况下由 MicrosoftVisualStudio 使用,这样 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 --enable-cassert --enable-debug make -
如果所有这些步骤都成功,你就可以运行“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 使用的虚拟机和容器映像。即使 Cirrus CI 已经提供了一个 Windows 容器,你也可能需要在映像上安装和配置一堆不同的东西。在 MinGW 案例中,需要一个包含 MinGW 的 Windows Docker 映像,如本博客文章前面部分所述。你可以找到添加此类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有一个名为“CIRRUSWORKINGDIR”的环境变量,它是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”指令,以告知在发生故障时该怎么做。你可以简单地调用自动conf任务的现有“on_failure_ac”配置。
on_failure:
<<: *on_failure_ac
完成所有这些步骤后,你现在就可以在 cirrus.yml 文件上提交和推送更改。Cirrus CI将识别你所使用MinGW的新任务。你应该能够看到新的MinGW任务将在Cirrus CI上运行。

**图4:**在Cirrus CI上运行的CI任务,包括最近添加的MinGW任务。
Cirrus还将显示运行MinGW任务及其日志所需的所有步骤。
使用和贡献Postgres CI使我们所有PG开发人员的生活更轻松
将MinGW添加到Postgres的CI中的工作被证明是我对Postgres的第一个补丁。(它尚未提交,但正在审核中。你可以查看修补程序,详细了解如何将新任务添加到 CI 中。
这篇blog向你展示了如何使用和贡献Postgres’CI,以及如何使用MinGW构建Postgres。为你的分支启用 Cirrus CI 将帮助你根据 Postgres 的更改查看测试结果。为 Postgres CI 做出贡献是使 Postgres 变得更好的好方法,特别是如果你需要比现有环境或操作系统更多的环境或操作系统。
原文标题:How to Add More Environments to the Postgres CI
原文作者:Melih Mutlu
原文链接:https://www.citusdata.com/blog/2022/09/30/how-to-add-more-environments-to-postgres-ci/




