引言

在快节奏的软件开发世界中,可重复性和可追溯性正变得越来越重要。但是,当您所依赖的第三方源代码突然不可用时该怎么办?借助新的 Conan 源备份功能,您可以确保构建不仅可重复,而且能够抵御外部依赖关系的不确定性。

得益于此功能,您可以配置 Conan,以便当一个配方下载库的源代码时,它允许您从基础设施内的文件服务器获取源代码。这对开发人员来说是完全透明的,并且可以设置为仅在原始源代码的 URL 失败时用作最后的手段。

使用此功能的一些优势包括

  • 可重复性:确保构建的长期可重复性。
  • 可追溯性:记录已下载文件的来源。
  • 鲁棒性:将源代码存储在您自己的基础设施中,减少对第三方服务的依赖。
  • 速度提升:与从外部服务器获取相比,在内部托管源文件可以实现更快的下载速度。
  • 成本效益:将源代码放在同一网络中可以减少出站费用,从而节省网络成本。

在这篇文章中,我们将以我们在 Conan Center 的经验为例,向您展示如何充分利用源备份功能。这将让您清楚地了解如何在工作流程中无缝集成此功能,以提高可靠性和效率。

Conan 团队如何在 Conan Center 中使用此功能

此功能已在 Conan Center 等生产环境中使用了一段时间。Conan Center 托管着 6000 多个不同的引用,以及数千个不同的源代码来源。因此,它极易受到一些源代码来源可能不可用甚至消失的情况的影响。在这种情况下,它成为在 CI 服务器中内部使用 Conan 的源备份功能的理想生产环境。

在开发人员端使用此功能

要使用此功能,第一步是拥有一个文件服务器。在 Conan Center 中,我们使用一个通用的 Artifactory 存储库,它与我们的基础设施无缝衔接,但您可以使用任何其他支持 HTTP PUTGET 方法的文件服务器。首先要配置的是 Conan 客户端的 global.conf 文件中的服务器 URL

# global.conf
core.sources:download_urls=["origin", "https://url/for/my-backup-sources-download-server/"] 

如上图所示,可以提供不同文件服务器的列表,Conan 会在每次遇到对配方中的 get()download() 调用时参考该列表。为了指定原始源代码,我们使用保留字 origin。因此,此配置将首先尝试在原始服务器上查找源代码,如果失败,它将回退到我们的服务器(您可以按优先级顺序在配置中列出它们)。例如,在 Conan Center 中,我们使用此服务器:https://c3i.jfrog.io/artifactory/conan-center-backup-sources/。访问它后,我们可以查看有关不同源代码来源副本的信息

Configure Conan path

请记住,如果需要服务器凭据,则应使用 sources_credentials.json 配置文件进行配置。另一个关键点是,要激活此功能,必须定义 get()download() 方法中使用的文件的 sha256(如上图所示,包的源代码保存在以二进制哈希为名称的文件中,并附带一个元数据 .json 文件)。

有了以上解释,开发人员或持续集成系统将拥有足够的信息来利用此功能下载源代码。现在,我们将研究客户端上需要进行的配置,以便将这些源代码上传到服务器。

配置源代码上传

源代码上传通常由 CI 服务器执行。例如,在 Conan Center 中,源代码备份会在新版本 PR 通过所有检查(变为绿色)时上传。如果在 global.conf 文件中定义了以下配置,则此上传将在 conan upload 期间透明地执行。

# global.conf
core.sources:upload_url=https://url/for/my-backup-sources-upload-server 

需要注意的是,上传服务器可能与下载服务器不同。

此外,在某些情况下,可能需要从备份源代码上传中排除某些来源(想象一下,您不想让所有用户访问的代码)。在这种情况下,可以使用以下配置来跳过它们,如果调用了此配置,则将跳过配置中列出的任何以这些 URL 开头的 URL

# global.conf
core.sources:exclude_urls=["https://url/mycompanystorage/", "https://url/mycompanystorage2/"] 

要进一步探索备份源代码功能,您可以查看 Conan 文档

结论

Conan 的源备份功能是一个强大的工具,可以确保构建的长期可重复性和可追溯性。通过采取几个简单的步骤来配置此功能,您可以保护您的项目免受依赖第三方源代码存储库所带来的不确定性。