使用 Conan 备份第三方源代码¶
对于开源、公开可用的库的配方和构建脚本,通常的做法是从规范源(如 Github 发布或项目下载网页)下载源代码。保留这些文件来源的记录有助于追溯性,但是,通常无法保证这些文件长期可用,并且将来构建相同配方源代码的用户可能会遇到问题。因此,可以将 Conan 配置为透明地从配置的镜像检索源代码,而无需修改配方或 conandata.yml。此外,这些源代码可以通过 conan upload 透明地与包一起上传。
源代码备份 功能旨在将下载的配方源代码存储在您自己的基础设施中的文件服务器中,即使原始下载 URL 无法访问,也能保证未来构建的可重复性。
当提供 sha256
文件签名时,将触发对 download 和 get 方法的调用以进行备份。
配置概述¶
此功能由几个 global.conf 项目控制
core.sources:download_cache
:存储源代码备份的本地路径。如果未设置,则将使用默认的 Conan 主目录缓存路径。core.sources:download_urls
:Conan 将尝试从中下载源代码的 URL 有序列表,其中origin
表示传递给get
/download
的原始 URL(来自 conandata.yml)。这允许控制获取顺序,例如["origin", "https://your.backup/remote/"]
仅在原始源不存在时才查看和获取您的备份远程,或["https://your.backup/remote/", "origin"]
在配方规范链接之前优先使用您的备份服务器。作为列表,多个远程也是可能的。默认情况下为["origin"]
core.sources:upload_url
:调用 conan upload 时要将备份上传到的远程的 URL,它可能与为下载定义的任何 URL 不同也可能相同。默认为空core.sources:exclude_urls
:要跳过备份的来源列表。如果传递给get
/download
的 URL 以此列表中包含的任何来源开头,则在调用 conan upload 时,源代码不会上传到备份远程。默认为空
用法¶
让我们概述一下该功能是如何工作的,并提供一个从头到尾的示例用法。
总而言之,它看起来像这样
设置远程备份仓库。这应该允许使用
PUT
和GET
HTTP 方法修改和获取其内容。如果需要访问凭据(强烈建议用于上传权限),则可以使用 source_credentials.json 功能。如果您需要配置自己的备份仓库,请参阅 下文。然后可以在
core.sources:download_urls
和core.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_urls=["https://myteam.myorg.com/artifactory/backup-sources/", "origin"]
您可能希望根据您的用例添加额外的配置,如 本文档开头所述。
注意
在您的组织中处理 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 免费获得),但任何允许使用 PUT
和 GET
HTTP 方法修改和获取其内容的简单服务器都足够。
阅读以下部分,了解如何创建 Artifactory 通用备份仓库以及如何授予其公共读取权限,同时仅为授权代理保留写入权限。