← Вернуться к дневнику

2026: удалённый Mac и собственный GitHub Actions Runner для OpenClaw CI — Webhook только на чтение, пулы меток macOS и параллелизм M4 (рабочие процессы Lobster + FAQ)

Ноутбук с кодом и терминалом — метафора удалённого Mac и self-hosted Runner для OpenClaw CI
Главная линия: удалённый Mac → self-hosted Runner → OpenClaw macos-node / macos-swift. Установка Gateway и сравнение шести регионов здесь не разбираются.

Если вы сопровождаете форк или плагин OpenClaw, в 2026 году обычно идут два параллельных трека: upstream OpenClaw CI ждёт настоящий macOS для macos-node, macos-swift и checks-node-compat-node22; при этом минуты и очереди хостинговых macOS runner GitHub растут. Эта статья только про self-hosted GitHub Actions macOS runner на выделенном удалённом Mac, привязку пулов меток macOS к этим lane и Webhook только на чтение + многошаговые рабочие процессы Lobster для triage сбоев — не про установку Gateway на порту 18789 и не про шесть регионов (см. статью про регионы и TCO Runner). Тарифы: цены; оформление восток/запад США: восток США, запад США; эксплуатация Runner: раздел помощи.

1) Хостинговые macOS runner против self-hosted на удалённом Mac: таблица решений для OpenClaw CI

По документации OpenClaw CI job macos-node гоняет TypeScript-тесты при изменениях macOS-исходников; macos-swift — lint/build/test Swift; ручной workflow_dispatch обходит умный scope и запускает полный граф (включая совместимость Node 22). Upstream по умолчанию садится на Blacksmith-класс macos-latest — для основного репозитория нормально, но мейнтейнерам форка без доступа к этой очереди нужны свои метки macOS.

Хостинговый macOS подходит для редких PR; self-hosted на удалённом M4 меняет фиксированную аренду на постоянные node_modules и DerivedData — удобнее для ежедневного main, шардов контрактов плагинов и локально эквивалентного pnpm check на своём железе. Мультирегион и посуточная–помесячная TCO — в отдельной статье про Runner и TCO; здесь только подключение lane OpenClaw. Долгоживущий Gateway/агент — в полевом руководстве по OpenClaw на удалённом Mac (одна строка: Gateway — чат и инструменты; runner CI — сборка и тесты).

Путь Соответствие OpenClaw CI Основная стоимость
GitHub-hosted macos-latest Нулевая эксплуатация для upstream workflow; форк может не делить очередь и кэш. Поминутная оплата; «холодный» macos-swift; пики очереди.
Self-hosted на удалённом Mac Метки → macos-node / macos-swift; закрепить Node 22 и store pnpm. Обновления runner, диск, mutex параллелизма.
Только Linux hosted, без macOS lane Ок для docs/чистого Node; не заменяет Swift/macOS тесты. Всё равно нужен ручной или по расписанию полный macOS dispatch перед merge.
Подсказка: если вы запускаете workflow_dispatch с полным CI хотя бы раз в неделю или macos-node в очереди форка дольше ~15 минут — заложите одну машину с openclaw-macos-node раньше, чем наращивать hosted-минуты. Командам плагинов один слот M4 часто окупается за ~90 дней при регулярном dispatch — зависит от размера workflow; это не обещание SLA.

Ещё признак готовности к self-hosted: job preflight форка постоянно планирует macOS lane при каждом касании плагина, а hosted runner сбрасывает кэш между job — TypeScript и Swift тратят время на загрузки, а не на тесты. Удалённый Mac с тёплым store pnpm и DerivedData часто сокращает wall-clock даже при схожем CPU — измерьте на своём репозитории.

2) Чеклист окружения: Xcode CLT, Node 22, изоляция пользователя CI

