Воспроизводимый инженерный процесс

Перенесите коммиты, сборку, подпись и доставку артефактов на выделенный облачный Mac.

MiniDebug M4 — выделенная физическая машина: вычислительные ресурсы устройства не разделяются с другими заказами. Ниже реальные задачи разобраны по входным данным, шагам выполнения, результатам и типичным точкам отказа, чтобы вы могли оценить пригодность для текущих процессов iOS, CI, AI и творчества.

M4 / 16 ГБ / 256 ГБ Аренда на день, неделю, месяц или квартал 5 доступных узлов
Схема инженерного процесса с узлами облачного Mac, задачами сборки и передачей артефактов
Физический узел доступен MiniDebug M4
01
Получение коммита Фиксированный хеш коммита и файлы блокировки зависимостей
02
Выполнение сборки Логи архивации, код выхода и длительность
03
Доставка артефактов Проверка файлов и запись в журнал задачи
Автоматическая сборка iOS

От Git-коммита до артефакта, готового к архивации, каждый шаг оставляет отслеживаемый результат.

Надёжная автоматическая сборка — это не одна команда. Нужно зафиксировать версию исходного кода, состояние зависимостей, выбранный Xcode, входные данные для подписи, параметры экспорта и назначение артефактов. Любой сбой должен находиться по логам.

  1. 01 · Триггер

    Зафиксировать коммит и входные данные задачи

    Входные данные: Адрес репозитория, ветка, хеш коммита, конфигурация сборки и целевая Scheme. Webhook или задача из очереди передаёт только идентификаторы — скрипт не должен на ходу угадывать ветку.

    Точка отказа: Коммит не найден, подмодули не синхронизированы, недостаточно прав или одна задача прочитала изменившийся указатель ветки.

  2. 02 · Зависимости

    Восстановить кэш и установить зависимости

    Входные данные: Package.resolved, Podfile.lock или другие файлы блокировки. Ключ кэша как минимум должен включать хеш сводки блокировки зависимостей, версию Xcode и целевую архитектуру.

    Точка отказа: Изменение файла блокировки, несовместимость кэша с инструментами, недействительные учётные данные приватной зависимости или нехватка места на диске.

  3. 03 · Архивация

    Запустить xcodebuild archive

    Входные данные: Путь к Workspace или Project, Scheme, Configuration, Destination и путь к архиву. Сначала выведите версию инструментов, затем запускайте архивацию.

    Точка отказа: Ошибка компиляции, провал тестов, несовместимость целевой версии, загрязнённые производные данные или зависимость скрипта сборки от локального абсолютного пути.

  4. 04 · Подпись

    Передать материалы для подписи на время задачи

    Входные данные: Сертификаты, профили и необходимые переменные окружения с минимально возможным набором прав. Материалы передаются в начале задачи и удаляются после её завершения.

    Точка отказа: Несоответствие сертификата и профиля, неправильный диапазон прав, проблемы со сроком действия или ошибочное использование одного временного хранилища ключей несколькими задачами.

  5. 05 · Экспорт

    Экспортировать и проверить файлы

    Входные данные: Файл архива и конфигурация ExportOptions. После экспорта запишите имя файла, размер, хеш проверки и время создания, а не просто проверяйте наличие каталога.

    Точка отказа: Конфликт метода экспорта с настройками подписи, отсутствие прав на каталог вывода или подавленный скриптом ненулевой код выхода.

  6. 06 · Архивация

    Собрать логи и артефакты

    Результат: Артефакты сборки, файл архива, отчёт о тестах, логи сборки, хеш коммита и идентификатор задачи. Очищайте рабочий каталог только после успешной загрузки.

    Точка отказа: Прерывание загрузки, конфликт имён артефактов, чувствительные поля в логах или очистка до подтверждения результата.

Оркестрация фермы сборки

Несколько репозиториев используют общую очередь, но не общие неконтролируемые рабочие каталоги и материалы для подписи.

Суть фермы сборки не в одновременном запуске задач, а в объяснимости очереди, меток узлов, границ кэша и возврата результатов. Один MiniDebug M4 подходит для контролируемого канала выполнения; дополнительные параллельные задачи следует распределять по физическим узлам, соответствующим разным заказам.

Пример планирования очереди

Порядок распределения репозиториев, задач и узлов

1 задача = 1 рабочий каталог
mobile-app release / archive Назначить узел M4
shared-sdk main / test Дождаться завершения задачи архивации
demo-client feature / build Поставить в очередь по приоритету
  • В очередь: Сохранить репозиторий, коммит, приоритет, ожидаемый тайм-аут и необходимые метки.
  • Сопоставление:Выбрать узел выполнения по версии Xcode, состоянию узла, типу задачи и текущей загрузке.
  • Выполнение: Создать отдельный рабочий каталог, восстановить зависимости, соответствующие ключу кэша, затем передать материалы для текущей задачи.
  • Завершение:Вернуть статус, логи, артефакты и длительность; после подтверждения загрузки уничтожить временный каталог и временные учётные данные.
