CI 和生产环境中的 Conan 新特性
随着 Conan 2 的不断发展,我们很高兴地宣布最近发布了Conan 2.0.14。此更新引入了旨在提高生产环境中生产力和效率的新特性。在这篇文章中,我们将重点介绍两个最近添加的功能:缓存保存/恢复和 LRU(最近最少使用)清理。
从缓存保存和恢复包
此功能旨在用于临时包移动,提供了一种在不同 Conan 缓存之间高效传输包的方法。它非常适合以下场景
-
CI 管道:它有助于在不同的作业之间共享中间构建阶段或依赖项。对于并行作业尤其有用,因为 Conan 缓存不是并发的。
-
隔离环境:在限制直接互联网访问且必须通过客户端传输包的情况下很有用。
需要注意的是,保存和恢复包是一种短期机制,并非用于长期存储或作为备份策略。存储格式和序列化虽然在同一 Conan 版本中有效,但可能不稳定或与将来的 Conan 版本不兼容。对于 Conan 包的长期备份,建议使用服务器端备份策略。
工作原理
例如,假设我们在 CI 中为三个不同的平台构建应用程序。CI 中的主要作业将在不同的代理上触发三个不同的构建。
每次构建后,您可以使用 conan cache save
命令将缓存中选择的包保存到每个平台的 tgz
文件中。作为命令的参数,您可以传递引用模式(如 conan list 命令中)或 包列表 json 文件。让我们保存 Conan 缓存中所有包的最新版本
# save the last revision of all packages in the cache
$ conan cache save "*/*:*" --file=conan_cache_save_linux.tgz
Saving app/2.71: p/autoc5f0e65aa481c3
Saving app/2.71:da39a3ee5e6b4b0d3255bfef95601890afd80709: p/autocf3e6879dde7f6/p
Saving bzip2/1.0.8: p/bzip2b261b4dea28b4
Saving bzip2/1.0.8:e3dc948df7773c2c60edf3a72557250108721b20: p/bzip23cfe2c0da64ba/p
Saving cmake/3.27.7: p/cmake9a3eb5e13dc53
Saving cpp-httplib/0.11.3: p/cpp-hd3892a337ccc3
Saving eigen/3.4.0: p/eigenecaf3dc594b0c
...
# creates conan_cache_save_linux.tgz
保存的 .tgz
文件包含配方文件夹、包元数据和其他基本内容,但不包括“build”或“download”等临时文件夹。您为每个并行作业保存包,并在每个作业结束时将它们存储起来,以便稍后在主作业中恢复,您可以在其中使用 conan cache restore
将所有保存的包恢复到 Conan 缓存中。
$ conan cache restore conan_cache_save.tgz
Restore: app/2.71 in p/autoc5f0e65aa481c3
Restore: app/2.71:da39a3ee5e6b4b0d3255bfef95601890afd80709 in p/autocf3e6879dde7f6/p
Restore: bzip2/1.0.8 in p/bzip2b261b4dea28b4
Restore: bzip2/1.0.8:e3dc948df7773c2c60edf3a72557250108721b20 in p/bzip23cfe2c0da64ba/p
Restore: cmake/3.27.7 in p/cmake9a3eb5e13dc53
Restore: cpp-httplib/0.11.3 in p/cpp-hd3892a337ccc3
Restore: eigen/3.4.0 in p/eigenecaf3dc594b0c
...
有关如何使用此功能的更多详细信息,请参阅 Conan 文档。
LRU:从缓存中删除未使用的包
Conan 现在支持 LRU(最近最少使用)策略来有效管理缓存大小。此功能对于维护优化的包缓存非常重要,因为 Conan 缓存未实现任何自动过期策略,因此除非删除包或定期清除缓存,否则其大小将始终增加。
工作原理
LRU 功能的使用是通过 conan remove
和 conan list
命令的 --lru
参数实现的。您可以使用它来删除旧的包二进制文件或删除配方及其关联的二进制文件。LRU 时间遵循 remove
命令的规则。如果我们使用“*”模式删除配方,则只会检查配方的 LRU 时间。如果配方最近使用过,它将保留所有二进制文件,如果配方未最近使用,它将删除自身及其所有二进制文件。
例如,如果我们想删除过去两个月内未使用过的所有二进制文件(但不是配方),我们将执行以下操作
$ conan remove "*:*" --lru=2M -c
还要删除所有配方(及其关联的二进制文件)
$ conan remove "*" --lru=2M -c
您还可以使用 conan list
命令使用 LRU 参数生成最近最少使用的包列表,然后将生成的包列表传递给 conan remove
命令。删除过去两个月内未使用过的所有配方和包的等效方法是
# List all unused (last 2 months) recipe revisions
$ conan list "*#*" --lru=2M --format=json > old.json
# Remove those recipe revisions (and their binaries)
$ conan remove --list=old.json -c
结论
在 Conan 中添加缓存保存/恢复和 LRU 清理功能显着提高了效率,尤其是在 CI 环境中,并将有助于在生产中维持最佳性能。
有关更多详细信息和示例,请访问我们的 DevOps 指南 和 其他功能教程。
我们热切地希望听到您对这些新功能的意见和建议。请随时在 GitHub 问题 上分享您的经验和想法。