2026 远程 Mac CI:Conan 2 镜像、并行下载与 conan.lock 验收矩阵 | MacPull独立可用的 Meta 描述:
center2 与企业制品端点取舍,core.download:parallel 与 HTTP 超时;CONAN_HOME、ccache 与磁盘水位;lockfile 生成、graph info 与 git diff 闸口。可复制的 conan remote/install 命令。
场景前提
以下约定让镜像切换、缓存键与 lockfile在同一语义下比较:Conan 2.x CLI;同一仓库已提供 conanfile.py 或 conanfile.txt;CI 与本地使用同一组 profile(AppleClang 版本、arch、build_type)。每台 Runner 为 Job 分配独占目录承载 CONAN_HOME,避免并发构建互相污染下载缓存与 metadata。若团队同时保留 vcpkg 路径,请把两套「版本面」在 Runbook 中显式分列指标,避免将网络问题误判为 recipe 漂移。
镜像端点对比表
Conan 2 默认对接 Conan Center v2 索引;企业常映射到 JFrog Artifactory 等,仅URL 与凭据变化时,recipe revision 应对齐,否则会出现「同一依赖、不同解析」。下表用于快速选型(具体域名请替换为你们环境)。
| 端点类型 | 典型 URL 模式 | 适用 | 注意 |
|---|---|---|---|
| Conan Center 2(官方) | https://center2.conan.io |
公网直连、依赖公开 | 跨境抖动时需配合超时、限并发与退避 |
| 企业 Conan 仓库 | …/api/conan/<repo> |
内网高带宽、合规审计 | 索引同步滞后时要核对与 center 的 revision 是否一致 |
| 只读副本 / 边缘缓存 | 地理上靠近 Runner 的只读 remote | 多地域 Runner 降 RTT | 副本与主仓不一致时优先清空本 Job 的 metadata再解析 |
remote 验收命令骨架(在设置好 CONAN_HOME 之后执行):
并发与超时阈值
core.download:parallel控制「同时进行多少个包下载任务」。在千兆以内网或稳定出口,可起点为CPU 物理核数或一半;若日志中频繁出现超时、TLS 握手失败或网关 429,应先减半 parallel,再拉长 HTTP 超时,而不是无限重试同一并发。
参数清单(写入 global.conf 的键名一致,可用 conan config show 核对):
| 配置项 | 建议起点 | 调大/调小信号 |
|---|---|---|
core.download:parallel |
4–16(视核数与带宽) | 失败簇集、429 → 降;带宽闲置且错误率低 → 升 |
core.net.http:timeout |
120–300 秒 | 大 tarball 或跨境高 RTT → 升;尽早失败策略 → 降并配合退避 |
远程 Mac CI 缓存目录与磁盘水位
将 CONAN_HOME 指到流水线可挂载路径,使「二进制包 + 数据库」可随 Job 复用或随策略清理。编译器层面缓存推荐 ccache:把 CC/CXX 前加 ccache,并把 CCACHE_DIR 指到独占目录,与 Conan 缓存分列配额。构建前用 df -h 与团队约定的最小剩余空间(例如系统盘保留 ≥12 GiB)做闸口,避免半写入导致 metadata 损坏。
失败重试与一致性检查
外层脚本建议采用 2 / 4 / 8 秒阶梯退避包裹 conan install,并限制最大重试次数以免占满队列时间。lockfile应在受控分支生成:本地或专用 Job 执行 conan lock create,将 conan.lock 入库;CI 一律 --lockfile=conan.lock 安装,禁止静默升级依赖面。验收时并列运行 图信息与哈希闸口:确认解析图与锁一致,且工作区无意外改动。
| 症状 | 优先动作 |
|---|---|
| 仅镜像 URL 变更、大量包 ID 变了 | 核对 profile 与 compiler;对比两侧 conan list 与 recipe revision |
| 下载失败集中在同类 HTTP 错误 | 降 parallel、升 timeout;检查企业代理与 TLS 证书链 |
| 同一提交在不同 Job 解析结果不同 | 强制 lockfile;清理由其他 Job 写入的共享 CONAN_HOME |
| 磁盘占用陡增 | 评估 conan cache clean 策略与 Job 级隔离目录 |
FAQ
为什么 CI 必须带 --lockfile?
无锁安装会在不同时间点解析到不同的依赖版本组合,问题难复现。锁文件把「依赖图」钉死,PR 只做「是否意外改锁」的显式审查。
conan remote login 在无人值守 Runner 上怎么做?
用环境变量或密钥管理注入 token/密码,避免交互;受限网络下确认出站白名单包含制品域名与 HTTPS,必要时在镜像侧配置只读拉取权限。
Conan 缓存与 ccache 会不会重复占盘?
二者优化对象不同:前者缓存预编译包与元数据,后者缓存编译器前端产物。应分列目录与上限,并在 Runner 维护窗口错峰清理。
总结:用 remote 与锁文件固定「从哪拉、拉哪个版本面」,用 parallel 与超时稳住「怎么拉」,用 CONAN_HOME + ccache + df守住「占多少盘」。站内延展:Git/npm CI 缓存策略;公开入口 首页、购买页、帮助中心。