Границы кэша

Повторно использовать результаты загрузки, но не неизвестное состояние.

Кэш зависимостей можно использовать повторно по хешу файла блокировки, версии Xcode и архитектуре. DerivedData, временное хранилище ключей, каталог экспорта и незакоммиченные изменения нельзя напрямую использовать между репозиториями.

Сводка результатов

Разделяйте состояние очереди и результат сборки.

Ожидание, выполнение, загрузка и завершение — состояния планировщика; успешная компиляция, провал тестов и ошибка подписи — результаты задачи. Раздельная запись позволяет понять, связана проблема с ёмкостью или проектом.

Самостоятельно размещаемый Runner GitHub Actions

Сначала спроектируйте метки и стратегию очистки, затем направляйте рабочие процессы на узлы Mac.

Регистрация Runner — лишь подключение. Стабильность определяют точность меток, контролируемый параллелизм на машине, очистка после задачи и возможность связать логи сбоя с записью запуска соответствующего рабочего процесса.

Планирование меток

Метки должны описывать только стабильные возможности.

Рекомендуется сохранить системные метки и добавить поддерживаемые в долгосрочной перспективе метки возможностей, например macos и arm64, xcode-current и signing-ready. Не добавляйте в метки узла временные названия проектов или краткосрочные ветки.

runs-on:
  - self-hosted
  - macos
  - arm64
  - xcode-current
Регистрация и права

Используйте отдельную учётную запись Runner для выполнения задач.

До регистрации проверьте область действия Runner, границы доступа к репозиториям и рабочий каталог. Учётная запись должна иметь только права, необходимые для сборки, не использоваться для обычного удалённого доступа и не содержать долгосрочные учётные данные непосредственно в файлах скриптов.

  • Запишите имя Runner, узел и назначение
  • Ограничьте список репозиториев или организаций, которым разрешён его вызов
  • Проверьте права на рабочий каталог и каталог кэша
  • После регистрации выполните минимальную проверочную сборку
Очистка и параллелизм

Один канал выполнения, явная очистка между задачами.

Не запускайте одновременно две задачи с записью в один рабочий каталог. Перед началом проверьте оставшиеся процессы и свободное место на диске; после завершения удалите копии исходного кода, временные файлы экспорта, временное хранилище ключей и переменные окружения уровня проекта.

При необходимости параллелизма распределяйте разные задачи по разным физическим узлам, а не позволяйте шагам подписи, архивации и очистки перезаписывать друг друга в одном каталоге.

Передача информации об ошибках

Даже при сбое сборки загружайте диагностические материалы.

Сбор логов должен продолжаться при ошибке и как минимум возвращать вывод xcodebuild, результаты тестов, свободное место на диске, версии инструментов и идентификатор задачи. Перед загрузкой удаляйте токены, содержимое приватных ключей, пароли сертификатов и чувствительные переменные репозитория.

Разделяйте недоступность Runner, тайм-аут задачи, выход скрипта и сбой загрузки артефактов, чтобы все проблемы не отображались как «сборка завершилась ошибкой».

Поток публикации для индивидуального разработчика

Графический интерфейс используется для небольшого числа ручных подтверждений, а командная строка — для воспроизводимых сборок и архивации.

Индивидуальному разработчику обычно не нужно автоматизировать всё сразу. Надёжнее чётко определить границу между графическими операциями и задачами командной строки, чтобы исправление, проверка, архивация и подготовка артефактов перед TestFlight могли быть отменены.

Локальная среда разработки

Исправление и коммит

Выполните изменения кода, базовые тесты и коммит, отправьте фиксированную ветку и запишите условия проверки устройства и ожидаемый результат.

Результат: хеш коммита, описание изменений, охват тестами
Удалённый графический интерфейс

Ручная проверка в Xcode

Проверьте Scheme, целевую версию и настройки проекта, обработайте предупреждения, требующие визуальной оценки, и убедитесь, что конфигурация подписи соответствует текущему выпуску.

Результат: подтверждённое состояние проекта и параметры выпуска
Задача командной строки

Архивация и экспорт

Выполните скриптовую архивацию, экспорт и проверку, сохранив полный лог. При проблеме вернитесь к соответствующим входным данным, а не исправляйте вручную неизвестное состояние на неисправной машине.

Результат: файл архива, пакет экспорта, хеш проверки
Рекомендуемые правила передачи

Графический интерфейс отвечает только за настройки и проверки, требующие решения человека; архивацию, экспорт, повторный запуск и именование артефактов передайте скриптам. После каждой ручной правки фиксируйте изменение проекта или различия, чтобы следующую сборку можно было воспроизвести.

