本文面向在远程 Mac上跑 Python / 数据 / ML 流水线、需要跨境稳定批量安装 wheels 与 sdist的开发者与 CI 维护者。你将得到:pip / uv / conda 选型表可执行环境变量与命令矩阵TLS / 证书 / 代理排障锁文件与 pyproject 一致性步骤FAQ。入口:首页博客列表Git/npm 缓存与 CI 加速

① 场景界定: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;内网/近源:816
读超时(秒) UV_HTTP_TIMEOUT 120300(大 wheel)
连接超时(秒) UV_HTTP_CONNECT_TIMEOUT 3060
HTTP 重试次数 UV_HTTP_RETRIES 58
缓存目录(多 Job 隔离) UV_CACHE_DIR 例如 $HOME/.cache/uv-$CI_PIPELINE_ID
默认索引(镜像) UV_DEFAULT_INDEXUV_INDEX_URL 清华示例:https://pypi.tuna.tsinghua.edu.cn/simple
额外索引(私有混用) UV_INDEX(空格分隔多个 URL) UV_INDEX_STRATEGY 联用前评估供应链
# 远程 Mac CI shell 片段(可按流水线注入) export UV_CONCURRENT_DOWNLOADS=4 export UV_HTTP_TIMEOUT=180 export UV_HTTP_CONNECT_TIMEOUT=45 export UV_HTTP_RETRIES=6 export UV_CACHE_DIR="${HOME}/.cache/uv-ci-${CI_PIPELINE_ID:-local}" export UV_DEFAULT_INDEX="https://pypi.tuna.tsinghua.edu.cn/simple" # 项目模式:锁定环境 uv sync --frozen --no-dev # 仅 requirements 流:生成带哈希锁文件(在开发者机器或锁文件 Job) # uv pip compile pyproject.toml -o requirements.lock --generate-hashes # uv pip sync requirements.lock

镜像切换时不要与「未清理的旧缓存」混用同一 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_PROXYHTTP_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 可复现步骤

推荐清单(uv 项目)
  • 本地或锁文件专用 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 次版本。
# 校验「锁与 pyproject 是否一致」(失败则非零退出) uv lock --check # 仅安装,不改动锁(CI 主路径) uv sync --frozen --no-dev

若 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

远程 Mac 上跑 Python / ML CI

稳定拉依赖,再跑训练与测试

MacPull 提供 Apple Silicon 远程 Mac,适合与本地同构的 Python 与原生 wheel;定价、购买与帮助中心均可免登录浏览。若流水线还涉及 Git 与镜像层,可参考英文站 Git & Docker 拉取加速 与中文 Git 与 Docker 拉取加速指南

多节点可选
SSH 与桌面访问
弹性租期
7×24 支持