先连上,再开始构建

从下单到第一次
xcodebuild

这是你的云端 Mac 工位操作手册。目标是用前十分钟完成领取信息、SSH 登录和环境检查;依赖下载与完整构建所需时间,取决于项目本身。

领取你的工位信息

开通后,先核对这四项

登录控制台,打开对应订单的实例详情。连接地址、账号和连接端口都以该实例显示的信息为准;不要把订单编号当成登录用户名。

工位信息示意 · 非真实凭据

Desk M4

Mac mini M4 · 16GB 内存 · 256GB SSD

公网 IP
在实例详情中查看并复制
登录用户名
使用控制台分配的用户名
初始密码
仅在私密环境查看,不贴入日志
SSH 公钥
在控制台对应入口上传公钥

你拿到的是整台独享物理机

Desk M4 是非虚拟机的云端 Mac,macOS 图形界面和命令行都可使用。先确认订单对应的节点,再确认连接信息,避免把另一台工位的地址写进脚本。

首次使用建议先走 SSH。它能快速判断地址、端口、认证是否正常;图形界面用于需要点选的系统设置和 Xcode 配置,不必作为构建任务的常驻入口。

  • 私钥留在你自己的电脑。上传的是以 ssh-ed25519 等类型开头的公钥。
  • 初始密码、私钥、签名证书密码都不要通过普通日志传递。
  • 实例还未返回连接信息时,在控制台查看订单状态,不猜测地址或用户名。
第一条连接

SSH 登录成功,再跑构建

把下方示例 IP 和用户名换成控制台中的值。203.0.113.24 是文档示例地址,不能用于连接你的工位。

  1. 01

    准备密钥

    在本地生成独立的工作密钥,并设置口令。如果你已有合适的密钥,可直接上传对应公钥,不要覆盖已有文件。

    ssh-keygen -t ed25519 -f ~/.ssh/minivps_workstation
    cat ~/.ssh/minivps_workstation.pub
  2. 02

    核验指纹

    第一次连接会显示主机密钥指纹。先与可信来源提供的指纹核对;控制台未提供时,通过工单确认。不要只因提示出现就直接接受。

    ssh -i ~/.ssh/minivps_workstation dev@203.0.113.24
  3. 03

    检查环境

    在远端运行下面的命令,确认架构、开发工具路径与版本。若项目要求不同 Xcode 版本,先完成版本对齐,再安装项目依赖。

    uname -m
    xcode-select -p
    xcodebuild -version
    sw_vers

一次完整会话,应该怎样读

以下为格式节选,不是实时执行结果。指纹值、耗时和构建日志会随实例与项目变化;成功上传还需要你已有的签名材料及有效发布凭据。

dev@desk-m4-tokyo
$ 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 outIP、SSH 端口、本地网络与防火墙换一条本地网络验证;仍失败时提交工单,附连接时间与节点。
Permission denied用户名、公钥是否上传、私钥是否选对使用 ssh -v 查看认证过程,分享日志前移除敏感信息。
Scheme not found当前项目目录、workspace 和共享 Scheme先运行 xcodebuild -list;使用 CocoaPods 的项目通常需要指定 workspace。
Signing failed证书及其私钥、描述文件、钥匙串访问权限先在交互式会话完成一次签名验证,再迁入无人值守 CI。
需要图形界面时

把远程桌面放进 SSH 隧道

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 项目。每种平台的注册参数都应从项目或管理页面领取,不要复用别人的令牌,也不要把注册令牌提交进代码仓库。

GitHub Actions

在仓库或组织的 Runner 设置中,选择 macOS 与 ARM64,按页面提供的当前安装命令下载、配置自托管 Runner。

配置时增加 desk-m4 等用途标签。先交互运行一个诊断任务,再按安装包说明注册为当前用户的后台服务。

使用 self-hosted、macOS、ARM64 与自定义用途标签共同定位。

GitLab Runner

安装 Runner 后,在项目或组中创建 Runner,领取认证令牌。注册时选适合该机器的执行方式;原生 macOS 构建可从 shell executor 起步。

仅接受受信任项目的作业,设置 macos-arm64 和用途标签;是否接收无标签任务应显式配置。

先用 gitlab-runner verify 验证注册,再观察第一份作业日志。

Jenkins Agent

在你的 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 标签。每一步都能单独验证,也能单独回退。

01 · 数据

先同步项目,再导入签名

在本地通过 rsync 同步工作目录,排除构建产物。证书需要连同私钥导出为受密码保护的文件;描述文件单独迁移。导入并验证后,删除临时传输副本。

rsync -av \
  --exclude DerivedData \
  --exclude build \
  -e "ssh -i ~/.ssh/minivps_workstation" \
  ./App/ dev@203.0.113.24:~/work/App/

验收:项目文件齐全,签名所需的证书与私钥成对存在。

