PostgreSQL Buildfarm Client 21:补丁栈测试、ABI 检查与非标准分支支持

2026-07-11 33 预计阅读时间: 1 分钟
来源: postgr.es AI 摘要 Original link

Disclaimer: This article is an AI-assisted summary. Read it together with the original source when precision matters. The summary may omit context, version differences, or edge cases and is not official documentation.

预计阅读时间:10 分钟

PostgreSQL Buildfarm Client 21 的变化不只是一批兼容性修复。它新增补丁栈与 ABI 检查模块,改进非标准分支和 Meson 构建识别,同时强化跨版本升级测试、超时诊断与失败日志归档。对于维护私有 Buildfarm、扩展分支或长期补丁队列的团队,这一版解决了不少日常自动化中的实际痛点。

PatchStack:让私有 Buildfarm 验证一组连续补丁

新的 PatchStack 模块面向非标准 Buildfarm:它可以在某个基础分支之上应用一组补丁,然后运行构建和测试。这适合验证存在前后依赖的补丁队列,例如 PostgreSQL 扩展适配、内部功能分支,或者尚未合并的一系列提交。

边界必须说清楚:PatchStack 不能用于向常规 PostgreSQL 社区 Buildfarm 服务器报告的构建。服务端会检测并拒绝这类结果。因此,它更适合隔离的内部基础设施,而不是改变社区 Buildfarm 的测试语义。

版本 21 还调整了执行顺序:模块检出被推迟到 find_changed 之后。这样,PatchStack 自身带来的提交不会再导致 find_changed 永远认为需要重新构建,避免机器陷入无意义的重复任务。

如果团队准备建立补丁栈流水线,可以这样实践。下面是一个可直接运行的 Shell 骨架;它不是 Buildfarm Client 的官方配置格式,而是用于在接入模块前验证补丁队列是否能干净应用:

#!/usr/bin/env bash
set -euo pipefail

BASE_BRANCH="${BASE_BRANCH:-main}"
PATCH_DIR="${PATCH_DIR:-$PWD/patches}"
WORKTREE="${WORKTREE:-$PWD/.patchstack-worktree}"

rm -rf "$WORKTREE"
git worktree add --detach "$WORKTREE" "$BASE_BRANCH"
trap 'git worktree remove --force "$WORKTREE" >/dev/null 2>&1 || true' EXIT

