Шаг 3 · Проверьте подпись и артефакты по отдельности
Свяжите match, gym и pilot в одном Fastfile
Выполните в корневом каталоге проекта bundle installи добавьте Gemfile.lock в репозиторий. Этот процесс предполагает, что репозиторий подписи уже настроен, приложение создано, а CI безопасно передаёт переменные окружения. Он не создаёт новые ресурсы для подписи.
Предварительная проверка на удалённом хосте · проверьте инструменты
xcode-select -p
xcodebuild -version
xcodebuild -showsdks
ruby --version
bundle --version
bundle exec fastlane --version
security find-identity -v -p codesigning
df -h "$HOME"
Укажите адрес репозитория подписи в переменной MATCH_GIT_URL, а пароль для расшифровки — в MATCH_PASSWORD. Для загрузки используйте серверный API-ключ: путь к файлу ключа задаётся переменной ASC_KEY_PATH , идентификатор ключа и идентификатор издателя — переменными ASC_KEY_IDиASC_ISSUER_ID . Файл ключа должен храниться в секретном хранилище CI и создаваться на диске во время выполнения. Не добавляйте его в репозиторий проекта.
Задайте переменные IOS_APP_IDENTIFIER,IOS_TEAM_ID,IOS_WORKSPACE и IOS_SCHEME. Тип распространения в репозитории подписи должен соответствовать appstore . Сначала проверьте shared scheme, затем запускайте полный конвейер.
fastlane/Fastfile · Конвейер TestFlight для одного приложения
default_platform(:ios)
platform :ios do
desc "Archive a signed build and upload it to TestFlight"
lane :release do
setup_ci
api_key = app_store_connect_api_key(
key_id: ENV.fetch("ASC_KEY_ID"),
issuer_id: ENV.fetch("ASC_ISSUER_ID"),
key_filepath: ENV.fetch("ASC_KEY_PATH"),
in_house: false
)
match(
type: "appstore",
readonly: true,
git_url: ENV.fetch("MATCH_GIT_URL"),
app_identifier: ENV.fetch("IOS_APP_IDENTIFIER"),
team_id: ENV.fetch("IOS_TEAM_ID"),
api_key: api_key
)
gym(
workspace: ENV.fetch("IOS_WORKSPACE"),
scheme: ENV.fetch("IOS_SCHEME"),
configuration: "Release",
clean: true,
export_method: "app-store",
output_directory: "build/artifacts",
output_name: "release.ipa"
)
pilot(
api_key: api_key,
ipa: "build/artifacts/release.ipa",
skip_waiting_for_build_processing: true
)
end
end
Запуск и проверка · переменные окружения передаёт CI
bundle exec fastlane ios release
find build/artifacts -maxdepth 1 -type f -print
Успешная загрузка ещё не означает, что обработка завершена.В этом примере ожидание обработки после загрузки пропущено. Проверьте статус сборки в консоли распространения и назначайте каждой загрузке уникальный номер сборки.readonly: true не позволяет CI изменять репозиторий подписи. Если срок действия сертификата или профиля подготовки истёк, обновите его в контролируемой среде и запустите процесс заново.