Эксперименты с AI-инференсом

Сравнивайте версии моделей на Apple Silicon, а не фиксируйте результат одного запуска.

MiniDebug M4 оснащён M4, 16 ГБ RAM и SSD 256 ГБ. Сначала проверьте соответствие модели и данных доступным ресурсам, затем записывайте загрузку, память, длительный инференс и качество вывода, не смешивая результаты с разными параметрами.

01 · Подготовка

Зафиксировать модель и среду выполнения

Запишите формат модели, версию квантования, версию среды выполнения, хеш коммита, входные образцы и случайные параметры. Идентифицируйте файлы моделей хешем проверки, чтобы одинаковые имена не скрывали разное содержимое.

Обязательно записать
Версию модели и способ квантования
Ограничения ресурсов
16 ГБ RAM / SSD 256 ГБ
02 · Бенчмарк

Разделять холодный запуск и длительный инференс

Первая загрузка включает чтение модели и инициализацию, поэтому её нельзя смешивать со стабильной фазой работы. Для каждой серии используйте одинаковые длину входа, размер пакета, число повторов и параметры сэмплирования.

Временные показатели
Время загрузки, время до первого вывода, общее время
Ресурсные показатели
Пиковое и стабильное потребление памяти
03 · Сравнение

Сравнивать скорость, память и отклонения результатов

Версии квантования следует сравнивать не только по скорости. Сохраняйте вывод для одинаковых входных данных, оценку качества, ошибочные образцы и сведения о среде, а затем экспортируйте результаты в машиночитаемом виде и итог эксперта.

Параметры сравнения
Задержка, пропускная способность, память, качество вывода
Результаты эксперимента
CSV, логи, конфигурация и выводы
benchmark-run.json
{
  "machine": "MiniDebug M4 / M4 / 16GB / 256GB",
  "model_variant": "project-defined",
  "input_set": "fixed-evaluation-set",
  "measurements": [
    "load_time",
    "first_output_time",
    "total_time",
    "peak_memory"
  ],
  "artifacts": ["result.csv", "runtime.log", "notes.md"]
}
Рабочий процесс для аудио и видео

Разделяйте синхронизацию больших файлов, удалённое редактирование и пакетный экспорт на независимые этапы.

Узким местом аудио- и видеозадач могут быть передача материалов, совместимость плагинов, удалённое изображение, ёмкость диска или параметры экспорта. Разделение этапов помогает не принять задержки соединения за вычислительную проблему хоста.

Этап A

Синхронизировать проект и материалы

Сначала создайте список материалов, указав число файлов, общий размер, структуру каталогов и хеши проверки. Синхронизируйте только прокси-файлы или исходные материалы, необходимые на текущем этапе, а затем проверьте отсутствие файлов.

Контрольная точка:Путь проекта не должен зависеть от локальной буквы диска, ссылки на медиа должны восстанавливаться, а на базовом SSD 256 ГБ должно оставаться место для кэша проекта и экспорта.

Этап B

Удалённо открыть и проверить проект

Откройте проект через графическое подключение и проверьте шрифты, плагины, ссылки на медиа, параметры сэмплирования и целевой формат вывода. При слабом соединении сначала снизьте качество и разрешение удалённого изображения, не меняя параметры экспорта проекта.

Контрольная точка:Разделяйте качество удалённого предпросмотра и итогового файла; при отсутствии плагина остановите пакетные задачи, чтобы не создавать неполные результаты.

Этап C

Выполнить пакетный экспорт

Зафиксируйте пресет экспорта, имена файлов и целевой каталог, затем выполняйте задачи по списку. Для каждой задачи сохраняйте статус выхода, длительность, размер вывода и сведения об ошибках.

Контрольная точка:Перед началом длительной задачи проверьте свободное место на диске; количество параллельных задач проверяйте постепенно с учётом памяти, чтения материалов и нагрузки кодирования.

Этап D

Принять и передать артефакты

Выборочно проверьте изображение, аудиодорожки, длительность, разрешение и заголовки файлов, затем создайте хеши проверки. После подтверждения полного получения локально удалите временные файлы в облаке.

Результат:Итоговые файлы, логи экспорта, список ошибок, хеши проверки и локальная запись о получении.

Рекомендации по выбору узла

Выбирайте между Сингапуром, Японией (Токио), Южной Кореей (Сеул), Гонконгом и востоком США с учётом маршрута данных.

Узел выбирают не только по расположению команды. Учитывайте также репозиторий кода, источники зависимостей, удалённых операторов и конечную цель поставки. Ниже приведены ориентиры, а не гарантированные сетевые характеристики: фактическое качество соединения зависит от локальной сети пользователя и межрегионального маршрута.

