GLEP 65:安装后质量保证检查

作者 Michał Górny <mgorny@gentoo.org>
类型 标准跟踪
状态 最终
版本 2
创建日期 2014-10-26
最后修改日期 2019-02-23
发布历史 2014-10-30, 2017-10-17
GLEP 源代码 glep-0065.rst

状态

此 GLEP 已于 2017 年 11 月 12 日理事会会议上获得批准。实施已完成,因此标记为最终版本。

摘要

此 GLEP 提供两种质量保证检查:一次在安装映像上运行的检查src_install返回后,以及在pkg_postinst返回后在活动系统上运行的检查。软件包管理器、存储库、软件包(系统范围安装)和系统管理员可以提供这些检查。质量保证检查可以检查安装映像或活动系统,输出和存储面向用户和机器的质量保证警告日志,操作文件并中止安装。

动机

当前的 Portage 版本有两种主要的质量保证检查机制:repoman 和安装后质量保证检查。虽然 repoman 通常被认为更重要,但它存在严重的限制。特别是,它在存储库上运行而不执行 ebuild,因此无法检查已安装的文件。这就是安装后质量保证检查变得有用的地方。

随着时间的推移,许多不同的质量保证检查已添加到 Portage 中。其中包括对应于通用 Gentoo 规则(如文件系统层次结构、安全要求)的检查,执行 Gentoo 团队策略的检查以及执行正确 eclass 使用的检查。某些检查依赖于外部工具的存在。

将这些检查直接保存在 Portage 源代码中具有两个主要缺点

  1. 如果不升级 Portage,则无法正确更新这些检查。特别是,质量保证检查的更改在相关 Portage 版本变得稳定且用户升级时才会完全生效。没有简单的方法可以使质量保证检查与 eclass 保持同步。
  2. 所有存储库和派生发行版都强制执行 Gentoo 特定的检查。修改质量保证检查列表需要派生 Portage。

规范

质量保证检查类型

此规范中定义了两种质量保证检查

  1. 安装后质量保证检查(install-qa-check.d),
  2. 合并后质量保证检查(postinst-qa-check.d).

安装后质量保证检查在src_installebuild 阶段完成后但在构建二进制软件包或执行pkg_preinst阶段之前执行。它们可以使用与在src_install中允许的相同的命令,并访问安装映像${D}和临时目录${T}.

如果出现严重的质量保证问题,则允许这些检查更改安装映像的内容以对其进行清理,或调用die函数以中止构建。

合并后质量保证检查在pkg_postinstebuild 阶段完成后执行。它们可以使用与在pkg_postinst中允许的相同的命令,并访问已安装的系统位置${ROOT}和临时目录${T}.

允许这些检查更改文件系统内容的程度与pkg_postinst阶段相同。它们不得调用die.

质量保证检查文件格式和位置

质量保证检查存储为 bash 脚本。检查通过文件名识别和排序。如果在多个位置存在具有相同名称的文件,则使用优先级最高的位置中的文件。

规范定义了四个质量保证检查来源,按优先级递增的顺序列出

  1. 包含在软件包管理器中的内部检查,
  2. 特定于存储库的质量保证检查,
  3. 软件包安装的质量保证检查,
  4. 系统管理员定义的质量保证检查。

内部检查存储在特定于软件包管理器的地址中,应与软件包管理器一起安装。建议仅在软件包管理器中包含通用检查,而不是特定于 Gentoo 策略、软件包或包含在 Gentoo 中的 eclass 的检查。

特定于存储库的质量保证检查包含在metadata/install-qa-check.dmetadata/postinst-qa-check.d存储库的目录中。对于相关的 ebuild,会遍历包含它的存储库及其主存储库以查找质量保证检查,并且优先级随着每个继承级别的增加而降低。

软件包安装的质量保证检查位于/usr/lib/install-qa-check.d/usr/lib/postinst-qa-check.d中,旨在由软件包安装。系统管理员定义的质量保证检查位于/usr/local/lib/install-qa-check.d/usr/local/lib/postinst-qa-check.d.

质量保证检查脚本格式

质量保证检查由软件包管理器作为 bash 脚本源代码。质量保证脚本在隔离的子 shell 中运行,因此可以安全地更改环境和更改工作目录。质量保证脚本必须始终以一个以成功退出代码结束的命令结尾。

除了标准 PMS 函数外,还提供了两个附加命令

  1. eqawarn将质量保证警告输出给用户,
  2. eqatag存储有关质量保证问题的机器可读信息。

允许存储库定义的质量保证检查继承提供检查的存储库或其任何主存储库中的 eclass。与特定存储库中的 ebuild 适用的相同继承规则。源代码 eclass 不会影响最终的 ebuild 元数据或阶段函数。

功能规范

eqawarn

概要
eqawarn <message>...

如果启用了质量保证警告输出,则将指定的消息输出给用户作为质量保证警告。消息可以包含转义序列,并且将根据echo -ebash 内置命令的规则进行解释。

启用质量保证警告输出的机制和特定的输出工具由软件包管理器定义。

eqatag

概要
eqatag [-v] <tag> [<key>=<value>...] [<file>...]

使用特定质量保证问题标记软件包。tag 参数是识别特定质量保证问题的已定义名称。该标记还可以附加一些键值形式的数据和/或一个或多个文件。文件路径相对于安装根目录(${D}在安装后检查中或${ROOT}在合并后检查中),并且需要以斜杠开头。

如果-v(详细)参数传递,则该函数还将使用eqawarn输出换行符分隔的文件列表。这旨在作为存储机器可读和输出用户可读质量保证警告的简写。

