使用 Conan 备份第三方源

对于开源、公开可用的库的配方和构建脚本,通常的做法是从规范源(如 GitHub 发布或项目下载网页)下载源代码。记录这些文件的来源对于可追溯性很有用,但是,这些文件长期可用性通常无法保证,未来用户从源代码构建相同配方时可能会遇到问题。因此,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:要跳过备份的源列表。如果传递给 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 签名,其中包含此二进制文件属于哪个引用和哪个镜像的信息。

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

注意

请参阅下文,了解如何配置自己的备份服务器的指南

设置必要的配置

如果需要从自定义备份源远程仓库下载,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 通用备份仓库,以及如何授予其公共读取权限,同时仅保留授权代理的写入权限。