平台
平台是客户请求的内容(hostel acquire <platform>)。有两种类型:
| 类型 | 名称 | 提供服务的机器 |
|---|---|---|
| 操作系统平台 | linux、macos、windows | 具有该操作系统的每台机器自动提供,无需在 platforms 中列出。 |
| 设备平台 | ios、android 或自定义平台 | 在 platforms 中列出该平台的机器。 |
Node、Java 或 pnpm 等工具不是平台:它们由仓库的 mise 文件声明(hostel-use),或由机器的 tools 键声明(hostel-rooms)。
hostel platforms # 面向所有人:空闲槽位、队列、等待、设备
hostel config platforms # 面向管理员:名称、类型、机器、来源
默认平台
二进制内置了 ios、android、macos 和 windows。linux 是一个没有脚本的操作系统平台。
| 平台 | 设备 | 机器操作系统 | 机器所需条件 |
|---|---|---|---|
ios | iphone-17-pro、ipad-pro-13(最多 2 台) | macOS | Xcode 和 iOS 模拟器运行时,由人员安装。该平台需要标签 xcode-26.5。可选的机器 env:HOSTEL_IOS_RUNTIME(例如 26.5)、DEVELOPER_DIR。 |
android | pixel-9、pixel-tablet(最多 2 台) | Linux 或 macOS | Java 17 或更高版本:在机器上设置 tools = { java = "21" }。Linux:房间用户可用的 /dev/kvm(为机器添加诸如 kvm 之类的标签),并且拥有模拟器包或无需密码的 sudo。Provision 大约下载 5 GB(超时时间 30 分钟)。可选的 env:HOSTEL_ANDROID_API(36)、HOSTEL_ANDROID_TAG(google_apis)、HOSTEL_ANDROID_PORT(5554)。 |
macos | 无 | macOS | 无头构建:无需其他条件。桌面应用:标签 desktop、自动登录房间用户、解锁的屏幕、为 /usr/libexec/sshd-keygen-wrapper 开启屏幕录制、以及无需密码的自动化模式(sudo automationmodetool enable-automationmode-without-authentication)。 |
windows | 无 | Windows | OpenSSH 服务器。桌面应用:标签 desktop 以及已登录、解锁的桌面会话中的 “Hostel desktop” 任务。 |
linux | 无 | Linux | SSH 服务器。 |
平台提供给命令的内容:
ios:每次租约的全新干净模拟器;SIMULATOR_UDID(第一个设备)和SIMULATOR_UDIDS。android:来自干净快照的只读模拟器;ANDROID_SERIAL、ANDROID_SERIALS、ANDROID_HOME。- 需要
desktop的租约是独占的:它占用整台机器。
每个房间还会获得 agent-device(点击、输入、读取屏幕),在 Windows 上还会获得 winapp。mise.agent_device = false(hostel config settings set)可关闭此功能。
完整的 Mac 和 Windows 准备(用户、远程登录、自动登录、桌面任务)见 docs/static-room-setup.md。
设备和标签
--device <d>选择平台的设备(可重复使用,最多max_devices个)。如果不指定,则使用仓库的devices或平台的第一个设备。- 标签是机器上的自由单词(
labels = [...])。只有拥有所有必需标签的机器才视为候选:平台的requires、仓库hostel.toml中的requires以及每个--require。 - 标签根据机器所具备的特性命名:
xcode-26.5、desktop、kvm。 - 未知的平台或设备,或任何机器都不具备的标签,立即失败并退出代码 69。
自定义平台
hostel config platforms new tvos ./tvos --os macos # 创建模板文件夹(--os linux|macos|windows)
# 编辑 ./tvos/platform.toml 和脚本
hostel config platforms push ./tvos # 检查并保存;名称即文件夹名
hostel config rooms set mac-mini platforms=ios,tvos # 让机器提供该平台
修改默认平台:
hostel config platforms pull ios ./ios # 将当前文件拉取到新文件夹
hostel config platforms push ./ios # 保存您的版本(来源:已更改)
hostel config platforms reset ios # 恢复为本版本的原始文件
hostel config platforms remove tvos # 如果机器列表中仍包含则拒绝
push --name <n> 将文件夹保存为另一个名称。推送立即生效。平台更改后,空闲房间会重新进行 provision。推送仅发送 platform.toml、README.md 和脚本。
platform.toml
description = "tvOS 模拟器"
devices = ["apple-tv-4k"] # 第一个是默认设备(仅限设备平台)
max_devices = 1 # 默认 1
requires = ["xcode-26.5"] # 每台机器必须具备的标签
exclusive = false # true:租约占用整个房间
script_timeouts = { provision = "20m" } # 默认:provision 20 分钟,其他 3 分钟
操作系统平台文件夹(linux、macos、windows)可以包含 description、requires、exclusive 和 script_timeouts,但不能包含 devices。
脚本
文件名:对于 macos 和 linux,使用 <step>.<os>.sh;对于 windows,使用 <step>.<os>.ps1。房间的操作系统选择相应文件。拼写错误的脚本名会报错。
| 步骤 | 触发时机 | 运行目录 |
|---|---|---|
provision | 每个房间运行一次(脚本更改时再次运行):安装并检查平台所需内容 | hostel/ |
prepare | 每次租约准备就绪前:启动设备,将其信息写入 device.env | slots/<slot>/ |
screenshot | hostel screenshot:$1 是输出 PNG 路径,$2 是设备 | slots/<slot>/ |
reset | 清理时:停止并删除 prepare 启动的内容 | slots/<slot>/ |
health | 清理后、修复时、预热房间接受租约前:如果房间无法提供该平台,则退出并返回非零值 | hostel/ |
规则:
- 每个步骤都是可选的,但设备平台在其所有提供该平台的机器操作系统上,
prepare是必需的。 - 每个步骤必须能够安全地重复运行。
- 非零退出码表示失败。Provision 或 prepare 失败会使房间进入 Broken 状态,并将租约放回队列。最后 4 KB 输出会记录到事件日志中(
hostel status <room>)。 - 助手运行
/bin/sh <脚本>(无需可执行权限),并在超时时停止其进程组。 - 机器级别的
tools在provision之前安装,因此脚本可以使用它们。
脚本的环境变量:HOSTEL_PLATFORM、HOSTEL_PLATFORM_DEVICES(平台的所有设备)、HOSTEL_SLOT、HOSTEL_SLOT_DIR、HOSTEL_WORK_DIR、HOSTEL_CACHE_DIR(在租约之间保留)、HOSTEL_LEASE_ID,以及用于 prepare、screenshot 和 reset 的:HOSTEL_DEVICES(租约的设备,逗号分隔)和 HOSTEL_EXCLUSIVE(全房间租约为 1)。此外还有 MISE_* 变量、provider、机器和槽位的 env、以及 device.env(用于 screenshot 和 reset)。使用机器 env 可以在不同机器之间改变脚本行为。
device.env 中的行(名称=值)会进入每个租约命令的环境中。请记录您的平台写入的名称。
检查
hostel config platforms
hostel status mac-mini # 事件会显示 provision 输出和错误