Большинство Node-шардов OpenClaw идут на Linux, но macos-node и checks-node-compat-node22 требуют Node 22 (см. CI docs и локальный pnpm check). На хосте runner:

  • Xcode Command Line Tools плюс зафиксированный минор Xcode команды; для Swift lane нужен полный Xcode, не только CLT.
  • Node 22.x через fnm или mise в shell пользователя CI; в workflow всё равно используйте actions/setup-node.
  • pnpm в соответствии с upstream packageManager; кэш в домашнем каталоге CI, не в личной учётке разработчика.
  • Отдельный Unix-пользователь (например runner) для actions-runner — не тот же, что браузер и секреты чата.
  • Лимиты ресурсов: следите за memory_pressure; второй job на 24 ГБ — только после замеров.
Чеклист перед стартом (можно распечатать):
  1. xcode-select -p и xcodebuild -version совпадают с вашей документацией.
  2. node -v — v22.x; pnpm -v соответствует политике lockfile.
  3. Runner переживает выход из SSH через launchd.
  4. Свободный диск > 25% (DerivedData + store pnpm растут быстро).
  5. Разделите PAT: секреты webhook/рассуждения и сертификаты подписи — в разных GitHub Secrets.

Официальные API: Apple Developer Documentation; политика Node: nodejs.org.

3) Регистрация runner и пул меток macOS (HowTo)

Следуйте руководству GitHub по self-hosted runner. Для форка OpenClaw привяжите upstream job к явным меткам — не к одному размытому self-hosted.

Регистрация и метки (repo runner)
# в ~/actions-runner
./config.sh --url https://github.com/YOUR_ORG/YOUR_FORK \
  --token YOUR_REGISTRATION_TOKEN \
  --labels self-hosted,macOS,ARM64,openclaw-macos-node,openclaw-m4-16 \
  --name nuv-openclaw-macos-node-01

sudo ./svc.sh install
sudo ./svc.sh start

Пул меток (по lane):

  • openclaw-macos-node — upstream macos-node (TypeScript/Vitest macOS-пути).
  • openclaw-macos-swiftmacos-swift; тяжелее по CPU/RAM — на 16 ГБ не параллельте с node по умолчанию.
  • openclaw-node22 — опционально для dispatch compat или локального smoke pnpm check.
  • openclaw-m4-16 / openclaw-m4-24 — аппаратный уровень для матриц и планирования ёмкости.
Workflow форка: macos-node на ваш пул
jobs:
  macos-node:
    runs-on: [self-hosted, macOS, openclaw-macos-node]
    steps:
      - uses: actions/checkout@v4
      - uses: actions/setup-node@v4
        with:
          node-version: '22'
          cache: 'pnpm'
      - run: pnpm install --frozen-lockfile
      - run: pnpm test --filter macos-relevant

Для codesign/notarization добавьте concurrency: { group: codesign-macos, cancel-in-progress: false }, чтобы два job не разблокировали keychain одновременно. Заметки по SSH/Runner: раздел помощи.

Org vs repo: одиночный форк — repo-level runner с метками выше. Несколько плагинов в одной billing group — organization runner с ограничением доступа к форкам; runner groups (где доступны) не отдавайте Swift-lane экспериментальным репозиториям.

Обновления: закрепите версию приложения runner в runbook; после релиза GitHub остановите job (./svc.sh stop), обновите бинарники, перезапустите и убедитесь, что машина в Idle, прежде чем снова включать auto-assignment. Устаревшие runner — частая причина «локально ок, в CI падает» при смене протокола сервиса.

4) Подключение OpenClaw CI / dispatch и Webhook только на чтение

Оставьте upstream preflight на push/PR; меняйте только macOS runs-on на свой пул. Для полной проверки используйте поддерживаемый ручной dispatch (из CI docs):

Запуск полного графа CI (включая macOS)
gh workflow run ci.yml --ref main
gh workflow run ci.yml --ref main -f target_ref=your-branch -f include_android=true