用于存储标记的机制由软件包管理器定义。标记名称由特定的质量保证检查定义。但是,建议以分层方式命名标记,使用点连接单词.,并且第一个单词与质量保证检查文件名匹配。例如,60bash-completion检查使用的标记将命名为bash-completion.missing-aliasbash-completion.deprecated-have.

基本原理

质量保证检查类型

创建这两种质量保证检查是为了解决 ebuild 中的不同类型的常见错误。

安装后质量保证检查可用于在将安装映像合并到活动系统或发布为二进制软件包之前验证安装映像。它们可以解决由 ebuild 代码引起的不同问题,直至并包括src_install,作为这些阶段的任何一部分执行的上游代码以及提供的文件。

合并后质量保证检查可用于在合并软件包及其pkg_postinst阶段执行后验证系统状态。它们主要旨在检测缺少的 postinst 操作,但可以执行其他活动系统完整性检查。

质量保证检查文件格式和位置

质量保证检查的多个位置旨在为各种需求提供最佳覆盖范围。

与软件包管理器一起安装的检查旨在涵盖通用情况以及依赖于软件包管理器内部的其他检查。与其他类别的质量保证检查不同,这些检查仅适用于单个软件包管理器,因此可以使用内部 API。但是,建议谨慎使用此类别。

将检查存储在存储库中允许开发人员将其严格绑定到特定版本的发布版并与相关的策略和/或 eclass 一起更新。特别是,Gentoo 策略和 eclass 强制的规则不必适用于使用 Portage 的其他发布版。

质量保证检查也应用于子存储库(通过masters属性)以及 eclass。这确保了大多数存储库不会丢失质量保证检查。与 eclass 相关的质量保证检查以与 eclass 相同的方式继承。与 eclass 类似,子存储库可以覆盖(或禁用)质量保证检查。

系统范围的质量保证检查提供了与软件包一起安装质量保证检查的机会。过去,一些质量保证检查仅根据外部检查器软件的存在而有条件地运行。相反,软件包可以直接安装自己的质量保证检查。

通过/usr/local进行的管理覆盖是系统范围质量保证检查的自然扩展。此外,系统管理员可以使用它来覆盖或禁用几乎任何其他质量保证检查,无论是内部 Portage 还是存储库范围的检查。

共享 QA 检查还有一个额外的好处,即所有包管理器可以使用统一的 QA 工具。

质量保证检查脚本格式

使用 bash 的目的是与 ebuild 格式相匹配。函数的选择旨在实现包管理器之间的可移植性。

脚本在隔离的子 shell 中运行,以简化检查并降低意外跨脚本问题风险。

由于 bash 的限制,脚本需要以成功的命令作为结果结束。

source foo || die "source failed"

调用要么返回脚本中最后一个命令的退出代码,要么在源代码错误的情况下返回不成功的退出代码。为了区分两者,我们需要保证脚本始终成功返回。

额外的eqawarnlog 函数旨在为用户提供重要的用户定向警告和面向开发人员的 QA 问题之间的区别。该eqatag函数旨在以机器可读的格式存储检查结果,以便进一步处理。

继承 eclass 可以重用代码并提高可维护性。这种可能性主要用于 eclass 特定的检查,这些检查可能希望例如从 eclass 获取搜索路径。

继承仅在特定于存储库的位置允许,因为这是可以假定 eclass 可用性的唯一位置。对于系统范围的检查,我们不能假设在处理相关 ebuild 时源存储库可用。

功能规范

eqawarn

在撰写本文时,此函数已被认为定义良好。它受 Portage 支持,并在eutils.eclass中进行了存根。因此,规范旨在在当前实现和 PMS 对ewarn函数的定义之间实现最佳匹配。后者特别涉及使输出和输出控制机制由 PM 定义。

eqatag

定义此函数是为了允许外部工具轻松解析 QA 检查的结果,特别是 tinderbox。名称eqatag暗示了使用 QA 标签“标记”文件的过程。

最初的提案使用了名称eqalog,但由于可能与面向用户的elog函数混淆而被拒绝。

标签可以与文件和抽象数据相关联,以适应最广泛的检查范围。附加数据以键值对形式提供,以便轻松扩展或更改格式。文件路径格式旨在与规范的/usr/bin/foo路径相匹配。

开头斜线的需求允许函数安全地区分键值数据(假设键名不能以斜线开头)和文件。

-v参数作为一种简写,用于预期常见的

eqawarn "The following files are frobnicated incorrectly:"
eqawarn
eqatag -v frobnicate "${files[@]}"
eqawarn
eqawarn "Please consult http://example.com/frobnicate for more details."

做法,其输出为

* The following files are frobnicated incorrectly:
*
*   /usr/bin/frobnicatee
*   /usr/bin/other-frobnicatee
*
* Please consult http://example.com/frobnicate for more details.

存储结果的机制留给实现定义,因为构建运行方法及其位置在包管理器之间有所不同。最初的提案在${T}/qa.log.

向后兼容性

中使用了定义良好的格式。

过去版本的包管理器只会使用它们自己的内置检查,并且不会受到规范的影响。

兼容版本的包管理器会将内置检查拆分为多个文件。当特定检查被移动到存储库时,将保留名称,以便存储库副本将覆盖内置检查,并且不会发生重复检查。

参考实现

在未来版本的包管理器中,将删除传输的检查。但是,由于它们将支持此 GLEP,因此无论如何都将从存储库中使用相关的检查。install-qa-check.d的参考实现从 2.2.15 版(2014-12-04 发布)开始在 Portage 中可用。对postinst-qa-check.d的支持在 2.3.9 版(2017-09-19 发布)中添加。