10.7.Poudriere

对于ports贡献者来说,poudriere 是最重要和有帮助的测试和构建工具之一。其主要特点包括:

  • 整个ports树、特定子集的ports树或单个port的批量构建,包括其依赖项

  • 构建结果的自动打包

  • 按port生成构建日志文件

  • 提供已签名的 pkg(8) 软件包库

  • 在提交到 FreeBSD bug 追踪器或提交到 BSD 树之前测试 port 构建

  • 使用不同选项测试成功的 ports 构建

因为 poudriere 在一个干净的 jail(8) 环境中进行构建,并使用 zfs(8) 功能,因此它比在主机系统上进行传统测试具有几个优点:

  • 不会污染主机环境:没有残留文件,没有意外删除,不会更改现有配置文件。

  • 验证 pkg-plist 中是否存在缺失或多余条目

  • Ports committers 有时候会要求在补丁提交时附带一个 poudriere 日志,以评估这个补丁是否准备好合并到 ports 树中。

设置和使用它也相当简单,没有依赖性,并且将在任何受支持的 FreeBSD 发行版上运行。本节展示了如何在 ports 贡献者的正常工作流程中安装、配置和运行 poudriere。

本节中的示例展示了 FreeBSD 中的默认文件布局。请根据需要替换任何本地更改。ports 树 由 ${PORTSDIR} 表示,位于 /usr/ports 中。 ${LOCALBASE} 和 ${PREFIX} 默认情况下都在 /usr/local 中。

安装 poudriere

poudriere 可在ports树中的ports-mgmt/poudriere 中找到。可使用 pkg(8)或从ports安装。

# pkg install poudriere

# make -C /usr/ports/ports-mgmt/poudriere install clean

FreeBSD 还有一个正在进行中的 poudriere 版本,最终将成为下一个发布版本。它可以在ports-mgmt/poudriere-devel 中找到。这个开发版本用于官方 FreeBSD 软件包构建,因此经过了充分测试。它通常具有更新的有趣功能。一个ports提交者会想要使用开发版本,因为它是在生产中使用的,并且具有所有新功能,可以确保一切完全正确。贡献者不一定需要这些功能,因为最重要的修复已经被反向移植到发布版本。使用开发版本构建官方软件包的主要原因是它更快,可以将完整构建时间从 18 小时缩短到 17 小时,当使用具有 128GB RAM 的高端 32 CPU 服务器时。这些优化在桌面机器上构建ports时并不重要。

10.7.2. 设置 poudriere

port安装了一个默认配置文件,/usr/local/etc/poudriere.conf。配置文件中记录了每个参数。

这是一个最小示例配置文件:

ZPOOL=zroot
BASEFS=/usr/local/poudriere
DISTFILES_CACHE=/usr/ports/distfiles
RESOLV_CONF=/etc/resolv.conf

ZPOOL

poudriere 应使用的 ZFS 存储池的名称。必须在 zpool status 的输出中列出。

BASEFS

poudriere 文件系统的根挂载点。此条目将导致 poudriere 将 tank/poudriere 挂载到 /poudriere 。

DISTFILES_CACHE

定义 distfiles 存储位置。在此示例中,poudriere 和主机共享 distfiles 存储目录。这样可以避免下载系统中已存在的 tarballs。如果该目录不存在,请创建它,以便 poudriere 可以找到它。

RESOLV_CONF

在 jails 中使用主机的 /etc/resolv.conf 用于 DNS。这是为了当下载时 jails 可以解析 distfiles 的 URL。在使用代理时不需要。有关代理配置,请参考默认配置文件。

10.7.3. 创建 poudriere Jails

创建基础 jails,poudriere 将用于构建:

# poudriere jail -c -j 131Ramd64 -v 13.1-RELEASE -a amd64

从 poudriere.conf 中给出的 FTP 服务器获取 13.1-RELEASE 用于 amd64 ,创建 zfs 文件系统 tank/poudriere/jails/131Ramd64 ,将其挂载在 /poudriere/jails/131Ramd64 上,并将 13.1-RELEASE 压缩包解压到该文件系统中。

# poudriere jail -c -j 12i386 -v stable/12 -a i386 -m git+https

创建 tank/poudriere/jails/12i386 ,将其挂载在 /poudriere/jails/12i386 上,然后从 poudriere.conf 或默认 git.freebsd.org 中的 GIT_HOST 的 Git 分支顶端检出到 /poudriere/jails/12i386/usr/src,然后完成 buildworld 并将其安装到 /poudriere/jails/12i386。

# poudriere jail -c -j 14amd64 -v main -a amd64 -m git+https