Рассуждение через Webhook только на чтение (по фазам): для triage сбоев сначала подпишитесь на события только на чтениеworkflow_run.completed, check_run.completed, workflow_job.completed — и сохраняйте метаданные (репозиторий, ветка, conclusion, URL). На фазе 0 не запрашивайте запись Contents и auto-merge. После проверки подписи пусть агенты забирают URL логов или scope чтения Actions API; расширяйте до комментариев/меток только с политикой одобрения.

Фаза Webhook / права Назначение
Фаза 0 Только чтение + workflow_run / check_run Алерты сбоев, наблюдение очереди, вход для Lobster triage.
Фаза 1 PAT на чтение логов Actions Срезы логов упавших job; привязка к шардам macos-node.
Фаза 2 Контролируемая запись (комментарий issue, label) Авто ci-failure, упоминание дежурного — нужны review gates.
vs Gateway: Gateway обслуживает инструменты агента и локальные hooks; CI webhook потребляет только события GitHub. В продакшене не трактуйте заголовки PR или тела комментариев как shell-команды — triage только по метаданным (минимальная пересылка в духе ClawSweeper).

При настройке приёмника логируйте только стабильные поля: workflow_run.id, head_branch, conclusion и HTML URL run. Ошибки проверки HMAC храните отдельно от auth failures — так on-call отличит неверный секрет от replay. Для Lobster передавайте эти поля как JSON в stdin — не вставляйте полные тела webhook в промпты чата, где злонамеренный заголовок PR может повлиять на выбор инструментов.

5) Шпаргалка по параллелизму M4 16 ГБ / 24 ГБ (одна машина, пул меток)

Практические ориентиры для macOS lane OpenClaw (не SLA; сильно зависит от репозитория). Дополнительные слоты и регионы — в статье про TCO; таблицы шести регионов здесь нет.

Уровень Рекомендуемый параллелизм Метки Риски
M4 16 ГБ macos-node или 1× лёгкий Swift — не оба сразу. openclaw-macos-node, openclaw-m4-16 OOM Vitest; DerivedData против store pnpm на диске.
M4 24 ГБ macos-node + 1× Swift check вне пика; или сдвинутые 2× node shard. openclaw-m4-24; Swift на отдельном имени runner. Параллельная компиляция Swift всё ещё давит память — используйте группы concurrency.
Две машины Одна node, одна swift — маршрутизация по метке, не смешивать на одном runner. Выделенный openclaw-macos-swift Кэши не общие — прогревайте зависимости на каждом хосте.

У Nuvcloud несколько узлов M4 bare metal с апгрейдом RAM/SSD — удобно для фиксированных слотов CI. Наличие и цена: тарифы и страницы заказа; мы не обещаем SLA очереди в этой статье.

При выборе SSD заложите три кривые роста: Xcode DerivedData, store pnpm и рабочие каталоги GitHub Actions под _work/. Базовый 256 ГБ может хватить для однолane node-форка при еженедельной очистке deriveddata; Swift-тяжёлые форки — 512 ГБ или дополнение 1 ТБ из мастера цен. Давление памяти на 16 ГБ часто проявляется убитыми дочерними node в Vitest — при jetsam в Console переносите Swift на хост 24 ГБ вместо дробления тестов.

6) Рабочий процесс Lobster: воспроизводимый triage логов сбоев CI

Lobster сворачивает многошаговые цепочки инструментов в один детерминированный вызов с точками одобрения и resumeToken — удобно для «CI красный → забрать логи → классифицировать → OK человека → опубликовать сводку» вместо свободного вызова инструментов LLM. Включите alsoAllow: ["lobster"] в конфиге агента, затем запустите pipeline.

Lobster: сводка упавшего job (пример JSON pipeline)
{
  "action": "run",
  "pipeline": "exec --json --shell 'gh run list --workflow ci.yml --limit 5 --json databaseId,conclusion,headBranch' | exec --stdin json --shell 'gh run view $ID --log-failed' | exec --stdin json --shell 'node scripts/ci-triage-summarize.mjs' | approve --preview-from-stdin --limit 3 --prompt 'Опубликовать сводку в канал дежурных?'",
  "timeoutMs": 120000,
  "maxStdoutBytes": 512000
}

