使用 Conan 进行第三方源备份

对于开源、公开可用库的配方和构建脚本,通常的做法是从权威来源下载源代码,例如 Github Releases 或项目下载网页。保留这些文件的来源记录有助于追溯,但是,文件不一定能长期可用,未来从源构建相同配方的用户可能会遇到问题。因此,Conan 可以配置为透明地从配置的镜像检索源,而无需修改配方或 conandata.yml。此外,这些源可以通过 conan upload 命令与包一起透明上传。

源备份功能旨在将下载的配方源存储在您自己的基础设施中的文件服务器上,即使原始下载 URL 不再可用,也能实现未来的构建可复现性。

当使用 sha256 文件签名调用 downloadget 方法时,会触发备份。

配置概述

此功能由几个 global.conf 项目控制

  • core.sources:download_cache:存储源备份的本地路径。如果未设置,将使用默认的 Conan 主缓存路径。

  • core.sources:download_urls:Conan 将尝试从中下载源的 URL 顺序列表,其中 origin 表示从 conandata.yml 传递给 get/download 的原始 URL。这允许控制获取顺序,可以是 ["origin", "https://your.backup/remote/"],仅当原始源不存在时才查找并从您的备份远程获取,或者 ["https://your.backup/remote/", "origin"],优先从您的备份服务器获取,而不是配方的规范链接。作为一个列表,也可以是多个远程。默认情况下为 ["origin"]

  • core.sources:upload_url:调用 conan upload 时用于上传备份的远程 URL,该 URL 可能与为下载定义的任何 URL 不同,也可能相同。默认为空

  • core.sources:exclude_urls:要跳过备份的源 URL 列表。如果传递给 get/download 的 URL 以此列表中的任何源开头,则在调用 conan upload 时,源将不会上传到备份远程。默认为空

用法

让我们通过一个从头到尾的示例来概述该功能的工作原理

总而言之,它看起来像这样

  • 设置一个远程备份仓库。这应该允许 PUTGET HTTP 方法来修改和获取其内容。如果需要访问凭据(强烈建议用于上传权限),您可以使用 source_credentials.json 功能。如果您需要配置自己的备份服务器,请参见下方

  • 然后可以在 core.sources:download_urlscore.sources:upload_url 中设置远程 URL。

  • 在您配方的 source() 方法中,确保相关的 get/download 调用提供了下载文件的 sha256 签名。

  • 如果需要自定义本地缓存路径来下载备份,请在您的 global.conf 文件中设置 core.sources:download_cache,否则将使用默认缓存文件夹。

  • 像往常一样运行 Conan,创建包等。

  • 一旦一些源被本地下载,由 core.sources:download_cache 指向的文件夹将包含每个下载文件的内容:
    • 一个 blob 文件(无扩展名),其名称是 get/download 中提供的 sha256 签名。

    • 一个 .json 文件,其名称也与 sha256 签名相同,其中将包含有关此 blob 属于哪些引用和哪些镜像的信息。

  • 调用 conan upload 现在将可选地上传匹配引用的备份,如果设置了 core.sources:upload_url

注意

有关如何配置自己的备份服务器的指南,请参见下方

设置必要的配置

如果您希望从自定义备份源远程下载,global.conf 文件应包含 core.sources:download_urls,如果您希望自定义本地缓存路径来下载备份,则应包含 core.sources:download_cache

global.conf
core.sources:download_urls=["https://myteam.myorg.com/artifactory/backup-sources/", "origin"]
core.sources:download_cache=/path/to/backup/sources

注意

为了启用该功能,应定义 core.sources:download_urlscore.sources:download_cache 中的一个。

您可能需要根据您的用例添加额外的配置,如本文档开头所述。

注意

建议在组织中配置 CI 工作人员和开发人员的方法是使用存储库中的 conan config install 命令来安装配置。在此处阅读更多

像往常一样运行 Conan

完成上述步骤后,Conan 就可以像往常一样使用,并且对于每个下载的源,Conan 将首先查找 core.sources:download_cache 中指定的文件夹,如果找不到,将遍历 core.sources:download_urls,直到找到文件或失败,并将本地副本存储在同一个 core.sources:download_cache 位置。

当从备份远程获取备份时,用户将看到类似以下的消息

客户端现在将打印有关它能够从哪个远程下载源的信息
$ conan create . --version=1.3

...

======== Installing packages ========
zlib/1.3: Calling source() in /Users/ruben/.conan2/p/zlib0f4e45286ecd1/s/src
zlib/1.3: Sources for ['https://zlib.net/fossils/zlib-1.3.tar.gz', 'https://github.com/madler/zlib/releases/download/v1.3/zlib-1.3.tar.gz']
          found in remote backup https://myteam.myorg.com/artifactory/backup-sources

-------- Installing package zlib/1.3 (1 of 1) --------

...

如果我们现在再次尝试运行此命令,我们将发现没有执行下载,而是使用了文件的本地存储版本。

上传包

如上所示创建了包后,当调用 conan upload zlib/1.3 -c 命令将生成的二进制文件上传到您的 Conan 存储库时,它还将把该引用的源备份上传到您的备份远程(如果已配置),并且将来对该配方的源下载将在必要时使用新更新的内容。

注意

有关仅上传已构建的包的方法,请参阅包列表功能

如果需要上传与任何包无关的源的备份,或者上传已在远程且在常规上传中将被跳过的包的备份,可以使用 conan cache backup-upload 命令来解决此场景。

创建备份仓库

您也可以设置自己的远程备份仓库,而不是依赖于已有的仓库。虽然建议为此目的使用 Artifactory 通用仓库(Artifactory CE 提供免费版本),但任何允许 PUTGET HTTP 方法来修改和获取其内容的简单服务器就足够了。

请阅读以下部分,了解如何创建通用 Artifactory 备份仓库以及如何为其设置公共读取权限,同时仅允许授权代理写入访问。