
在 Buildkite 流水线中使用 Tart 插件将构建步骤隔离运行在临时 macOS 虚拟机中【免费下载链接】tartmacOS and Linux VMs on Apple Silicon to use in CI and other automations项目地址: https://gitcode.com/GitHub_Trending/ta/tart本指南围绕仓库中的 docs/integrations/buildkite.md 展开讲解如何借助 Tart Buildkite Plugin让 Buildkite 流水线中的每一个步骤都运行在从 OCI 镜像克隆出的隔离、临时的 Tart 虚拟机里。读完本文你将掌握最小可用的buildkite-agent流水线配置、插件钩子Hook的执行时序以及镜像来源、克隆加速与缓存清理等底层原理从而把「宿主机裸跑构建」升级为「一次性 VM 内构建」。为什么要在 Buildkite 中引入 Tart 虚拟机Buildkite 的构建代理Agent默认直接在宿主机上执行命令构建过程会共享宿主机的文件系统、环境变量与运行中的进程容易出现依赖污染、并发冲突与安全隐患。Tart 提供了一种更干净的方案通过 Tart Buildkite Plugin把流水线的某个步骤放进一个隔离的临时 Tart 虚拟机中执行步骤结束后虚拟机即被丢弃宿主环境始终保持洁净。这一方案之所以可行依赖 Tart 本身的两个核心能力基于 Apple 官方 Virtualization.Framework 的虚拟机Tart 直接调用Virtualization.Framework构建虚拟机相关实现集中在 Sources/tart/VM.swift对宿主机系统要求为 Apple Silicon 且运行 macOS 13.0Ventura或更新版本见 docs/quick-start.md。基于 OCI 兼容容器仓库的镜像分发Tart 可以将虚拟机镜像 push/pull 到任意 OCI 兼容仓库如ghcr.io插件配置中的image字段指向的正是这类远程镜像地址。两者结合就实现了「流水线配置声明镜像 → 代理端按需克隆 → 隔离执行构建步骤」的完整闭环。集成前置条件在配置插件之前需要先准备好以下环境一台 Apple Silicon 宿主机运行 macOS 13.0Ventura或更新版本并安装好 Buildkite Agent安装 Tart可以通过 Homebrew 安装然后执行tart clone与tart run验证基本功能详见 docs/quick-start.md准备一个可用的虚拟机镜像例如 Tart 官方维护的ghcr.io/cirruslabs/macos-tahoe-base:latest。仓库文档中列出的常用镜像还包括 macOS 各版本Tahoe/Sequoia/Sonoma/Ventura/Monterey的-vanilla、-base、-xcode系列以及 Ubuntu、Debian、Fedora 等 Linux 镜像这些镜像的默认登录凭据均为用户名admin、密码admin。插件本身不会在本地预下载镜像而是在构建步骤启动时按需从 OCI 仓库拉取并克隆因此代理端需要具备访问对应镜像仓库的网络权限。最小可用的流水线配置在 Buildkite 流水线文件例如pipeline.yml中加入以下内容steps: - command: uname -a plugins: - cirruslabs/tart#main: image: ghcr.io/cirruslabs/macos-tahoe-base:latest这段配置的含义是让 Buildkite Agent 执行uname -a但执行环境不再是宿主机而是从ghcr.io/cirruslabs/macos-tahoe-base:latest克隆出来的一台临时 macOS Tart 虚拟机。配置项逐一说明如下配置项作用steps[].command指定要执行的命令可以是单条命令也可以写成多条命令的序列steps[].plugins挂载到该步骤的 Buildkite 插件列表cirruslabs/tart#main插件引用名#后为插件仓库的 git 引用这里是main分支用于锁定插件版本image指定克隆虚拟机所用的 OCI 镜像地址格式为registry/namespace/name:tag需要留意的是文档正文示例中的命令为uname -a而描述文字写成了uname -r两者都是合法的命令实际执行结果以你写入command的内容为准。插件除image外还提供了一系列可调选项例如虚拟机资源配置、预执行的初始化命令、产物收集方式等完整清单见插件仓库的 Configuration 章节本文只保证最小配置可直接运行。一次真实的插件执行钩子Hook时序下图是仓库中记录的 BuildkiteTartPlugin.png 运行截图展示了 Tart Buildkite Plugin 在 Buildkite 上的真实作业日志从截图日志可以看到一个步骤完整走过了以下阶段Preparing plugins准备插件Agent 从插件仓库拉取 Tart 插件代码日志中的插件路径形如github-com-cirruslabs-tart-buildkite-plugin-.../hooks/command即插件被安装到 Agent 的插件目录后按 Buildkite 插件约定执行Running plugin tart pre-command hook执行前置钩子插件在该阶段创建并启动临时虚拟机Running plugin tart command hook执行命令钩子插件在虚拟机内部执行步骤声明的命令例如截图中的uname -a其输出Darwin Kernel Version ... arm64表明命令确实运行在 macOS 虚拟机内而非宿主机上Running plugin tart pre-exit hook执行退出前钩子命令执行完毕后插件收集结果并销毁临时虚拟机Exited with status 0步骤以退出码 0 成功结束整个过程耗时、等待时长都会以普通 Buildkite 作业的形式展现在 UI 中。理解钩子时序的意义在于排障当步骤失败时可以依据日志定位是镜像拉取/克隆阶段pre-command失败还是虚拟机内命令本身command失败抑或是退出清理pre-exit阶段的问题。镜像从哪来OCI 分发、克隆加速与本地缓存插件配置里的image指向的是一个 OCI 兼容仓库地址这与 Tart 的镜像分发模型完全一致Tart 支持将本地虚拟机push到 OCI 仓库也支持从仓库pull/clone远程镜像镜像格式必须由 Tart 创建并推送容器引擎制作的镜像无法直接使用相关说明见 docs/quick-start.md代理端首次运行时会把远程镜像拉取并缓存到本地缓存路径默认为~/.tart/cache/OCIs/下按host/namespace/tag组织的目录该目录结构在 Sources/tart/VMStorageOCI.swift 中定义本地存储根目录由 Sources/tart/Config.swift 管理可通过TART_HOME环境变量重定向。克隆速度是 CI 场景的关键。查看 Sources/tart/Commands/Clone.swift 可以发现两层加速机制APFS Copy-on-Write在 Apple File System 上克隆虚拟机不会立即占用全部磁盘空间只有写入新数据时才实际分配空间因此从同一基础镜像克隆出的多个临时 VM 在磁盘占用和执行速度上都极具优势自动清理Automatic Pruning默认情况下tart clone会在克隆前检查 Tart 主目录的剩余容量并尽量回收最少的存储空间以容纳新镜像可通过设置TART_NO_AUTO_PRUNE环境变量关闭也可通过--prune-limit限制回收上限。这意味着在 CI 中反复克隆大量临时 VM 时缓存不会无限膨胀。在虚拟机内执行脚本与收集构建产物插件的工作方式是「把command放进虚拟机执行」因此在command中你可以编排任意 shell 逻辑例如steps: - command: - git clone --depth1 https://example.com/org/repo.git - make build - make test plugins: - cirruslabs/tart#main: image: ghcr.io/cirruslabs/macos-tahoe-xcode:latest当构建产物或脚本需要传回宿主机/Agent 时常规做法包括借助 Buildkite 的buildkite-agent artifact upload机制从虚拟机内把产物上传到 Buildkite 的 artifact 存储通过 SSH 连接虚拟机交互式操作。Tart 提供了tart ip vm-name获取运行中虚拟机的 IP 地址见 docs/quick-start.md示例为ssh admin$(tart ip tahoe-base)其中admin/admin是官方镜像的默认凭据若需要在虚拟机内无交互执行命令并精确控制退出码Tart 从 macOS 14 起还提供了tart exec命令见 Sources/tart/Commands/Exec.swift它通过 Tart Guest Agent 在运行中的虚拟机内执行命令所有非 vanilla 的 Cirrus Labs 镜像都已预装 Guest Agent。具体到 Buildkite 插件场景产物收集与脚本注入的推荐路径以插件自身的 Configuration 文档为准上述命令可作为你在宿主机侧手动调试与验证的补充手段。注意事项与常见限制在把该集成方案落地到生产流水线之前建议关注以下几点平台限制Tart 虚拟机只能在 Apple Silicon 且满足系统版本要求的宿主机上运行Buildkite Agent 必须部署在这样的机器上截图中的作业运行在mac-mini-17.local即一台本地 macOS 代理镜像凭据官方镜像默认账号为admin/admin如果流水线需要在虚拟机内执行需要提权的命令请提前在镜像中配置好免密 sudo 等权限创建自定义镜像的步骤见 docs/quick-start.md 的「Creating VM images」章节版本锁定示例中插件引用为cirruslabs/tart#main生产环境建议锁定到具体 tag 或 commit同时image字段建议使用明确版本号的镜像 tag 而非仅latest以保证构建的可复现性并发与资源每个步骤都会创建一台独立虚拟机会同时占用宿主机 CPU、内存与磁盘得益于 APFS 的 Copy-on-Write 与自动清理机制临时 VM 的开销被显著降低但仍需为并发构建预留足够资源镜像拉取延迟首次执行某镜像的步骤需要拉取镜像例如 25 GB 量级的 macOS 镜像之后的步骤可从本地缓存直接克隆因此建议在流水线早期预热常用镜像。结语Tart Buildkite Plugin 把「隔离、临时、可复现」这三个 CI 基础设施的核心诉求以最小侵入的方式带入了 Buildkite你只需在步骤上声明一个插件和一张镜像剩下的镜像拉取、虚拟机克隆、命令执行与回收都由插件按 Buildkite 钩子约定自动完成。结合本文对 OCI 分发、Copy-on-Write 克隆与自动清理等底层机制的说明你可以更有把握地设计基于 Tart 虚拟机的高质量构建流水线。更完整的插件配置项请查阅插件仓库的 Configuration 章节Tart 本身的使用与镜像管理命令可继续阅读 docs/quick-start.md 与 docs/faq.md。【免费下载链接】tartmacOS and Linux VMs on Apple Silicon to use in CI and other automations项目地址: https://gitcode.com/GitHub_Trending/ta/tart创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考