Разбейте шаги в файле workflow .lobster: collectclassifyapprovalnotify (см. Lobster «workflow files»). При статусе needs_approval продолжите:

Продолжение после одобрения
{
  "action": "resume",
  "token": "<resumeToken>",
  "approve": true
}

Привычки воспроизводимого triage: в wiki команды фиксируйте run_id, метку-триггер (например openclaw-macos-node) и хэш первого блока stderr. Перед публикацией в issue вычищайте JSON Lobster — в срезах логов иногда проскакивают секреты. При timeout увеличьте timeoutMs или разделите «забрать логи» и «суммаризацию LLM». Храните архив только на чтение 7 дней на каждый упавший run — так отделите flaky от регрессии.

Часто держат два pipeline: быстрый Lobster только классифицирует тип сбоя (Node vs Swift vs инфра), медленный тянет полные логи после одобрения человека. Это повторяет философию CI OpenClaw — дешёвый preflight, тяжёлые lane по необходимости — и не сжигает токены на зелёных run.

Если в CI уже есть gh, тот же scope PAT на хосте runner подходит для Lobster: на фазе 0 ограничьте actions:read и metadata:read. Ротируйте PAT при уходе сотрудников; не используйте токен регистрации runner как API-учётные данные.

7) FAQ

В1: Runner в статусе Offline?
Проверьте launchd, срок токена, заполненность диска. Удалите в GitHub → Settings → Actions → Runners и снова config.sh; см. документацию self-hosted runner.

В2: macos-node ругается на Node?
Выровняйте Node 22 на хосте, setup-node и checks-node-compat-node22; при необходимости очистите устаревший глобальный npm cache.

В3: Swift / SDK не найден?
Установите полный Xcode, выполните sudo xcodebuild -license accept; не гоняйте macos-swift на хосте только с CLT.

В4: Webhook только на чтение застрял на 403?
Проверьте секрет, TLS, путь reverse-proxy, права событий App; шлюз не должен выполнять текст тела PR как команды.

В5: openclaw doctor против красного CI?
doctor — здоровье установки/gateway; сбои CI — в логах Actions. Используйте Lobster + gh run view, а не onboard docs, для отладки workflow.

В6: Можно ли обойтись только Linux без macOS?
Да для чистых Node/doc PR, но перед merge macOS/Swift изменений запустите хотя бы один полный граф workflow_dispatch, иначе разойдётесь с замыслом upstream preflight.

В7: Один runner на upstream и форк?
Не рекомендуется — разделите группы runner и Secrets, чтобы недоверенные скрипты форка не дошли до материалов подписи upstream.

В8: Lobster invalid JSON?
stdout каждого шага pipeline должен быть JSON; поднимите maxStdoutBytes; не подавайте человекочитаемые логи в следующий шаг без --json.

В9: Смешать hosted и self-hosted?
Да — например PR на hosted, main macos-swift на self-hosted через if: или отдельные workflow.

Другие материалы: индекс техблога. Региональный биллинг и параллельные слоты — в руководстве по macOS Runner, регионам и TCO.

Облачный Mac mini: стабильнее пулы OpenClaw CI

Размещение macos-node / macos-swift на выделенном удалённом M4 даёт предсказуемую вычислительную мощность и эластичность пула меток: bare-metal Mac mini Nuvcloud — нативный Unix, низкое энергопотребление в режиме 24/7 для runner, опционально 24 ГБ RAM или больший SSD, или вторая машина под Swift — вместе с Webhook только на чтение и triage Lobster вы реже смотрите на hosted-очереди.

Планируете пул CI для форка OpenClaw? Начните с одного M4 с меткой openclaw-macos-nodeсмотреть тарифы и регионы, затем зарегистрируйте runner и webhook по чеклисту выше.

АКЦИЯ Тарифы