Матрица решений · iOS около 11 минут чтения

2026 общий удалённый Mac: Fastlane Match, разделы связки ключей и параметры очереди Codesign

M

Опубликовано 19 мая 2026

Команда Meshmac

iOS Tech Lead с командой от двух до восьми инженеров на одном общем удалённом Mac теряет релизы, когда параллельные pull Fastlane Match ломают git с сертификатами, а подпись попадает не в тот раздел login keychain. Ниже — матрица решений, таблица flock и очереди, пять шагов внедрения и FAQ с опорными таймаутами до следующего archive на MeshMac.

Начните с главной, сравните доступ через матрицу SSH против VNC и выровняйте учётки по FAQ изоляции прав на сборочной машине — до первого match development на пуле.

Почему один общий Mac ломает Match и Codesign

  1. Конкуренция git. Два lane одновременно пушат в encrypted repo и получают битый commit посередине match appstore.
  2. Утечка keychain. Distribution-сертификат импортируется в GUI login, а ночной SSH-job ищет identity в lane-файле.
  3. Безымянная очередь. flock -w больше таймаута CI, job умирает, а замок остаётся на мёртвом PID — никто не логирует держателя.

Матрица: lane keychain против общего login

Критерий Match + lane keychain Только login keychain
Параллельный pull Shallow fetch + read-lock; записи сериализованы Гонка push; случайная потеря cert
Очередь Codesign Один archive на хост; CI lane в очереди Параллельные archive борются за USB auth
MeshMac 2–8 мест Рекомендуется для пула M4 Только lab single-tenant

Match git: параллельный доступ и shallow-стратегия

Репозиторий сертификатов — production-данные. Чтения могут пересекаться; записи — нет. На общем удалённом Mac зафиксируйте ветку MATCH_GIT_BRANCH и запретите match nuke без тикета change control.

  • Shallow: git clone --depth 1; перед Match — git fetch --depth 1 origin $BRANCH.
  • Параллельное чтение: несколько match readonly или fetch development, пока нет write-lock.
  • Сериализация записи: match development, match appstore, смена пароля — под одним match-repo.lock.
MATCH_GIT_URL=git@github.com:org/certificates.git
export GIT_SSH_COMMAND="ssh -o ControlMaster=auto -o ControlPath=/tmp/ssh-%r@%h:%p"
flock -w 180 /var/run/meshmac/match-repo.lock \
  fastlane match development --readonly false

Разделы login keychain для headless-подписи

Изоляция SSH-пользователя не заменяет раздел связки ключей. Сверьтесь с матрицей золотого образа и дрейфа Xcode, если на том же хосте несколько версий CLI.

  • Lane-файл: /srv/keychains/team-a-ci.keychain-db на приложение или арендатора.
  • Окно unlock: security unlock-keychain только внутри обёртки очереди Codesign.
  • Match env: MATCH_KEYCHAIN_NAME и пароль в lane, не в общем login.
security list-keychains -s "$LANE_KEYCHAIN" login.keychain-db
security set-keychain-settings -lut 21600 "$LANE_KEYCHAIN"
security find-identity -v -p codesigning "$LANE_KEYCHAIN"

Замки сборки, flock и таймауты очереди Codesign

Скопируйте пороги в runbook, затем подстройте по p95 lock_wait_ms на реальных archive.

Ресурс flock / очередь Таймаут job
Запись Match git flock -w 180 match-repo.lock 15 мин на шаг lane
Codesign / archive flock -w 600 codesign.queue 45–90 мин archive
DerivedData sync flock -w 60 dd-sync.lock 35–60 мин integration
Глубина очереди max 12 jobs / lane fail-fast при диске < 15% free

Сбои, ретраи и поля аудита

Ретрай без аудита воспроизводит ту же порчу cert. Логируйте, кто держал замок.

  • Ретраи: не более двух на transient git fetch; ноль ретраев при ошибке unlock keychain.
  • JSON аудита: lane, match_git_sha, keychain_path, lock_wait_ms.
  • Алерт: страница, если p95 ожидания замка > 120 с на трёх archive подряд — см. матрицу Jira automation и build lock.

Пять шагов rollout на MeshMac

  1. Заморозить записи. Дождаться archive; запретить match nuke на общем хосте.
  2. Shallow clone. Закрепить ветку; создать /var/run/meshmac/match-repo.lock.
  3. Lane keychain. Создать файлы связки; один раз импортировать distribution на lane.
  4. Очереди. Обернуть archive в flock на codesign.queue; выставить таймауты из таблицы.
  5. Аудит. Отправить JSON в чат; один учебный сбой unlock до открытия пула.

Параметры для архитектурных заметок

  • Параллельные чтения Match со shallow fetch сокращают cold-start git на общем M4 без расширения write-гонок.
  • Lane keychain держит distribution вне GUI-сессии, описанной в FAQ прав на сборочной машине.
  • flock -w 600 на Codesign — разумный дефолт при archive 45–90 мин и двух lane на одном сборщике.
  • ControlMaster SSH к git снижает handshake при частых параллельных pull с одного IP арендованного Mac.

FAQ

Два разработчика запускают match development одновременно?
Только при shallow fetch, read concurrency и сериализованных записях. Параллельный nuke или смена пароля запрещены.
CI должен разблокировать login.keychain?
Нет. Отдельный lane-файл внутри обёртки Codesign; GUI-подпись — отдельная учётка по гайду SSH/VNC.
Когда добавлять второй узел MeshMac?
Когда p95 ожидания замка > 2 мин после настройки или нужен параллельный archive. Делите lane Match по узлам, а не бесконечно увеличивайте flock.

Итог

Сериализуйте записи Match, разделите keychain, опубликуйте таймауты очереди Codesign. Мультиузел MeshMac даёт отдельный Apple Silicon на lane, когда очередь насыщается — см. балансировку и failover. Сравните тарифы и SSH против VNC до миграции сертификатов.

Узел Mac, Match и мультиузел

Арендуйте общий удалённый Mac с SSH для Fastlane Match, затем откройте SSH против VNC или FAQ прав на сборке. Главная, тарифы и справка SSH/VNC — до фиксации параметров очереди.

Тарифы Match / Codesign