Кому: сопровождающие трансграничный iOS/macOS CI, которые фиксируют Ruby, Node, Go и Terraform на удалённом Mac через Mise (ранее rtx).

Результат: таблица Mise vs asdf, переменные MISE_* для pin, зеркала плагинов с timeout/retry, ключи кеша GitHub Actions/GitLab CI, три шага приёмки lockfile и цепочка OpenClaw preflight.

Структура: три риска, матрица WAN с concurrency и каталогами кеша, пять шагов runbook, цифры для дизайн-дока, FAQ. См. главную, блог, матрицу Rust Cargo lockfile.

Почему toolchain Mise «плывёт» на трансграничном удалённом Mac CI

  • Shims без lockfile. Джобы вызывают mise install без mise.lock.toml; tarball плагинов в разных регионах дают разные patch-level до xcodebuild.
  • Параллельные plugin pull на одном WAN. Четыре mise install плюс npm/Homebrew насыщают APFS и дают ETIMEDOUT при трансграничной загрузке.
  • Кеш CI только по .tool-versions. Restore ~/.local/share/mise с неверным ключом скрывает drift lockfile до падения Fastlane.

Mise vs asdf: таблица выбора на удалённом Mac CI

Один менеджер на пул; не держите dual shims в PATH при миграции дольше одного спринта.

КритерийMise (rtx)asdf
Lockfilemise.lock.toml + tasksтолько .tool-versions
Скорость installпараллельные backend, cache-awareпоследовательные plugin-скрипты
Каталог кеша CI~/.local/share/mise~/.asdf + plugins
Когда оставить asdfновые lanelegacy plugin без backend Mise

Pin toolchain и переменные окружения на удалённом Mac

Коммитьте mise.toml и mise.lock.toml; экспортируйте пути до compile-шагов.

export MISE_DATA_DIR="${MISE_DATA_DIR:-$HOME/.local/share/mise}"
export MISE_CACHE_DIR="${MISE_CACHE_DIR:-$HOME/.cache/mise}"
export MISE_PARALLEL_INSTALLS="${MISE_PARALLEL_INSTALLS:-2}"
export MISE_HTTP_TIMEOUT="${MISE_HTTP_TIMEOUT:-120}"
mise trust -y
mise install --check
eval "$(mise activate bash)"
Аудит: в артефакт каждой job пишите which mise, mise --version и хеш mise.lock.toml — launchd и SSH-сессии на арендованном Mac часто расходятся.

Трансграничные зеркала плагинов, timeout и retry

export MISE_PLUGIN_GIT_CLONE_DEPTH=1
export MISE_HTTP_TIMEOUT=120
export MISE_HTTP_RETRIES=4
export MISE_HTTP_RETRY_DELAY=2
export MISE_NODE_MIRROR="https://npmmirror.com/mirrors/node"

Совместите с зеркалами npm и Homebrew, если Node и Ruby на одном runner.

Ключи кеша GitHub Actions и GitLab CI для Mise

# GitHub Actions (фрагмент)
- uses: actions/cache@v4
  with:
    path: |
      ~/.local/share/mise
      ~/.cache/mise
    key: mise-${{ runner.os }}-arm64-${{ hashFiles('mise.lock.toml') }}
    restore-keys: |
      mise-${{ runner.os }}-arm64-

# GitLab CI (фрагмент)
cache:
  key: "mise-${CI_JOB_IMAGE}-${CI_COMMIT_REF_SLUG}-${MiseLockHash}"
  paths:
    - .local/share/mise/
    - .cache/mise/

Включайте darwin-arm64 и digest образа runner; не ключите только по имени ветки.

Приёмка drift lockfile: три шага до xcodebuild

  • Шаг 1 — frozen install: mise install --check должен вернуть 0 без неявных апгрейдов.
  • Шаг 2 — diff gate: git diff --exit-code mise.lock.toml относительно merge base.
  • Шаг 3 — shim audit: mise exec -- ruby -v && node -v && swift --version в summary CI.

Тот же паттерн, что в матрице Rust Cargo --locked для полиглот-репозиториев.

OpenClaw: цепочка preflight и сводка webhook при сбое

openclaw gateway status --json > gateway-status.json
openclaw doctor
openclaw config validate
MiseDrift=$?
jq -n \
  --arg drift "$MiseDrift" \
  --slurpfile gw gateway-status.json \
  '{mise_drift:($drift|tonumber), gateway:$gw[0]}' \
  > ci-preflight-summary.json

Публикуйте ci-preflight-summary.json в webhook; при ошибке приложите последние 40 строк stderr mise install. См. ворота gateway status JSON и матрицу sr.ht lockfile.

Матрица решений: Mise concurrency, каталоги кеша, timeout

Профиль WAN MISE_PARALLEL_INSTALLS MISE_HTTP_TIMEOUT (с) Каталог кеша Стратегия плагинов
RTT < 80 ms 4 60 ~/.local/share/mise на JOB_ID прямые GitHub releases
Потери 120–200 ms 2 120 ~/.cache/mise на NVMe Node mirror + retries 4
Нестабильный канал 1 180 /var/ci/mise-cache prefetch корп. proxy + bundle

Пять шагов runbook: install, кеш, validate, build на удалённом Mac CI

  • Установите Mise официальным installer; версию зафиксируйте в mise.toml.
  • Restore кеш Actions/GitLab по mise.lock.toml.
  • Экспортируйте mirror env; выполните mise install --check.
  • Пройдите три шага drift lockfile; сохраните JSON для OpenClaw.
  • Запускайте xcodebuild или Fastlane только после зелёного preflight.
mise install --check
git diff --exit-code mise.lock.toml
mise exec -- xcodebuild -scheme App \
  -destination 'platform=iOS Simulator,name=iPhone 16'

Цифры для дизайн-дока и цитирования

  • Прогретый кеш Mise: 2–8 ГБ на lane M4 NVMe; ключ — SHA-256 mise.lock.toml.
  • Plugin pull при RTT 150 ms: 30–90 с на инструмент; держите MISE_PARALLEL_INSTALLS=2 до стабильных метрик.
  • Порог APFS: прерывайте job при < 25 ГБ свободно до распаковки плагинов.

FAQ: Mise, алиас rtx и политика lockfile на удалённом Mac CI

Mise или asdf для трансграничного iOS CI в 2026?

Выбирайте Mise при mise.lock.toml и параллельных backend. asdf — только для legacy-плагинов без backend Mise.

rtx ещё актуален?

Да: rtx — legacy-имя бинарника; в новых pipeline стандартизируйте вызов mise.

Webhook красный при зелёном mise?

Проверьте JSON gateway и порт 18789; коды drift должны попадать в payload сводки OpenClaw.

Итог: арендуйте удалённый Mac CI-узел с воспроизводимыми lane Mise

Трансграничный iOS CI предсказуем, когда pin Mise, retry зеркал и ворота lockfile используют одну историю ключей кеша. Сравните узлы на главной, изучите матрицу Rust Cargo, затем арендуйте NVMe MacPull рядом с регионом зеркала. Без входа: покупка, тарифы, блог CI.

Аренда Mac Mini M4 под lane Mise и lockfile CI

Кеш mise на job, зеркала плагинов и ворота lockfile — сравните тарифы без обязательного входа.