为了运行 14.0-CURRENT poudriere jail,主机必须运行 14.0-CURRENT 。一般来说,更新的内核可以构建和运行旧的jails。例如, 14.0-CURRENT 内核可以构建和运行 12.4-STABLE ,如果 COMPAT_FREEBSD12 内核选项被编译进去(在 14.0-CURRENT GENERIC 内核配置中默认开启)。

poudriere 当前已知的jails列表可以通过 poudriere jail -l 显示:

# poudriere jail -l
JAILNAME             VERSION              ARCH    METHOD
131Ramd64            13.1-RELEASE         amd64   ftp
12i386               12.4-STABLE          i386    git+https

10.7.4. 保持 poudriere Jails 更新

管理更新非常简单。命令:

# poudriere jail -u -j JAILNAME

更新指定的 jail 至可用的最新版本。对于 FreeBSD 发行版,请使用 freebsd-update(8) 更新至最新的补丁级别。对于从源代码构建的 FreeBSD 版本,请更新至分支中最新的 git 修订版。

# poudriere jail -u -J 6 -j JAILNAME

设置 Ports 用于与 poudriere 一起使用的 10.7.5. 树

在 poudriere 中使用 ports 树有多种方式。最直接的方法是让 poudriere 使用 Git 创建一个默认 ports 树:

# poudriere ports -c -m git+https -B main

这些命令创建 tank/poudriere/ports/default ,将其挂载到 /poudriere/ports/default,并使用 Git 进行填充。之后它被包含在已知 ports 树的列表中:

# poudriere ports -l
PORTSTREE METHOD    TIMESTAMP           PATH
default   git+https 2020-07-20 04:23:56 /poudriere/ports/default

注意,"default" ports 树是特殊的。稍后解释的每个构建命令都将隐式使用此 ports 树,除非另有特别指定。要使用另一个树,请向命令中添加 -p treename

处理本地修改的 ports 贡献者最好的方法是使用 Git。与 jails 的创建类似,可以使用其他方法创建 ports 树。为了为测试本地修改和 ports 开发添加额外的 ports 树,最好通过 git 检出树(如上所述)。

10.7.6. 使用 poudriere 手动管理的 Ports 树

根据工作流程的不同,手动维护的ports树可能非常有帮助。例如,如果在/work/ports中有ports树的本地副本,请将 poudriere 指向该位置:

# poudriere ports -c -m null -M /work/ports -p development

这将列在已知树的表中:

# poudriere ports -l
PORTSTREE   METHOD    TIMESTAMP           PATH
development null      2020-07-20 05:06:33 /work/ports

10.7.7. 保持 poudriere Ports 树更新

和之前描述的一样简单:

# poudriere ports -u -p PORTSTREE

将更新给定的 PORTSTREE,由 poudriere -l 的输出给出的一个树,到官方服务器上最新的版本。

10.7.8。测试Ports

在设置了jails和ports树木之后,贡献者对ports树的修改结果可以得到测试。

例如,可测试/work/ports/www/firefox 目录中位于/www/firefox port 上的本地修改,这可以在先前创建的 13.1-RELEASE jail中进行测试。

# poudriere testport -j 131Ramd64 -p development -o www/firefox

这将构建 Firefox 的所有依赖项。如果某个依赖项以前已构建并且仍然是最新状态,则将安装预构建的软件包。如果某个依赖项没有最新软件包,将使用默认选项在jail中构建一个。然后构建 Firefox 本身。

每个port的完整构建都记录在/poudriere/data/logs/bulk/131Ri386-development/build-time/logs 中。

The directory name 131Ri386-development is derived from the arguments to -j and -p, respectively. For convenience, a symbolic link /poudriere/data/logs/bulk/131Ri386-development/latest is also maintained. The link points to the latest build-time directory. Also in this directory is an index.html for observing the build process with a web browser.

By default, poudriere cleans up the jails and leaves log files in the directories mentioned above. To ease investigation, jails can be kept running after the build by adding -i to testport:

# poudriere testport -j 131Ramd64 -p development -i -o www/firefox

After the build completes, and regardless of whether it was successful, a shell is provided within the jail. The shell is used to investigate further. poudriere can be told to leave the jail running after the build finishes with -I. poudriere will show the command to run when the jail is no longer needed. It is then possible to jexec(8) into it:

