В macOS CI сборка проходит, но этап codesign завершается ошибкой, когда проект или артефакт находится в каталоге облачной синхронизации.

Состояние на 1 ноября 2026 года: если сбой возник на macOS 14 или новее и сборка действительно выполняется внутри такого каталога, исправление Swift 6.4.2 стоит проверить в изолированном CI; сначала подтвердите активный toolchain и путь продукта, затем сравните результат на том же коммите. Одного номера версии недостаточно, чтобы объявить проблему устранённой.

Кому пригодится: инженерам, сопровождающим CI для Swift Package и проектов платформ Apple, — чтобы сопоставить свой сбой с областью исправления.
Инженерам DevOps — чтобы сверить toolchain, рабочие пути и результат подписи.
Ответственным за выпуск — чтобы выбрать пилот, поэтапное обновление или временный перенос сборки.

01

Проверка соответствия исправлению

В объявлении о выпуске Swift 6.4.2 указано исправление сбоев codesign при сборке внутри каталога, синхронизируемого с облаком, на macOS 14 и более поздних версиях. Это конкретное описание условия, а не обещание, что патч исправляет любые сбои подписания. Официальное объявление Swift 6.4.2

Поэтому сначала нужно установить, совпадают ли наблюдаемые условия с указанными:

  • Где именно возникает ошибка: при компиляции, на этапе подписания или при последующей проверке уже собранного приложения?
  • Какая версия macOS запущена на узле CI?
  • Выполнялась ли команда сборки из каталога облачной синхронизации или только исходный код размещён там?
  • Какой именно объект передан в codesign: приложение, вложенный исполняемый файл, фреймворк или другой артефакт?

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

Какие сбои подписи охватывает Swift 6.4.2? Официальная формулировка относится к сбоям codesign при сборке внутри каталога облачной синхронизации на macOS 14 и новее. Она не устанавливает причину для ошибок сертификата, отсутствующего ключа в Keychain, некорректных entitlements, повреждённых вложенных компонентов или изменений продукта после подписания. Последние причины нужно проверять отдельно, если факты не совпадают с заявленным условием.

02

Сверка фактически запущенного toolchain

Swift 6.4.2 выпущен 30 октября 2026 года; объявление также сообщает, что этот toolchain включён в Xcode 27.2. Apple опубликовала выпуск Xcode 27.2 29 октября 2026 года. Это подтверждает версии и связь между выпуском Xcode и Swift, но не доказывает, что конкретная задача CI использует именно их. Объявление Swift 6.4.2 · страница выпуска Xcode 27.2

Включает ли Xcode 27.2 Swift 6.4.2? Да, такое соответствие указано в официальном объявлении Swift. Но в CI могут одновременно находиться несколько версий Xcode, отдельный Swift toolchain и Command Line Tools. Следовательно, записывать только номер установленного Xcode недостаточно.

Перед повторным запуском сохраните из того же шага CI данные об активной среде:

sw_vers
xcodebuild -version
xcode-select -p
xcrun swift --version
swift --version

Интерпретируйте вывод как набор разных наблюдений. xcodebuild -version сообщает версию Xcode, выбранный путь xcode-select -p показывает активный каталог разработчика, а xcrun swift --version проверяет Swift, доступный через выбранное окружение Xcode. Отдельный вызов swift --version помогает обнаружить ситуацию, когда команда находится в PATH и указывает не на тот toolchain, который использует xcodebuild.

Apple отдельно рекомендует проверять версию установленных Command Line Tools и удостоверяться, что она соответствует требуемой. Для сборки настраиваемым Swift toolchain документация Swift описывает отдельное указание toolchain для xcrun и xcodebuild. Поэтому полезно записывать и источник инструмента, и активный выбор командной строки, а не сводить оба факта к одной строке версии. Проверка Command Line Tools · использование установленного Swift toolchain в macOS

Как убедиться, что CI действительно запустил Swift 6.4.2? Сохраните вывод команд вместе с логом конкретной задачи и проверьте, что версия в строке xcrun swift --version соответствует ожидаемой. Затем посмотрите, каким способом запускается сборка: прямым вызовом swift, через xcodebuild или через обёртку, которая задаёт собственные DEVELOPER_DIR, TOOLCHAINS либо PATH. Если в проекте применяется явно установленный toolchain, фиксируйте его выбор отдельно; идентификатор Xcode сам по себе не устанавливает, что терминальная команда использовала его встроенный Swift.

03

Сопоставление фактических путей

Для проверки недостаточно указать в отчёте «репозиторий находится в синхронизируемой папке». Нужно зафиксировать путь, из которого запускается задача, и места, где появляются промежуточные и конечные файлы. В одном workflow исходники могут находиться в такой папке, а Derived Data и архив — в ином месте; в другом сценарии путь приложения или временного продукта также проходит через область синхронизации.

Выведите ключевые значения непосредственно перед сборкой:

printf 'PWD=%s\n' "$PWD"
printf 'HOME=%s\n' "$HOME"
printf 'DERIVED_DATA=%s\n' "$DERIVED_DATA"
printf 'ARCHIVE_PATH=%s\n' "$ARCHIVE_PATH"

pwd -P

Если переменные проекта называются иначе, используйте реальные имена из CI-конфигурации. Важно записать разрешённый физический путь через pwd -P, а не только строку с возможными символическими ссылками. Для диагностики дополнительно сохраните полный вызов xcodebuild или swift build, включая параметры, которыми задаются каталоги продуктов.

Сравнение должно отвечать на вопрос о влиянии каталога, а не одновременно менять все части окружения. Подготовьте два запуска: один с рабочей областью внутри каталога облачной синхронизации, другой — в локальном каталоге вне него. Оставьте одинаковыми коммит, конфигурацию сборки, параметры подписания, профиль provisioning и доступные signing identity. Не меняйте одновременно Xcode, сертификаты и рабочий путь: при таком наборе изменений успешный запуск не позволит выделить причину.

