包推广¶
包推广是推荐的 devops 实践,用于处理不同技术中包的质量、成熟度或阶段,当然也适用于 Conan 包。
包推广的原则是定义多个服务器包仓库,并根据阶段在仓库之间上传和复制包。例如,我们可以有两个不同的服务器包仓库,分别称为“testing”和“release”
注意
最佳实践
强烈建议不要使用不同的
user/channel
来表示成熟度。这在多年前 Conan 1 的早期就被描述过,当时还没有拥有多个仓库的可能性,但现在不应该再使用了。包在整个流水线和阶段中应该是完全不可变的,包不能重命名或更改其
user/channel
,并且从源代码重新构建它以获得新的user/channel
也是一种强烈不推荐的 devops 实践。
在这些仓库之间将存在一些质量门。在我们的例子中,一些包将被放入“testing”仓库,供 QA 团队测试,例如 zlib/1.3.1
和 openssl/3.2.2
当 QA 团队测试并批准这些包后,它们可以被推广到“release”仓库。基本上,推广是将包(包括所有构件和元数据)从“testing”仓库复制到“release”仓库。
实现和执行包推广有不同的方法。 Artifactory 具有一些 API,可以用于移动单个文件或文件夹。Conan extensions repository 包含 conan art:promote
命令,可用于将 Conan “包列表”从一个服务器仓库推广到另一个仓库。
如果我们有一个包列表 pkglist.json
,其中包含上述 zlib/1.3.1
和 openssl/3.2.2
包,那么该命令将如下所示
$ conan art:promote pkglist.json --from=testing --to=release --url=https://<url>/artifactory --user=<user> --password=<password>
请注意,conan art:promote
命令不适用于 ArtifactoryCE,需要 Artifactory Pro 版本。在这些情况下,可以使用简单的下载+上传流程来实现推广功能
# Promotion using Conan download/upload commands
# (slow, can be improved with art:promote custom command)
$ conan download --list=promote.json -r=testing --format=json > downloaded.json
$ conan upload --list=downloaded.json -r=release -c
从“testing”推广到“release”仓库后,包将如下所示
注意
最佳实践
在现代包服务器(如 Artifactory)中,包构件是去重的,也就是说,当它们被复制到不同的位置(包括不同的仓库)时,它们不会占用额外的存储空间。去重是基于校验和的,因此系统也很智能,可以避免重新上传现有构件。这对于“推广”机制非常重要:这种机制仅复制一些元数据,因此速度非常快且节省存储空间。流水线可以根据需要定义任意数量的仓库和推广,而无需担心存储成本。
推广也可以在 JFrog 平台上使用
Release Bundles
完成。Conan extensions repository 还包含一个用于生成发布包(可以使用 Artifactory API 进行推广)的命令。