SourceUrls
简而言之:Source 中的 URL 更接近于验证 open Build Service 和 openSUSE Factory 中用于构建的来源的真实性,使用自动验证方法。GPG 签名验证是下一步可能的步骤。如果希望重新压缩 tarball,可以使用更复杂的验证机制。
虽然我们不能强制一直使用 URL,但只要有合适的来源 URL,就必须在Source和Patch标签中 .spec 文件。
概述
该Source和Patch文件中的标签可以包含本地文件名,也可以包含完整的 URL。但是,rpmbuild 不会自动下载文件;而是假设存在与 Source 路径的最后一个组件相同的本地文件名。
自动完整性检查
指定上游位置允许在 openSUSE 项目的软件包处理中引入更多的自动化和特别是验证。
具有 GPG PKI 签名的归档文件已经可以通过 gpg-offline(自 openSUSE 12.3 起实施)进行验证,并且也由 openSUSE Factory 的 source_validator 服务在 2013 年年中开始验证。在没有提供签名的情况下,我们至少希望进行基本的检查(例如,查看 SHA 校验和)以与上游进行比较,从而报告上游或 openSUSE 侧潜在的安全漏洞。
何时使用它们
简短的答案是:如果可用,始终使用
可以对以下情况进行例外:
- 由 obs_scm/tar_scm 或类似服务生成的 tarball
- 不存在的下载主机,例如项目主机已关闭。在这种情况下,我们应该/能够引用其他发行版的文件归档吗?无论如何,我们都希望将旧的下载 URL 作为注释保留下来。
- 上游修改 tarball。这应该在上游进行澄清并在 spec 文件中记录。我们不是唯一进行来源验证的发行版。
- 如果从其他地方找到的补丁需要适应我们的代码版本,则应在我们的 补丁指南中的补丁注释中提供 URL。
半自动更新
要使用来源 URL 进行更新,您只需要增加版本号,删除旧的 tarball,然后运行 osc service localrun、osc addremove、osc vc 和 osc ci,您就几乎完成了。
重新压缩的问题
openSUSE Factory 开发非常强烈建议使用上游提供的 tarball,不进行修改,以便允许自动验证机制并提高打包效率。
某些软件包是从 SCM 快照而不是发布的 tarball 构建的,因此可能没有可下载的归档文件的通用 HTTP URI(尽管某些 Web 前端确实提供 tarball/zip 下载)。还有一些维护者希望使用更好的算法重新压缩 {压缩算法较差的 tarball} 以节省空间,尽管在快速互联网时代,大小差异通常不是问题。重新压缩方法使 tarball 验证变得困难甚至不可能。
由于许多发布的文件使用与实际文件容器独立且应用于其之上的流压缩,例如 .tar.gz、.tar.bz2 等,因此验证器仍然可以通过查看未压缩对象的校验和来检查归档文件的真实性。这仍然允许标记维护者以错误的方式重新压缩归档文件,方法是重新创建基础 tar 归档文件,而无需惩罚仅仅更改了叠加压缩的维护者。
- 错误:
tar -x foo.tar.bz2; tar -cJf foo.tar.xz foo/; - 更好:
bzip2 -d foo.tar.bz2; xz foo.tar;
事实上,如果您是某些软件的上游维护者,并使用密钥对您的归档文件进行签名,请考虑对 .tar 归档文件(生成 .tar.sign/.tar.asc)而不是特定的压缩变体(如 Linux 内核项目已经做的那样)进行签名。这使得无论选择何种压缩算法,都可以验证归档文件的真实性。
原始归档文件的 URL 可以很容易地通过 .spec 文件中的额外行提供,事实上,这已经在一些软件包中使用,其中存在 #DL-URL: 行。可以考虑存储原始 URI 的替代方法;这取决于最终解决方案的实施者。因此,没有理由要求在 Source 标签中包含 URL。
将所有这些整合在一起的一种潜在方法是通过 Source Services;一个_service文件,例如
<services>
<service name="download_url" mode="localonly">
<param name="protocol">ftp</param>
<param name="host">ftp.gap-system.org</param>
<param name="path">/pub/gap/gap4/tar.bz2/packages/Alnuth-3.0.0.tar.bz2</param>
</service>
<service name="recompress" mode="localonly">
<param name="file">*.tar</param>
<param name="compression">none</param>
</service>
<service name="verify_file" mode="localonly">
<param name="file">_service:recompress:Alnuth-3.0.0.tar</param>
<param name="verifier">sha256</param>
<param name="checksum">7203be33535135af16ba1a1479b057ec5fe4048c628d6d9bd2926824a017b477</param>
</service>
<service name="recompress" mode="localonly">
<param name="file">*.tar</param>
<param name="compression">xz</param>
</service>
</services>
将执行此操作。但是,这里的缺点是这将导致 osc 每次有人尝试构建时都下载文件,从而增加构建时间,给源服务器(及其账单,如果适用)带来额外的负载。此外,Factory 不允许此类服务,因此不允许服务器端运行,需要 mode="buildtime"、mode="localonly" 或 mode="disabled",从而使验证变得毫无意义。
因此,需要更多的计划。