В macOS CI сборка проходит, но этап codesign завершается ошибкой, когда проект или артефакт находится в каталоге облачной синхронизации.
Состояние на 1 ноября 2026 года: если сбой возник на macOS 14 или новее и сборка действительно выполняется внутри такого каталога, исправление Swift 6.4.2 стоит проверить в изолированном CI; сначала подтвердите активный toolchain и путь продукта, затем сравните результат на том же коммите. Одного номера версии недостаточно, чтобы объявить проблему устранённой.
Кому пригодится: инженерам, сопровождающим CI для Swift Package и проектов платформ Apple, — чтобы сопоставить свой сбой с областью исправления.
Инженерам DevOps — чтобы сверить toolchain, рабочие пути и результат подписи.
Ответственным за выпуск — чтобы выбрать пилот, поэтапное обновление или временный перенос сборки.
Проверка соответствия исправлению
В объявлении о выпуске 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, повреждённых вложенных компонентов или изменений продукта после подписания. Последние причины нужно проверять отдельно, если факты не совпадают с заявленным условием.
Сверка фактически запущенного 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.
Сопоставление фактических путей
Для проверки недостаточно указать в отчёте «репозиторий находится в синхронизируемой папке». Нужно зафиксировать путь, из которого запускается задача, и места, где появляются промежуточные и конечные файлы. В одном 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 копирует или перемещает продукт.
Проверка результата подписи
Фраза «задача зелёная» не показывает, какая именно операция изменилась. Для каждого запуска отдельно фиксируйте статусы сборки, подписания и проверки готового продукта. Это позволяет отличить исправленный сбой компиляции от проблемы подписи и от случая, когда подпись создана, но не проходит последующую проверку.
Для проверки уже подписанного приложения можно выполнить:
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 по подписанию кода для распространения
Чек-лист приемки и выбор действия
Используйте список ниже для каждого тестового коммита. Отметка должна подтверждаться логом или сохранённым артефактом, а не устным сообщением о том, что «обновление вроде применилось».
- [ ] Сохранён точный текст ошибки и указано, на каком этапе она возникла.
- [ ] Записана версия 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.
Последний шаг: выбор среды исполнения
Если Swift-сборки и подписание регулярно требуют macOS, выполнение всей работы на Linux не заменит нужный Apple toolchain и этапы подписи. Временный локальный Mac тоже может оказаться неудобен для изолированного CI, если его доступность зависит от рабочего места, окружение меняется вручную, а результаты трудно отделить от параллельной разработки. При этом собственный Mac остаётся уместным для постоянной нагрузки, физических подключений и сценариев, где команде важно владеть устройством и обслуживать его самостоятельно.
Для короткого пилота или дополнительного удалённого узла можно оценить отдельную среду macOS вместо переноса неподтверждённых изменений в основную очередь сборки. Перед таким решением стоит сверить доступные варианты и ограничения в описании удалённого Mac mini и справочном центре NodeMini. Если проекту нужен временный изолированный Mac для проверки Swift 6.4.2, аренда NodeMini может отделить эксперимент от основного CI; постоянную тяжёлую нагрузку или обязательные физические интерфейсы разумнее сначала сравнить с покупкой собственного Mac.