Desk M4
Mac mini M4 · 16GB 内存 · 256GB SSD
- 公网 IP
- 在实例详情中查看并复制
- 登录用户名
- 使用控制台分配的用户名
- 初始密码
- 仅在私密环境查看,不贴入日志
- SSH 公钥
- 在控制台对应入口上传公钥
这是你的云端 Mac 工位操作手册。目标是用前十分钟完成领取信息、SSH 登录和环境检查;依赖下载与完整构建所需时间,取决于项目本身。
登录控制台,打开对应订单的实例详情。连接地址、账号和连接端口都以该实例显示的信息为准;不要把订单编号当成登录用户名。
Mac mini M4 · 16GB 内存 · 256GB SSD
Desk M4 是非虚拟机的云端 Mac,macOS 图形界面和命令行都可使用。先确认订单对应的节点,再确认连接信息,避免把另一台工位的地址写进脚本。
首次使用建议先走 SSH。它能快速判断地址、端口、认证是否正常;图形界面用于需要点选的系统设置和 Xcode 配置,不必作为构建任务的常驻入口。
ssh-ed25519 等类型开头的公钥。把下方示例 IP 和用户名换成控制台中的值。203.0.113.24 是文档示例地址,不能用于连接你的工位。
在本地生成独立的工作密钥,并设置口令。如果你已有合适的密钥,可直接上传对应公钥,不要覆盖已有文件。
ssh-keygen -t ed25519 -f ~/.ssh/minivps_workstation
cat ~/.ssh/minivps_workstation.pub第一次连接会显示主机密钥指纹。先与可信来源提供的指纹核对;控制台未提供时,通过工单确认。不要只因提示出现就直接接受。
ssh -i ~/.ssh/minivps_workstation dev@203.0.113.24在远端运行下面的命令,确认架构、开发工具路径与版本。若项目要求不同 Xcode 版本,先完成版本对齐,再安装项目依赖。
uname -m
xcode-select -p
xcodebuild -version
sw_vers以下为格式节选,不是实时执行结果。指纹值、耗时和构建日志会随实例与项目变化;成功上传还需要你已有的签名材料及有效发布凭据。
$ ssh -i ~/.ssh/minivps_workstation dev@203.0.113.24
The authenticity of host '203.0.113.24' can't be established.
ED25519 key fingerprint is SHA256:…
Are you sure you want to continue connecting (yes/no/[fingerprint])?
yes
Warning: Permanently added '203.0.113.24' to the list of known hosts.
$ cd ~/work/App
$ xcodebuild -scheme App -destination 'generic/platform=iOS' archive
…
** ARCHIVE SUCCEEDED **
$ bundle exec fastlane beta
…
Successfully uploaded the new binary to App Store Connect
Successfully finished processing the build
只有核验指纹后才输入 yes。若提示主机密钥变化,先确认是否重装过系统或更换过实例;不要直接删除全部 known_hosts 记录绕过检查。
| 看到的提示 | 先检查什么 | 下一步 |
|---|---|---|
| Connection timed out | IP、SSH 端口、本地网络与防火墙 | 换一条本地网络验证;仍失败时提交工单,附连接时间与节点。 |
| Permission denied | 用户名、公钥是否上传、私钥是否选对 | 使用 ssh -v 查看认证过程,分享日志前移除敏感信息。 |
| Scheme not found | 当前项目目录、workspace 和共享 Scheme | 先运行 xcodebuild -list;使用 CocoaPods 的项目通常需要指定 workspace。 |
| Signing failed | 证书及其私钥、描述文件、钥匙串访问权限 | 先在交互式会话完成一次签名验证,再迁入无人值守 CI。 |
SSH 用于命令与自动化,VNC 用于图形设置与交互操作。建议先打通 SSH,再转发屏幕共享端口,不把 VNC 服务直接暴露到公网。
在系统设置中检查屏幕共享是否开启,以及哪些用户被允许访问。只授权实际需要的用户;不同 macOS 版本的设置位置可能不同。
服务未开启或账号未授权时,隧道成功也不会出现桌面。
保持下方 SSH 会话运行。示例将本地 15900 端口转发到远端的 5900 端口,并只监听本机回环地址。
若实例使用其他 SSH 端口,在命令中添加 -p 和控制台给出的端口。
本地 Mac 可使用屏幕共享;其他系统使用兼容的 VNC 客户端。目标填写本机地址与转发端口,不是远端公网 IP。
客户端仍需使用被授权的远端账号完成认证。
ssh -N -L 127.0.0.1:15900:127.0.0.1:5900 \
-o ExitOnForwardFailure=yes \
-i ~/.ssh/minivps_workstation dev@203.0.113.24
客户端连接地址:vnc://127.0.0.1:15900。退出转发会话会中断这条访问路径;不要把它当成常驻公网服务。
可以从 1440 × 900 分辨率和单屏开始,这是客户端调试建议,不是套餐限制。关闭动态桌面与不需要的预览,文件传输改走 SSH。网络带宽越高不代表输入延迟越低,往返时延、丢包和本地无线网络同样重要。
如果命令行响应正常而画面慢,先降低客户端画质或分辨率。如果 SSH 与画面同时断开,保留发生时间、本地网络类型和客户端提示,再提交连接问题工单。
将工位注册到你自己的 CI 项目。每种平台的注册参数都应从项目或管理页面领取,不要复用别人的令牌,也不要把注册令牌提交进代码仓库。
在仓库或组织的 Runner 设置中,选择 macOS 与 ARM64,按页面提供的当前安装命令下载、配置自托管 Runner。
配置时增加 desk-m4 等用途标签。先交互运行一个诊断任务,再按安装包说明注册为当前用户的后台服务。
使用 self-hosted、macOS、ARM64 与自定义用途标签共同定位。
安装 Runner 后,在项目或组中创建 Runner,领取认证令牌。注册时选适合该机器的执行方式;原生 macOS 构建可从 shell executor 起步。
仅接受受信任项目的作业,设置 macos-arm64 和用途标签;是否接收无标签任务应显式配置。
先用 gitlab-runner verify 验证注册,再观察第一份作业日志。
在你的 Jenkins 控制端新建固定节点,设置远端工作目录、执行器数量和标签。按该节点页面给出的方式,经 SSH 或 Agent 启动命令接入。
确认运行用户、Java 版本与命令行环境一致。第一份作业只输出工具版本,避免直接把发布流程当连通性测试。
先从单执行器开始,确认内存和磁盘峰值后再调整并发。
建议使用架构标签 macos-arm64、用途标签 ios-build,再用 desk-m4 标识这类工位。节点或版本标签只有在你确实需要调度到指定环境时才添加,避免标签越来越细,最后没有机器匹配。
name: workstation-check
on: workflow_dispatch
jobs:
check:
runs-on: [self-hosted, macOS, ARM64, desk-m4]
steps:
- name: Check toolchain
run: |
uname -m
xcodebuild -version
df -h
自托管 Runner 会执行仓库中的代码。不要让不受信任的外部提交直接访问持有签名材料的工位。将构建与发布权限分开,密钥通过 CI 的机密变量注入,并限制可访问的分支。
不要直接复制整块用户目录。先迁移一个项目,记录可复现的依赖,再切换 CI 标签。每一步都能单独验证,也能单独回退。
在本地通过 rsync 同步工作目录,排除构建产物。证书需要连同私钥导出为受密码保护的文件;描述文件单独迁移。导入并验证后,删除临时传输副本。
rsync -av \
--exclude DerivedData \
--exclude build \
-e "ssh -i ~/.ssh/minivps_workstation" \
./App/ dev@203.0.113.24:~/work/App/
验收:项目文件齐全,签名所需的证书与私钥成对存在。
本地导出 Brewfile,在远端审阅后安装。Xcode 按项目要求准备版本,使用 xcodes 选择已安装版本;再检查 Ruby、Bundler 与项目锁文件。
brew bundle dump --file=Brewfile
brew bundle --file=Brewfile
xcodes installed
xcodes select
xcodebuild -version
验收:开发工具版本与项目要求一致,依赖安装可重跑。
先保留原有流水线,增加一份手动触发的验证任务。确认能读取项目、使用签名并上传产物,再把正式任务的 runs-on 或节点标签切到新工位。
cd ~/work/App
bundle install
xcodebuild -list
bundle exec fastlane beta
验收:一次完整任务成功,产物可取回,失败日志可定位。
这是一条迁移顺序,不是固定耗时承诺。首轮依赖安装、SDK 下载和项目体积通常比 SSH 登录更耗时,建议先做不带发布动作的构建验证。
Desk M4 提供 16GB 统一内存,系统、图形界面和模型共用这部分内存。量化方式、上下文长度与并发都会影响能否运行;附加 SSD 增加存储空间,不增加内存。
使用虚拟环境安装 MLX 与推理工具,避免修改系统 Python。先验证模块能导入,再选择适配的模型和量化版本。
python3 -m venv ~/venvs/mlx
source ~/venvs/mlx/bin/activate
python -m pip install -U pip
python -m pip install mlx mlx-lm
python -c "import mlx.core as mx; print(mx.default_device())"
先小模型、短上下文、单请求;观察内存压力后再增加负载。
通过 Homebrew 安装工具后,用本地 GGUF 文件启动。示例路径需先创建并放入实际模型文件,参数以所装版本帮助信息为准。
brew install llama.cpp
llama-cli --help
llama-cli \
-m /Volumes/WorkSSD/models/model.gguf \
-p "Hello" -n 64
GGUF 文件需与你选择的模型架构和量化格式兼容。
安装后将服务绑定到本机地址,再按模型来源的说明获取权重。要从本地电脑调用时,优先使用 SSH 端口转发,不直接开放推理接口。
brew install ollama
OLLAMA_HOST=127.0.0.1:11434 \
OLLAMA_MODELS=/Volumes/WorkSSD/models/ollama \
ollama serve
模型下载与使用须符合各自许可;服务启动不代表权重已就绪。
下文约定 /Volumes/WorkSSD 是已正确挂载的附加 SSD,models 放权重,cache 放可重建缓存。这只是路径示例,不代表系统自动采用这个卷名。先确认磁盘已挂载、目录可写,再创建目录;不要在未挂载时误把大文件写到系统盘。
diskutil info /Volumes/WorkSSD
test -d /Volumes/WorkSSD && test -w /Volumes/WorkSSD
mkdir -p /Volumes/WorkSSD/models /Volumes/WorkSSD/cache
export HF_HOME=/Volumes/WorkSSD/cache/huggingface
附加项有 +1TB SSD、+2TB SSD 与 Thunderbolt 5 并联。接入后的磁盘名称、设备编号和链路信息,以你的实例实际返回为准,不照抄别人的磁盘编号。
先查看外置物理磁盘,再核对卷名、容量和可用空间。下面的命令只读取信息,不会格式化磁盘。
diskutil list external physical
ls /Volumes
df -h
diskutil info /Volumes/WorkSSD
确认挂载后再把模型、构建缓存或项目移动过去。搬迁前停止写入相关目录的构建进程,并保留一份独立备份。
不要盲目执行 eraseDisk 或抹盘命令。看不见磁盘时,带只读检查结果提交工单。
Thunderbolt 5 并联用于有明确多机通信或数据传输需求的工作流。多台仍是独立主机,各自运行系统、任务和内存空间。
system_profiler SPThunderboltDataType
networksetup -listallhardwareports
ifconfig
接口识别不等于应用已能分布式运行。需要你配置网络、传输协议及任务分工;实际互联方式与可用组合,请在下单前沟通确认。
并联不会把多台机器自动变成一台更大内存的 Mac,也不保证构建自动加速。
DerivedData、依赖下载缓存可以重新生成;源代码的未提交修改、签名私钥与实验结果不能靠缓存重建。把这两类数据分开管理,先备份不可替代的内容。续费或到期处理前,主动导出需要保留的项目、产物与配置,不把工位磁盘当成唯一备份。
这里不设置未经确认的平均回复时长或固定值班时段。响应安排以联系页与工单中的实际回复为准。提交后保留原工单补充材料,比反复创建相同问题更方便追踪。
若问题影响连接,说明 SSH 与 VNC 是否同时失败;若只影响构建,说明项目能否在交互式会话中完成同一条命令。这样可以先区分网络、认证、环境和项目四类问题。
Desk M4 是独享物理 Mac mini,非虚拟机。先确定项目要求的 Xcode 版本、周期与存储,再进入下单配置;可用性以控制台实时返回为准。
仅支持 USDT-TRC20 或 Visa / Mastercard / Amex(经 Stripe),全部以美元结算,实际可用网关以后端返回为准。