Роман Бусыгин "Автосборки ios-проектов в Яндексе"
DESCRIPTION
Доставка результатов работы разработчиков – это очень важный, сложный и кропотливый процесс в жизни каждого iOS-проекта. В то же время он очень скучный и чреват ошибками. Единственный способ избежать этих неприятных вещей – автоматизировать процесс и превратить сборку проекта в нажатие одной кнопки «Собрать!». Роман Бусыгин поделился советами, которые могут оказаться полезными для автосборок проектов, и рассказал о том, как осуществляется автоматизация в Яндексе.TRANSCRIPT
![Page 2: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/2.jpg)
План рассказа
Зачем?
Основные этапы сборки
Как мы автоматизируем
Советы и приёмчики
2
![Page 3: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/3.jpg)
Зачем нужна автосборка?
3
![Page 4: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/4.jpg)
Зачем мне автосборка?
4
Если что-то делаешь вручную третий раз, то это повод задуматься об автоматизации этого
Андрей Субботин, Яндекс
![Page 5: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/5.jpg)
Зачем мне автосборка?
Сделать жизнь проекта проще
Сократить количество ошибок
Не отвлекает разработчика
5
![Page 6: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/6.jpg)
Какие проблемы мы решали?
6
![Page 7: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/7.jpg)
Два аккаунта вiTunes Connect
AppStoreAppPre!x.ru.yandex.mobile.search
EnterpriseAppPre!x.ru.yandex.mobile.search
7
![Page 8: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/8.jpg)
Большое количество проектов
8
![Page 9: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/9.jpg)
Большое количество проектов
8
![Page 10: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/10.jpg)
Недостаточная поддержка со стороны CI
Свыше 30 различных CI server
Jenkins близок к идеалу
Мы используем Teamcity
9
![Page 11: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/11.jpg)
Основные этапы сборки
10
![Page 12: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/12.jpg)
Сборка iOS-проекта в Яндексе
Внутреннее тестирование — InHouse
Релиз в App Store — AppStore
11
![Page 13: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/13.jpg)
Этапы сборки1. Установка версии
2. Компиляция
3. Проверка подписи
4. Генерация артефактов
5. Переподписывание
6. Публикация артефактов
12
![Page 14: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/14.jpg)
Шаг 1. Установка версии
YourProject.xcodeproj/project.pbxproj
NSPropertyListOpenStepFormat
-[NSDictionary initWithContentsOfFile:]
13
![Page 15: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/15.jpg)
Шаг 1. Установка версии
defaults write Info.plist CFBundleVersion 562
defaults write Info.plist CFBundleShortVersionSting 4.5.1
14
![Page 16: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/16.jpg)
Шаг 2. Компиляция
xcodebuild -target YourApp -configuration InHouse -xcconfig OurConfig.xcconfig
15
![Page 17: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/17.jpg)
Шаг 2. Компиляция
$ cat OurConfig.xcconfig
CONFIGURATION_BUILD_DIR = /Path/To/Xcodeproject/build/
CODE_SIGN_IDENTITY = iPhone Distribution: Yandex LLC
PROVISIONING_PROFILE =
16
![Page 18: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/18.jpg)
Шаг 3. Проверка подписи
codesign -dvvv --entitlements - YourApp.app | grep 'iPhone Distribution'
17
![Page 19: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/19.jpg)
Шаг 3. Проверка подписи
YourApp.app/embedded.mobileprovision
PKCS7 подписанный plist, однозначно соответствующий code signing identity
https://github.com/quadion/iOSValidation
18
![Page 20: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/20.jpg)
Шаг 4. Артефакты
Отладочная информация
YourApp.app + YourApp.app.dSYM → zip
Приложение
YourApp.app → YourApp.ipa (InHouse)
YourApp.app → YourApp.zip (AppStore)
19
![Page 21: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/21.jpg)
Шаг 4. Артефакты InHouse
xcrun -sdk iphoneos -find PackageApplication
xcrun -sdk iphoneos PackageApplication YourApp.app -o YourApp.ipa
20
![Page 22: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/22.jpg)
Шаг 4. Артефакты AppStore
zip --recurse-path --symlinks -1 YourApp.app
21
![Page 23: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/23.jpg)
Шаг 5. Переподписывание
PackageApplication не обновляет application preSx в entitlements приложения
22
![Page 24: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/24.jpg)
Шаг 6. Публикация артефактов
YourApp.ipa для Over-The-Air распространения (в том числе и для App Store)
YourApp.zip для iTunes Connect (только для App Store сборок)
23
![Page 25: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/25.jpg)
Как мы автоматизируем
24
![Page 26: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/26.jpg)
YXBuildKit
Набор скриптов на Bash/Perl
Делает все, что я уже описал
Решает все наши проблемы
Простая интеграция
25
![Page 27: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/27.jpg)
Интеграция с YXBuildKit
1. Добавить в проект две build conSguration: InHouse и AppStore
2. Положить в папку с проектом конфиг
26
![Page 28: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/28.jpg)
Настройка YXBuildKit
27
PREBUILD_SCRIPT = yxbuildkit-prebuild.shPOSTBUILD_SCRIPT = yxbuildkit-postbuild.shIPA_TITLE = "Яндекс.Карты"IPA_FILE = yandexmaps-iphoneos.ipaCODE_SIGN_IDENTITY_InHouse = "iPhone Distribution: Yandex LLC"CODE_SIGN_IDENTITY_AppStore = "iPhone Distribution: Yandex, LLC"APP_VERSION = 451RESIGN_APPSTORE_BUILD_FOR_ADHOC_TESTING =1MOBILEPROVISION="Resources/inhouse.mobileprovision"
![Page 29: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/29.jpg)
Процесс сборки, итого
1. Нажимаем Run
2. Несколько минут магии
3. PROFIT
28
![Page 30: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/30.jpg)
YXBuildKit, планы
Переписать на Ruby
Поддержка отладочного режима
Маркировка иконки InHouse сборки как в Почте
Выложить в open source?
29
![Page 31: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/31.jpg)
Советики
30
![Page 32: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/32.jpg)
Хранение dSYM
Git → Teamcity
31
![Page 33: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/33.jpg)
Именование dSYM
YourApp.AppStore.451.562-(armv6 01234567)-(armv7 01234567).app+dSYM.zip
dwarfdump --uuid YourApp.dSYM
32
![Page 34: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/34.jpg)
Специальная иконка
33
![Page 35: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/35.jpg)
Итого
Польза автоматизации сборки
Как автоматизировать
YXBuildKit
Советики
34
![Page 36: Роман Бусыгин "Автосборки iOS-проектов в Яндексе"](https://reader034.vdocuments.site/reader034/viewer/2022042602/557ee7afd8b42a331d8b51d9/html5/thumbnails/36.jpg)
Вопросы?Спасибо, что выслушали
Роман Бусыгин, @nskboy