cd "$WORKTREE"
for patch in "$PATCH_DIR"/*.patch; do
  test -e "$patch" || continue
  printf 'Applying %s\n' "$patch"
  git am --3way "$patch"
done

if test -f meson.build; then
  meson setup build --buildtype=debug
  meson compile -C build
  meson test -C build --print-errorlogs
else
  ./configure --enable-cassert --enable-debug
  make -j"$(getconf _NPROCESSORS_ONLN 2>/dev/null || printf 2)"
  make check
fi

运行前需要把补丁放入 patches/,并按顺序命名,例如 0001-base.patch0002-follow-up.patch。正式接入时,应由私有 Buildfarm 的 PatchStack 配置负责补丁来源、应用顺序和结果上报,并确保目标不是社区服务器。

ABI 检查进入自动化构建

新增的 ABI check 模块调用 abidw,用于检测已安装头文件相关的 ABI 变化。模块传入 --headers-dir--drop-private-types,以兼容不同版本的 abidw。这一功能最初由 Mankirat Singh 编写,Tom Lane 又补充了后续改动。

ABI 检查的价值在于,它能发现“源码仍可编译,但二进制接口已经改变”的情况。对于加载 PostgreSQL 服务端符号的扩展、内部二进制包和长期维护分支,这类变化可能直到部署后才暴露。

可以先用下面的命令确认构建机是否具备所需工具,并生成 ABI 描述文件。实际头文件和共享库路径需要按安装前缀修改:

set -euo pipefail

command -v abidw >/dev/null || {
  echo "abidw is required; install your distribution's libabigail package" >&2
  exit 1
}

PREFIX="${PREFIX:-/usr/local/pgsql}"
LIB="${LIB:-$PREFIX/lib/libpq.so}"
HEADERS="${HEADERS:-$PREFIX/include}"
OUT="${OUT:-libpq.abi.xml}"

abidw \
  --headers-dir "$HEADERS" \
  --drop-private-types \
  --out-file "$OUT" \
  "$LIB"

test -s "$OUT"
printf 'ABI description written to %s\n' "$OUT"

生成描述文件只是第一步。持续集成中还需要保存一个明确的基线,并区分预期 ABI 变更与意外回归。否则,检查可能退化为持续产生告警、却无人处理的噪声源。

分支发现与 Meson 判断更适合私有拓扑

run_branches.pl 现在支持 branches_target 配置项,可使用独立目标地址获取 branches_of_interest.json,不必再通过正则表达式改写主 target 地址。未设置时仍保留旧的推导方式,相应的 pgbuildfarm 地址迁移逻辑也会应用到这个新配置项。

这项改动对反向代理、多环境部署和路径结构不一致的私有服务尤其有用。可以这样规划配置,具体 Perl 变量名和文件布局应以现有 Buildfarm 配置为准:

# 示例配置片段:地址仅用于展示拓扑,请替换为内部服务地址。
my $conf = {
    target          => 'https://buildfarm.internal.example/api/report',
    branches_target => 'https://metadata.internal.example/branches_of_interest.json',
};

非标准分支处理也得到了一组配套修复:正则匹配分支不再添加 bf_ 前缀;远程分支会以更合理的方式获取后再匹配;缺少可用 symbolic HEAD、镜像远端没有 HEAD 等情况也能被处理,并减少无意义的克隆警告。

Meson 判断同样摆脱了分支名假设。版本 21 根据仓库中是否存在 meson.build 决定 using_meson,因此自定义分支名不会误导构建系统选择;构建时也改用 Meson 的 --buildtype 选项。这与上面的实践脚本采用了相同判断方式。

升级测试、协议与诊断细节

跨版本升级测试现在会压缩 pg_upgrade dump 文件,减少测试机磁盘压力。对于 PostgreSQL 20 及更高版本,不再测试从 10 以前版本升级;pg_upgrade_output.d 的相对路径和输出收集问题也得到修复。

客户端还适配了上游 libpq 协议版本变化,并按照开发者讨论更早移除 PGMAXPROTOCOLVERSION 设置。这里的重点不是引入新协议,而是避免测试环境用过时的上限覆盖上游行为。

诊断能力的改进会直接影响故障排查效率:失败阶段的日志会被归档,并额外收集一个日志文件;命令超时时的运行时报告更清晰;等待超时的 sleep 不会再被信号提前结束。测试运行目录不再直接删除,而是移到一旁供后续分析。

此外,版本 21 修复了 configure/make 构建中的 TAP 测试重复执行、scalar(glob()) 的 Perl 问题、辅助脚本在当前目录查找配置文件失败,以及 run_branches.pl 未使用代理设置等缺陷。旧版 MSVC 工具集上的特定 test_escape 测试也会在适用条件下跳过。

升级前应检查什么

采用这一版本时,可以按下面的顺序降低风险:

  1. 在一台 Buildfarm 成员机上做灰度升级,确认 Perl 依赖、Git 镜像和代理配置仍然有效。
  2. 私有分支使用者检查正则匹配结果,特别关注旧的 bf_ 前缀是否被下游脚本依赖。
  3. 同时维护 configure/make 与 Meson 的团队,确认仓库根目录的 meson.build 能准确代表预期构建方式。
  4. 启用 ABI check 前建立可审查的 ABI 基线,并明确允许变更的审批流程。
  5. PatchStack 只连接私有 Buildfarm 目标,不向常规社区服务器报告。
  6. 调整日志与磁盘清理策略,因为失败日志和移走的 testrun 目录会保留更多诊断数据。

Buildfarm Client 21 的核心价值,是让测试客户端更少依赖社区仓库的命名和部署惯例,同时保留更完整的失败现场。标准社区成员可以受益于兼容性与诊断修复;维护私有分支和补丁队列的团队,则更值得评估 PatchStack、ABI 检查和独立 branches_target 带来的自动化空间。


相关推荐