2026 общий удалённый Mac: Fastlane Match, разделы связки ключей и параметры очереди Codesign
Опубликовано 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
- Конкуренция git. Два lane одновременно пушат в encrypted repo и получают битый commit посередине
match appstore. - Утечка keychain. Distribution-сертификат импортируется в GUI login, а ночной SSH-job ищет identity в lane-файле.
- Безымянная очередь.
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
- Заморозить записи. Дождаться archive; запретить
match nukeна общем хосте. - Shallow clone. Закрепить ветку; создать
/var/run/meshmac/match-repo.lock. - Lane keychain. Создать файлы связки; один раз импортировать distribution на lane.
- Очереди. Обернуть archive в
flockна codesign.queue; выставить таймауты из таблицы. - Аудит. Отправить 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 — до фиксации параметров очереди.