02 · 工具链

用清单对齐依赖

本地导出 Brewfile,在远端审阅后安装。Xcode 按项目要求准备版本,使用 xcodes 选择已安装版本;再检查 Ruby、Bundler 与项目锁文件。

brew bundle dump --file=Brewfile
brew bundle --file=Brewfile
xcodes installed
xcodes select
xcodebuild -version

验收:开发工具版本与项目要求一致,依赖安装可重跑。

03 · CI 接入

最后再替换调度标签

先保留原有流水线,增加一份手动触发的验证任务。确认能读取项目、使用签名并上传产物,再把正式任务的 runs-on 或节点标签切到新工位。

cd ~/work/App
bundle install
xcodebuild -list
bundle exec fastlane beta

验收:一次完整任务成功,产物可取回,失败日志可定位。

这是一条迁移顺序,不是固定耗时承诺。首轮依赖安装、SDK 下载和项目体积通常比 SSH 登录更耗时,建议先做不带发布动作的构建验证。

构建之外的实验

先隔离环境,再下载模型权重

Desk M4 提供 16GB 统一内存,系统、图形界面和模型共用这部分内存。量化方式、上下文长度与并发都会影响能否运行;附加 SSD 增加存储空间,不增加内存。

MLX:独立 Python 环境

使用虚拟环境安装 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())"

先小模型、短上下文、单请求;观察内存压力后再增加负载。

llama.cpp:显式指定权重

通过 Homebrew 安装工具后,用本地 GGUF 文件启动。示例路径需先创建并放入实际模型文件,参数以所装版本帮助信息为准。

brew install llama.cpp
llama-cli --help
llama-cli \
  -m /Volumes/WorkSSD/models/model.gguf \
  -p "Hello" -n 64

GGUF 文件需与你选择的模型架构和量化格式兼容。

Ollama:先限定本机访问

安装后将服务绑定到本机地址,再按模型来源的说明获取权重。要从本地电脑调用时,优先使用 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 并联。接入后的磁盘名称、设备编号和链路信息,以你的实例实际返回为准,不照抄别人的磁盘编号。

识别附加 SSD

先查看外置物理磁盘,再核对卷名、容量和可用空间。下面的命令只读取信息,不会格式化磁盘。

diskutil list external physical
ls /Volumes
df -h
diskutil info /Volumes/WorkSSD

确认挂载后再把模型、构建缓存或项目移动过去。搬迁前停止写入相关目录的构建进程,并保留一份独立备份。

不要盲目执行 eraseDisk 或抹盘命令。看不见磁盘时,带只读检查结果提交工单。

理解多台并联的边界

Thunderbolt 5 并联用于有明确多机通信或数据传输需求的工作流。多台仍是独立主机,各自运行系统、任务和内存空间。

system_profiler SPThunderboltDataType
networksetup -listallhardwareports
ifconfig

接口识别不等于应用已能分布式运行。需要你配置网络、传输协议及任务分工;实际互联方式与可用组合,请在下单前沟通确认。

并联不会把多台机器自动变成一台更大内存的 Mac,也不保证构建自动加速。

迁移缓存时,区分可重建与不可替代

DerivedData、依赖下载缓存可以重新生成;源代码的未提交修改、签名私钥与实验结果不能靠缓存重建。把这两类数据分开管理,先备份不可替代的内容。续费或到期处理前,主动导出需要保留的项目、产物与配置,不把工位磁盘当成唯一备份。

把问题交接清楚

卡住时,带这四样来找我们

实例问题优先登录控制台提交工单,便于关联订单。无法登录、售前选型或需要补充说明时,发送邮件到 support@macminivps.com。

  • 订单号与节点:说明是哪一台工位,不发送密码或私钥。
  • 发生时间与时区:写明首次出现时间,以及是否能稳定复现。
  • 原始错误片段:保留命令、退出码和关键日志,移除令牌、证书内容及个人信息。
  • 已尝试的检查:例如更换本地网络、核对 SSH 端口,或单独运行一次构建。

关于回复时间

这里不设置未经确认的平均回复时长或固定值班时段。响应安排以联系页与工单中的实际回复为准。提交后保留原工单补充材料,比反复创建相同问题更方便追踪。

若问题影响连接,说明 SSH 与 VNC 是否同时失败;若只影响构建,说明项目能否在交互式会话中完成同一条命令。这样可以先区分网络、认证、环境和项目四类问题。

流程看明白了,
再给项目安排工位

Desk M4 是独享物理 Mac mini,非虚拟机。先确定项目要求的 Xcode 版本、周期与存储,再进入下单配置;可用性以控制台实时返回为准。

仅支持 USDT-TRC20 或 Visa / Mastercard / Amex(经 Stripe),全部以美元结算,实际可用网关以后端返回为准。