# poudriere testport -j 131Ramd64 -p development -I -o www/firefox
[...]
====>> Installing local Pkg repository to /usr/local/etc/pkg/repos
====>> Leaving jail 131Ramd64-development-n running, mounted at /poudriere/data/.m/131Ramd64-development/ref for interactive run testing
====>> To enter jail: jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
====>> To stop jail: poudriere jail -k -j 131Ramd64 -p development
# jexec 131Ramd64-development-n env -i TERM=$TERM /usr/bin/login -fp root
# [do some stuff in the jail]
# exit
# poudriere jail -k -j 131Ramd64 -p development
====>> Umounting file systems

FreeBSD ports 构建基础设施的一个重要部分是能够根据个人喜好调整 ports 的能力。这些可以使用 poudriere 进行测试。添加 -c :

# poudriere testport -c -o www/firefox

在构建 port 之前显示 port 配置对话框。在 -o 之后给出的格式 category/portname 将使用指定的选项,所有依赖项将使用默认选项。使用 sets 可以使用非默认选项来测试依赖 ports。

使用集合

对于涉及构建的所有操作,可以使用所谓的集合,使用 -z setname 指定。集合指的是完全独立的构建。例如,可以使用 testport 与依赖项ports的非标准选项。

要使用集合,poudriere 期望存在类似 PORT_DBDIR 的现有目录结构,默认为配置目录中的/var/db/ports。然后将此目录通过 nullfs(5)挂载到jails中,构建ports及其依赖项。通常,可以通过递归复制现有 PORT_DBDIR 到/usr/local/etc/poudriere.d/jailname-portname-setname-options 来获得合适的起点。这在 poudriere(8)中有详细描述。例如,测试特定集合 devset 中的 www/firefox,向 testport 命令添加 -z devset 参数:

# poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox

这将按照这个顺序查找这些目录的存在:

  • /usr/local/etc/poudriere.d/131Ramd64-development-devset-options

  • /usr/local/etc/poudriere.d/131Ramd64-devset-options

  • /usr/local/etc/poudriere.d/131Ramd64-development-options

  • /usr/local/etc/poudriere.d/devset-options

  • /usr/local/etc/poudriere.d/development-options

  • /usr/local/etc/poudriere.d/131Ramd64-options

  • /usr/local/etc/poudriere.d/options

从此列表中,poudriere 将第一个现有目录树 nullfs(5)-挂载到构建jails的/var/db/ports目录中。因此,在此运行 testport 期间,所有定制选项都将用于所有ports。

在提供一组的目录结构后,可以修改特定port的选项。例如:

# poudriere options -c www/firefox -z devset

显示了 www/firefox 的配置对话框,可以编辑选项。所选选项将保存到 devset 集。

10.7.10. Providing a Custom make.conf File

Similar to using sets, poudriere will also use a custom make.conf if it is provided. No special command line argument is necessary. Instead, poudriere looks for existing files matching a name scheme derived from the command line. For instance:

# poudriere testport -j 131Ramd64 -p development -z devset -o www/firefox

causes poudriere to check for the existence of these files in this order:

  • /usr/local/etc/poudriere.d/make.conf

  • /usr/local/etc/poudriere.d/devset-make.conf

  • /usr/local/etc/poudriere.d/development-make.conf

  • /usr/local/etc/poudriere.d/131Ramd64-make.conf

  • /usr/local/etc/poudriere.d/131Ramd64-development-make.conf

  • /usr/local/etc/poudriere.d/131Ramd64-devset-make.conf

  • /usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf

与集合不同,所有找到的文件将按顺序追加到一个 make.conf 文件中,构建jails内。因此,可以在/usr/local/etc/poudriere.d/make.conf 中设置通用 make 变量,以影响所有构建。特殊变量,仅影响特定jails或集合的文件可以在专门的 make.conf 文件中设置,例如/usr/local/etc/poudriere.d/131Ramd64-development-devset-make.conf。

示例 1。使用 make.conf 更改默认 Perl

要构建一个使用名为 perl5-20 的集合构建非默认 Perl 版本,例如 5.20 ,请创建一个名为 perl5-20-make.conf 的文件,并添加以下内容:

DEFAULT_VERSIONS+= perl=5.20

请注意 += 的使用,这样,如果默认 make.conf 中已经设置了该变量,其内容就不会被覆盖。

10.7.11. 剪枝不再需要的 Distfiles

poudriere 配备了一个内置机制,可删除不再被给定树的任何port使用的过时 distfiles。命令

# poudriere distclean -p portstree

将扫描 distfiles 文件夹,在 poudriere.conf 中 DISTFILES_CACHE ,与由 -p portstree 参数给出的ports树进行比对,并提示删除这些 distfiles。要跳过提示并无条件删除所有未使用的文件,可以添加 -y 参数:

# poudriere distclean -p portstree -y

最后更新于

FreeBSD 中文社区