共享的远程 Mac Runner 上跑 C/C++ 流水线时,Conan 2 同时承担解析、下载二进制与可能的源码构建:remote 端点切换不当会触发全量重编;仅靠拉高并行下载又可能在弱网下放大连接抖动。本文按「可执行参数 + 对比 + 决策矩阵」组织,内链 vcpkg 与 FetchContent 跨境矩阵(同类 C++ 依赖面)、技术博客列表站点首页,免登录可阅。
独立可用的 Meta 标题: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.pyconanfile.txt;CI 与本地使用同一组 profile(AppleClang 版本、archbuild_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 之后执行):

export CONAN_HOME="${CONAN_HOME:-$CI_PROJECT_DIR/.conan2}" mkdir -p "$CONAN_HOME" conan remote list # 按需插入企业源为优先(示例) # conan remote add company https://artifacts.example.com/artifactory/api/conan/conan-release --index=0 # 官方 Conan Center 2(若列表中尚无或 URL 漂移) conan remote add conancenter https://center2.conan.io --force # 仅当制品库需要认证时取消注释: # conan remote login company "$CONAN_TOKEN"

并发与超时阈值

core.download:parallel控制「同时进行多少个包下载任务」。在千兆以内网或稳定出口,可起点为CPU 物理核数或一半;若日志中频繁出现超时、TLS 握手失败或网关 429,应先减半 parallel,再拉长 HTTP 超时,而不是无限重试同一并发。

conan config set core.download:parallel=8 conan config set core.net.http:timeout=300

参数清单(写入 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 损坏。

export CONAN_HOME="$CI_PROJECT_DIR/.conan2" export CCACHE_DIR="$CI_PROJECT_DIR/.ccache" export CC="${CC:-ccache clang}" export CXX="${CXX:-ccache clang++}" df -h . export CCACHE_MAXSIZE="${CCACHE_MAXSIZE:-20G}" ccache -s

失败重试与一致性检查

外层脚本建议采用 2 / 4 / 8 秒阶梯退避包裹 conan install,并限制最大重试次数以免占满队列时间。lockfile应在受控分支生成:本地或专用 Job 执行 conan lock create,将 conan.lock 入库;CI 一律 --lockfile=conan.lock 安装,禁止静默升级依赖面。验收时并列运行 图信息与哈希闸口:确认解析图与锁一致,且工作区无意外改动。

conan lock create . --lockfile-out=conan.lock # CI: conan install . --lockfile=conan.lock --build=missing conan graph info . --lockfile=conan.lock shasum -a 256 conan.lock git diff --exit-code conan.lock || { echo "conan.lock 漂移"; exit 1; }
决策矩阵(何时动作)
症状 优先动作
仅镜像 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 缓存策略;公开入口 首页购买页帮助中心

Conan 2 × 远程 Mac

在真实 Apple Silicon 节点上验证依赖解析与缓存全链路

免登录入口:首页套餐与节点购买帮助中心。延伸阅读:vcpkg 与 FetchContent CI 矩阵预拉取与版本一致性

并行可调
lockfile 闸口
磁盘可观测
支持渠道