Путь архива и путь конечного .app тоже записывайте отдельно. Успешная компиляция во временном Derived Data не доказывает, что подпись прошла над тем же объектом, который затем архивируется и публикуется. В CI полезно вывести абсолютные пути продукта до запуска проверки подписи и повторить запись после упаковки, если workflow копирует или перемещает продукт.

04

Проверка результата подписи

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

Для проверки уже подписанного приложения можно выполнить:

codesign --verify --deep --strict --verbose=2 "/путь/к/Приложение.app"

При необходимости зафиксируйте сведения о подписи и доступных идентификаторах:

codesign -d -vv "/путь/к/Приложение.app"
security find-identity -p codesigning -v

Эти команды отвечают на разные вопросы: первая проверяет подпись продукта, вторая показывает сведения о подписанном объекте, а третья помогает установить, доступна ли ожидаемая identity на узле. Документация Apple описывает проверку подписи через codesign и отдельно предупреждает, что --deep предназначен для проверки вложенного кода, а не как универсальный способ подписать сложный продукт. Не стоит добавлять --deep --force как автоматическое «исправление»: это изменяет процесс подписания и может замаскировать исходную причину. Техническая заметка Apple о проверке подписи macOS · инструкция Apple по подписанию кода для распространения macOS-приложений

К каждому запуску прикрепите один и тот же набор идентификаторов: commit SHA, конфигурацию CI, версию macOS, версии Xcode и Swift, активный путь разработчика, каталог сборки, путь архива и результат codesign. Если ошибка остаётся, запишите точную команду и полный вывод, включая строку, на которой завершается операция. Это существенно информативнее, чем сводное сообщение «подпись не удалась».

Что проверить, если после обновления кодовая подпись всё ещё падает? В первую очередь сопоставьте фактически запущенный Swift с ожидаемым, затем проверьте, находится ли сам путь сборки и конечный продукт в синхронизируемом каталоге. Если эти условия совпадают, но результат не изменился, изучите этап и текст ошибки, наличие нужной identity, подпись вложенных компонентов и любые действия, которые изменяют приложение после подписания. Не считайте отсутствие исправления доказательством того, что версия не загружена: сначала установите факты по логам среды.

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

05

Чек-лист приемки и выбор действия

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

  • [ ] Сохранён точный текст ошибки и указано, на каком этапе она возникла.
  • [ ] Записана версия macOS; для проверки заявленного диапазона подтверждено, что система относится к macOS 14 или более новой версии.
  • [ ] Зафиксированы xcodebuild -version, xcode-select -p, xcrun swift --version и swift --version.
  • [ ] Отмечено, используется ли встроенный в Xcode Swift или отдельно установленный toolchain.
  • [ ] Сохранены физические пути рабочего каталога, Derived Data, архива и продукта, передаваемого на подпись.
  • [ ] Проведены сопоставимые запуски в синхронизируемом и локальном каталоге на одном коммите и при одинаковых параметрах подписания.
  • [ ] Результаты компиляции, codesign и проверки готового продукта записаны раздельно.
  • [ ] CI-логи и артефакты связаны с тем же commit SHA, чтобы результат можно было воспроизвести.

Решение о распространении патча зависит от результатов этой проверки:

  • Продолжить изолированные испытания, если совпадает заявленная среда, команда использует ожидаемый Swift, а сравнимого результата пока недостаточно.
  • Запустить поэтапный rollout, если несколько повторных запусков одного сценария показывают ожидаемый результат и проверка конечного продукта проходит при сохранении обычной схемы подписи.
  • Перенести рабочую область или продукт, если результат устойчиво различается между синхронизируемым и локальным путём. Такой обходной путь может быть разумным до завершения расследования, но сам по себе не подтверждает, что причина установлена.
  • Оставить прежнюю среду и продолжить диагностику, если версия Swift или фактический путь не подтверждены, либо сбой относится к сертификату, вложенному коду или другой операции подписи.
  • Не объявлять стабильность по одному успеху: единичный прогон подтверждает только конкретное сочетание коммита и окружения. Перед переходом к обычным задачам команды нужны сопоставимые повторные результаты и сохранённые доказательства.

Эти критерии позволяют отделить официальный объём исправления от вывода о конкретном проекте. Публикация сообщает, что соответствующий сбой исправлен; применимость к конкретному workflow устанавливают уже его логи и сравнение путей. Из релизного объявления нельзя вывести гарантированное ускорение сборки, рост успешности CI или универсальное устранение всех ошибок codesign.

06

Последний шаг: выбор среды исполнения

Если Swift-сборки и подписание регулярно требуют macOS, выполнение всей работы на Linux не заменит нужный Apple toolchain и этапы подписи. Временный локальный Mac тоже может оказаться неудобен для изолированного CI, если его доступность зависит от рабочего места, окружение меняется вручную, а результаты трудно отделить от параллельной разработки. При этом собственный Mac остаётся уместным для постоянной нагрузки, физических подключений и сценариев, где команде важно владеть устройством и обслуживать его самостоятельно.

Для короткого пилота или дополнительного удалённого узла можно оценить отдельную среду macOS вместо переноса неподтверждённых изменений в основную очередь сборки. Перед таким решением стоит сверить доступные варианты и ограничения в описании удалённого Mac mini и справочном центре NodeMini. Если проекту нужен временный изолированный Mac для проверки Swift 6.4.2, аренда NodeMini может отделить эксперимент от основного CI; постоянную тяжёлую нагрузку или обязательные физические интерфейсы разумнее сначала сравнить с покупкой собственного Mac.