Swift 6 strict concurrency на выделенном удалённом Mac CI xcodebuild · фиксация toolchain · приёмочный чек-лист

Swift 6 и режим strict concurrency подрывают доверие к CI, если локально всё зелёное, а конвейер дёргается. Частая причина не бизнес-логика, а разные build settings, гонки DerivedData, другой destination симулятора или предупреждения без gate. Текст даёт семь болевых точек, сравнительную таблицу и шестишаговый runbook с приёмкой. Дополнительно: SwiftPM, CocoaPods и DerivedData, воспроизводимый отпечаток сборки, self-hosted runner и разделение кэша.

01

Семь типичных проблем до ревью

Диагностика конкурентности зависит от таймингов; малое расхождение окружения размазывает симптомы.

  1. 01

    На ноутбуке и в CI разная пара Swift/Xcode:без логирования swift --version и xcodebuild -version нет базы для Sendable.

  2. 02

    Строгий режим включается только перед релизом:накопленный дифф тормозит откат.

  3. 03

    Параллельные xcodebuild делят один DerivedData:инкрементальная сборка ломается, растёт число clean.

  4. 04

    Предупреждения допускаются при зелёном CI:паттерны всплывают только после повышения SWIFT_STRICT_CONCURRENCY.

  5. 05

    UI- и unit-тесты в одном job без плана акторов:нагрузка симулятора смешивается с флагами.

  6. 06

    Нет строки Runbook про xcode-select / TOOLCHAINS:ночной job легко сменить GUI-переключением Xcode.

  7. 07

    Только swift build на Linux:iOS-таргеты не получают тот же строгий набор диагностик.

Общий корень состояние компилятора не инвариантировано на входе CI; выделенный Mac фиксирует его по SSH как инфраструктуру.

02

Xcode Cloud, хостинговый runner, выделенный удалённый Mac

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

ИзмерениеXcode CloudХостинговый macOS runnerВыделенный Mac (SSH)
Pinning toolchainСледует управляемым обновлениямЗависит от тега образаxcode-select и диск контрактуются
ВоспроизводимостьВысокая при дисциплине workflowШум от общего пулаDerivedData на job изолируется
Свобода xcodebuildМогут быть ограниченияПолитика администратораСтабильны destination и пути
Частые сбоиОчереди, квотыПропажи зависимостей на чистых образахСон, переполнение диска
Профиль командСтандарт у App StoreМного коротких smokeMonorepo со строгими gate

Strict concurrency в CI это ещё и физика кэша компилятора.

См. также SLA аренды и биллинг.

03

Шестишаговый runbook

  1. 01

    Заморозить профиль Xcode, заархивировать xcode-select -p.

  2. 02

    Всегда печатать версии SDK и компилятора.

  3. 03

    Выровнять SWIFT_STRICT_CONCURRENCY, этапы миграции в тикете.

  4. 04

    Зафиксировать scheme, destination, -derivedDataPath, при SPM отделить -clonedSourcePackagesDirPath.

  5. 05

    Развести уровни тестов и лимиты параллелизма по контракту.

  6. 06

    Подписать чек-лист приёмки с фрагментами логов.

bash · фрагмент CI
#!/usr/bin/env bash
set -euo pipefail
xcodebuild -version
xcodebuild -showsdks
swift --version
export DERIVED_DATA="$(pwd)/.derivedData/$CI_JOB_ID"
xcodebuild -scheme "App" \
  -destination 'platform=iOS Simulator,name=iPhone 16' \
  -derivedDataPath "$DERIVED_DATA" \
  build
tips_and_updates

Совет:держите сторонние модули в targeted/minimal, пока не готов путь обновления.

Не смешивайте ночную автоматизацию и интерактив на одной учётной записи.

04

Интерпретация strict concurrency в настройках

Публикуйте матрицу таргетов; первичны release notes Apple и Swift.

policy

Оговорка:статья про эксплуатацию, не про нормативное определение режимов компилятора.

Предупреждения гонок данных зависят от загрузки симулятора; разносите perf и функциональные логи.

05

Чек-лист приёмки и вывод

  • Доказательство компилятора:артефакты с версиями.
  • Уровень строгости:каждый target описан.
  • Изоляция кэша:уникальный derivedData на job.
  • Чистое воспроизведение:тот же лог после provision.

Общие runner плохо одновременно борются с дрейфом toolchain и дисковым contention; строгие ворота Swift 6 выглядят как флейки. NodeMini аренда выделенных Mac Mini в облаке подходит командам, где SSH, диск и параллелизм закреплены как услуга. Цены: Mac Mini цены аренды, подключение и приёмка: центр помощи Cloud Mac.

После запуска агрегируйте нарушения strict mode еженедельно и связывайте с roadmap зависимостей.

FAQ

Вопросы

Стабильнее версия компилятора и расположение кэша. См. цены аренды.

scheme, destination, derivedDataPath и единый уровень strict в settings. Центр помощи.

Номер сборки Xcode, xcode-select, опц. TOOLCHAINS, bootstrap-команды CI. Тарифы: цены.