使用 Conan 备份第三方源码¶
对于开源、公开可用的库的 recipes 和构建脚本,通常的做法是从规范来源下载源码,例如 Github 发布版本或项目下载网页。 记录这些文件的来源对于可追溯性目的非常有用,但是,通常无法保证这些文件可以长期可用,并且将来从源码构建相同 recipe 的用户可能会遇到问题。 因此,Conan 可以配置为从配置的镜像透明地检索源码,而无需修改 recipes 或 conandata.yml。 此外,这些源码可以通过 conan upload 与包一起透明地上传。
源码备份功能旨在将下载的 recipe 源码存储在您自己的基础架构中的文件服务器中,即使原始下载 URL 不再可用,也可以实现将来构建的可重现性。
当提供 sha256
文件签名时,对 download 和 get 方法的调用会触发备份。
配置概览¶
此功能由一些 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"]
优先使用您的备份服务器而不是 recipes 的规范链接。 作为一个列表,也可以使用多个远程服务器。默认值为["origin"]
core.sources:upload_url
:调用 conan upload 时将备份上传到的远程服务器的 URL,该 URL 可能与为下载定义的任何 URL 不同。 默认值为空core.sources:exclude_urls
:要跳过备份的 origins 列表。 如果传递给get
/download
的 URL 以此列表中包含的任何 origin 开头,则在调用 conan upload 时,该源将不会上传到备份远程服务器。 默认值为空
用法¶
让我们通过提供一个从头到尾的示例用法来概述该功能的工作方式
总而言之,它看起来像
设置远程备份存储库。 这应该允许
PUT
和GET
HTTP 方法修改和获取其内容。 如果需要访问凭据(强烈建议用于上传权限),您可以使用 source_credentials.json 功能。 如果您需要配置自己的存储库,请参见下文。然后可以在
core.sources:download_urls
和core.sources:upload_url
中设置远程服务器的 URL。在 recipe 的
source()
方法中,确保相关的get
/download
调用提供下载文件的sha256
签名。如果在 global.conf 文件中需要自定义位置,请设置
core.sources:download_cache
,否则将使用默认的缓存文件夹正常运行 Conan,创建包等。
- 一旦在本地下载了一些源码,
core.sources:download_cache
指向的文件夹将包含每个下载的文件 一个 blob 文件(无扩展名),其名称为
get
/download
中提供的sha256
签名。一个
.json
文件,其名称也将是sha256
签名,其中包含有关此 blob 属于哪些引用和哪些镜像的信息。
- 一旦在本地下载了一些源码,
如果设置了
core.sources:upload_url
,则调用conan upload
现在可以选择性地上传匹配引用的备份。
注意
有关如何配置自己的备份服务器的指南,请参见下文
设置必要的配置¶
如果希望从自定义备份源远程服务器下载,则 global.conf 文件应包含 core.sources:download_urls
,如果希望自定义本地缓存路径以下载备份,则应包含 core.sources:download_cache
。
core.sources:download_urls=["https://myteam.myorg.com/artifactory/backup-sources/", "origin"]
core.sources:download_cache=/path/to/backup/sources
注意
应定义 core.sources:download_urls
或 core.sources:download_cache
才能启用该功能。
您可能希望根据您的用例添加额外的配置,如本文档开头所述。
注意
处理组织中 CI worker 和开发人员的配置的推荐方法是使用存储库上的 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 存储库时,如果配置为这样做,它还将为同一引用将源码备份上传到您的备份远程服务器,并且此 recipe 的未来源码下载将在必要时使用新更新的内容。
注意
有关仅上传已构建的包的方法,请参阅包列表功能
如果需要上传未链接到任何包的源的备份,或者上传已经位于远程存储库中,因此在上传过程中会被跳过的包的备份,则可以使用 conan cache backup-upload 命令来解决这种情况。
创建备份仓库¶
您也可以设置自己的远程备份仓库,而不是依赖于现成的仓库。 虽然建议为此目的使用 Artifactory 通用仓库(Artifactory CE 免费提供),但任何允许使用 PUT
和 GET
HTTP 方法来修改和获取其内容的简单服务器就足够了。
请阅读以下部分,了解如何创建通用的 Artifactory 备份仓库,以及如何赋予它公共读取权限,同时仅为授权代理保留写入权限。