① 场景界定:pip、uv、conda,何时优先 uv
远程 Mac CI 的核心矛盾是解析速度、并发拉取、缓存复现与跨境链路抖动。下表按常见约束选型;若团队已全面 conda 且依赖大量二进制 channel,不必强行迁 uv。
| 工具 | 更适合 | 在远程 Mac CI 的短板 |
|---|---|---|
| pip | 极简脚本、无锁文件文化 | 并发与缓存策略弱,大批量 wheel 往往更慢 |
| uv | 要 uv.lock / pip 兼容、批量下载、与 pyproject 一体 |
可调并发、超时、重试;缓存目录清晰 |
| conda / mamba | 科学计算栈、非 PyPI 生态包 | 环境体积大、镜像与 channel 治理成本高 |
结论:以 PyPI 为主、要在 Apple Silicon 上快速装一堆 wheels/sdist 时,优先 uv;需要与旧 pip 工作流共存时,用 uv pip 子命令即可。
② 可执行参数矩阵:并发、超时、重试、缓存与镜像
下列变量与官方文档一致(见 uv 环境变量说明)。跨境链路建议先加超时与重试,再调并发,避免把弱网打满导致全员重试风暴。
| 目标 | 环境变量(示例) | 建议起点 |
|---|---|---|
| 并发下载数 | UV_CONCURRENT_DOWNLOADS |
跨境不稳:4;内网/近源:8–16 |
| 读超时(秒) | UV_HTTP_TIMEOUT |
120–300(大 wheel) |
| 连接超时(秒) | UV_HTTP_CONNECT_TIMEOUT |
30–60 |
| HTTP 重试次数 | UV_HTTP_RETRIES |
5–8 |
| 缓存目录(多 Job 隔离) | UV_CACHE_DIR |
例如 $HOME/.cache/uv-$CI_PIPELINE_ID |
| 默认索引(镜像) | UV_DEFAULT_INDEX 或 UV_INDEX_URL |
清华示例:https://pypi.tuna.tsinghua.edu.cn/simple |
| 额外索引(私有混用) | UV_INDEX(空格分隔多个 URL) |
与 UV_INDEX_STRATEGY 联用前评估供应链 |
镜像切换时不要与「未清理的旧缓存」混用同一 UV_CACHE_DIR,否则易出现元数据不一致;见下文 FAQ。
③ 跨境网络:失败模式与排障(TLS / 证书 / 代理)
- TLS 握手失败 / 证书不受信:将企业根证书导入 macOS 钥匙串;或设置
SSL_CERT_FILE/SSL_CERT_DIR指向 PEM 聚合。可尝试UV_SYSTEM_CERTS=true(或较旧版本的UV_NATIVE_TLS=true)让 uv 走系统证书库。 - 出网必须 HTTP(S) 代理:设置
HTTPS_PROXY、HTTP_PROXY;内网索引与 metadata 用NO_PROXY排除。代理超时短于UV_HTTP_TIMEOUT时,先调代理空闲连接策略。 - 间歇性 reset:降低
UV_CONCURRENT_DOWNLOADS,提高UV_HTTP_RETRIES;大文件 Job 单独重试uv sync比整流水线重跑更省分钟数。
与 Git、Docker 层拉取相关的全局策略,可对照站内 跨境 Git/npm/Homebrew 镜像优化 与英文博客 Git & Docker pull acceleration(EN)。
④ 与 pyproject / 锁文件的一致性校验与 CI 可复现步骤
- 本地或锁文件专用 Job 执行
uv lock,提交uv.lock。 - CI 安装阶段使用
uv sync --frozen(必要时加--locked做「锁必须已是最新」断言)。 - 仍交付
requirements.txt时:用uv pip compile ... --generate-hashes生成requirements.lock,CI 执行uv pip sync requirements.lock并设UV_REQUIRE_HASHES=true(若文件含哈希)。 - 缓存键包含:仓库提交、
uv.lock哈希、UV_DEFAULT_INDEX主机名、Python 次版本。
若 MR 仅改依赖却未更新锁文件,应在流水线明确失败,避免远程 Mac 上「装到一半才爆」浪费队列。
⑤ FAQ:缓存污染、平台 wheel、私有索引混用
缓存污染:多 Job 共享同一 UV_CACHE_DIR 且并发写,或同一目录先后指向不同镜像,可能留下不一致的 simple 元数据。建议每流水线子目录 + 大版本升级时 uv cache prune。
平台 wheel:锁文件应在目标平台生成,或使用与 CI 相同的 UV_PYTHON;Apple Silicon 上误用 x86_64 解释器会导致解析标签偏差。
私有索引混用:UV_DEFAULT_INDEX 设镜像,UV_INDEX 追加私有 simple;包名冲突时谨慎调整 UV_INDEX_STRATEGY,并在代码评审中审计依赖来源。
总结:2026 年在远程 Mac 跑 Python CI,先用超时 + 重试 + 适度并发稳住跨境拉取,再用独立缓存目录与镜像策略避免隐性污染,最后用 uv lock / uv sync --frozen 把可复现性写进流水线。需要同构 Apple Silicon 节点时,可在免登录浏览 套餐定价、购买说明 与 帮助中心 后选择合适地域与配置。延伸阅读(英文,免登录):Remote Mac cache strategy: Git & npm CI。
稳定拉依赖,再跑训练与测试
MacPull 提供 Apple Silicon 远程 Mac,适合与本地同构的 Python 与原生 wheel;定价、购买与帮助中心均可免登录浏览。若流水线还涉及 Git 与镜像层,可参考英文站 Git & Docker 拉取加速 与中文 Git 与 Docker 拉取加速指南。