
如果你使用的是 Dedicated SaaS 部署,请联系你的账户团队以启用 macOS 虚拟机。
工作原理
macOS 支持构建在与 Linux 相同的声明式配置系统之上。蓝图中的runs-on 字段用于告诉 Devin 在哪个平台上构建和运行,每个平台都有各自独立的快照。
与 Linux 的主要区别在于 shell、文件系统布局和包管理器:
启动 macOS 会话
你可以为每个会话单独选择 macOS:- 蓝图:添加
runs-on: macos,让该代码仓库的快照针对 macOS 构建 (见下文) 。 - Slack:使用
!macbang 命令 在 macOS 虚拟机上启动会话。 - API:在创建会话、计划或自动化任务时设置
platform: "macos"。参见 API 参考。 - 组织默认设置:管理员可以在 Settings → Devin → Default platform 中将 macOS 设为新会话的默认平台,也可以通过 Set Organization Default Platform API 进行设置。如需查看当前值,可使用 Get Organization Default Platform。
编写 macOS 蓝图
单平台蓝图
如果你的代码仓库仅面向 Apple 平台,请在顶层使用runs-on: macos:
多平台蓝图
若要为多个平台构建同一个代码仓库,请将每个平台写成独立的 YAML 文档,并以--- 分隔。每个文档各自声明自己的 runs-on 标签。有关该格式的背景信息,请参阅蓝图指南中的 Multi-document YAML 提示框。
runs-on 字段
runs-on 字段映射到你账户中已注册的机器配置:
你可以将
runs-on 指定为字符串或列表:
用量与成本
macOS 会话目前消耗的用量与同等的 Linux 会话相同,不收取 macOS 附加费用。这是促销发布定价,可能会发生变化。
预装内容
macOS 会话镜像已预装 Apple 工具链,因此你的蓝图无需再自行下载:
随着 Apple 发布新版本、镜像随之更新,各组件版本也会变化。要确切了解某个会话中的版本情况,可让 Devin 运行:
选择 Xcode 版本
默认的 Xcode 即xcode-select 所指向的版本。若只想在单条命令中使用其他已安装的版本,请设置 DEVELOPER_DIR:
/usr/bin/xcodebuild(该 shim 会遵循 DEVELOPER_DIR),而不是通过 PATH 解析到的某个特定 Xcode 的 Contents/Developer/usr/bin 下的 xcodebuild,因为后者无论 DEVELOPER_DIR 如何设置,都只会报告自身的版本。
或者为整个会话切换默认版本:
macOS 会话行为
Shell
macOS 会话使用 zsh 作为默认 shell。大多数 POSIX shell 命令可直接沿用 Linux 蓝图中的写法,无需修改,但需注意 BSD 用户态工具的差异:sed -i 必须带一个参数 (sed -i '') ,而 gsed、gdate、greadlink 等 GNU 工具需通过 Homebrew 的 coreutils formula 安装。
路径
/Users/devin/repos/<repo-name>,你上传到会话中的文件则会写入 /Users/devin/.files/。
Secrets
Secrets 在会话期间以环境变量的形式提供 ($SECRET_NAME) ,与 Linux 上的行为一致。可通过这种方式提供 App Store Connect API 密钥、签名凭据或私有 registry 令牌:
会话休眠与唤醒
会话休眠时会将磁盘内容保存为快照。磁盘上的所有内容在唤醒后依然保留:已安装的工具、已克隆的代码仓库、构建缓存和派生数据。但正在运行的进程不会保留:开发服务器、模拟器和文件监听器需要在会话唤醒后重新启动。Computer Use
Computer Use 支持 macOS 会话:Devin 可获得一个完整的 macOS 桌面,配备 Chrome、鼠标和键盘,既能测试 macOS 原生应用,也能测试 Web 应用,并可将操作过程录制下来。在 macOS 上,Devin 使用 Command 键触发快捷键 (⌘C、⌘V、⌘Tab) ,而非 Control 键。iOS 模拟器
Devin 可以直接启动并操控 iOS 模拟器:使用技巧
预热构建缓存
冷构建 Xcode 会拖慢构建速度,影响开发体验。可使用environment.yml 中的 maintenance 字段预热缓存。
网络访问
如果构建过程需要从 CocoaPods、Swift Package Manager、Firebase 或私有 registry 拉取依赖,就必须能访问这些主机。如果你的组织启用了受限的网络策略,请确保 macOS 允许列表中也包含 Linux 构建所使用的那些 registry。两者需要分别配置,一旦遗漏某个条目,通常会在构建中途表现为依赖解析失败或 TLS 失败。运行容器
macOS 虚拟机不支持嵌套硬件虚拟化,因此容器运行时只能回退到 QEMU 的软件模拟 (TCG) 。Colima 会自动检测并切换到模拟模式:colima start 失败,重试即可。启动之后,container 在 CPU 上的运行速度约为原生的 1/15 到 1/25,每次启动还需几秒;镜像拉取则可跑满宿主机网络速度。用来跑 lint 或打包类 container 没什么问题,但拿来编译就很折磨了。如果工作中大量使用 container,建议改用 Linux 会话,或让 macOS 会话指向远程的 Docker 守护进程。
非必要不要在蓝图中安装 Xcode
Xcode 下载体积多达数 GB,而且 Apple 要求登录 Apple ID 才能下载。建议优先使用 image 中已有的版本,通过DEVELOPER_DIR 或 xcode-select 来选择。如果确实需要其他版本或测试版,可以把 Apple ID 存为 secret,让蓝图去下载该版本,但代价是构建会慢很多。
限制
故障排查
快照重建后的第一个会话中,构建明显变慢。 这是因为 DerivedData 被从零重新构建了。可在maintenance 中添加一次 build-for-testing 步骤,让快照带上已预热的构建产物。
xcodebuild 选用了错误的工具链。 检查 xcode-select -p,并在蓝图步骤中显式设置 DEVELOPER_DIR。
找不到指定的 destination。 运行 xcrun simctl list devices available,查看已安装的运行时实际提供了哪些设备,并让 -destination 中的名称和系统版本与之匹配。
依赖解析卡住,或因 TLS 错误而失败。 通常是该主机不在你的组织针对 macOS 的网络允许列表中。参见网络访问。