Рекомендации по выбору рабочего процесса для пяти узлов MiniDebug M4
Узел Предпочтительное расположение команды Расположение репозитория и зависимостей Типичное направление поставки Проверка перед заказом
Сингапур Команды и участники совместной работы в Юго-Восточной Азии Сначала тестируйте, если репозиторий, артефакты или зависимости в основном находятся в Юго-Восточной Азии Ежедневные сборки, удалённая разработка и возврат результатов для команд Юго-Восточной Азии Проверьте получение репозитория, загрузку зависимостей и удалённое графическое подключение
Япония (Токио) Команды в Японии и соседних регионах Восточной Азии Сначала тестируйте, если пути доступа к коду и зависимостям проходят преимущественно через Японию Сборка iOS, проверка подписи и удалённые операции в Xcode для японских команд Проверьте стабильность интерактивного соединения с узлом и загрузку больших файлов
Южная Корея (Сеул) Команды в Южной Корее и Северо-Восточной Азии Рассматривайте, если доступ к репозиториям и внутренним ресурсам из Южной Кореи прямее Непрерывная интеграция, самостоятельно размещаемый Runner и региональная доставка артефактов Проверьте обратное подключение Runner, получение зависимостей и загрузку логов
Гонконг Команды, работающие между Южным Китаем и Юго-Восточной Азией Сначала сравните этот вариант, если код, материалы и операторы распределены между Южным Китаем и Юго-Восточной Азией Межрегиональная совместная разработка, удалённые графические задачи и обработка материалов Отдельно протестируйте маршруты из офисной и домашней сети
Восток США Команды на востоке Северной Америки и совместные команды с Западной Европой Рассматривайте, если репозиторий, CI-панель или система поставки в основном расположены на востоке Северной Америки Очереди сборки, возврат результатов и совместные проверки в рабочем часовом поясе Северной Америки Проверьте три маршрута: к репозиторию, хранилищу артефактов и удалённому оператору
Шаблоны рабочих процессов

Начните с минимальной структуры, затем замените версии проекта, сертификаты и пути.

Ниже приведены фрагменты для построения структуры скрипта, а не готовая конфигурация для любого проекта. Перед сохранением в репозиторий проверьте Workspace, Scheme, версию Xcode, конфигурацию экспорта, материалы подписи, метки Runner и каталог артефактов с учётом типа проекта.

Shell

Структура архивации xcodebuild

archive.sh
set -euo pipefail

PROJECT_ROOT="/path/to/project"
WORKSPACE="$PROJECT_ROOT/Example.xcworkspace"
SCHEME="Example"
ARCHIVE_PATH="$PROJECT_ROOT/output/Example.xcarchive"

xcodebuild -version
xcodebuild \
  -workspace "$WORKSPACE" \
  -scheme "$SCHEME" \
  -configuration Release \
  -destination "generic/platform=iOS" \
  -archivePath "$ARCHIVE_PATH" \
  clean archive
Что изменить

Замените путь к проекту, Workspace, Scheme, Configuration, Destination и каталог архива. Скрипт должен сохранять ненулевой код выхода и до запуска проверять требуемую версию Xcode.

Fastlane

Структура сборки и записи артефактов

Fastfile
lane :build_release do
  setup_ci

  build_app(
    workspace: "Example.xcworkspace",
    scheme: "Example",
    configuration: "Release",
    output_directory: "output"
  )

  sh("shasum -a 256 output/*")
end
Что изменить

Замените Workspace, Scheme, каталог вывода и настройки экспорта для проекта. Передавайте материалы подписи через контролируемые переменные или на уровне задачи, не записывайте их непосредственно в Fastfile.

CI

Структура задачи самостоятельного Runner

build.yml
name: ios-build

on:
  workflow_dispatch:

jobs:
  archive:
    runs-on:
      - self-hosted
      - macos
      - arm64
      - xcode-current
    steps:
      - name: Checkout
        uses: actions/checkout@v4

      - name: Build
        run: ./scripts/archive.sh

      - name: Collect diagnostics
        if: always()
        run: ./scripts/collect-diagnostics.sh
Что изменить

Настройте файл по фактическим меткам Runner, политике репозитория и пути к скриптам. Зафиксируйте версии используемых действий, задайте тайм-аут задачи и обеспечьте выполнение сбора диагностики даже при сбое сборки.

Начните проверку текущего процесса

Выберите MiniDebug M4 и сначала пройдите минимальный цикл сборки.

Начните с фиксированного коммита, выполнения одной задачи, архивирования логов и проверки артефактов, затем постепенно добавляйте кэширование, передачу материалов подписи и планирование очереди. Доступна аренда на день, неделю, месяц или квартал; расчёты по заказу выполняются в долларах США.

Оплата доступна только через USDT-TRC20 и Visa / Mastercard / Amex (через Stripe); фактически доступный платёжный шлюз определяется панелью управления.