Як не витрачати час на безперервну інтеграцію

Будь-яка софтверна компанія рано чи пізно приходить до необхідності впровадження безперервної інтеграції, будь це розробка мобільного додатку, створення звичайного сайту, або вже тим більше, якщо це складна мікро-сервісна структура.

image
Раніше я писав, що наша команда займається розробкою iOS і Android додатків під ключ, включаючи бекенд і фронтенд. З цього випливає гостра потреба у наявності масштабованого процесу дистрибуції і усталених стандартів щодо ведення проектів.

Але одна справа, коли у тебе єдиний продукт, де можна зробити абияк, а інше — якщо кожен місяць з'являється новий, з особливими вимогами, великою командою, для якого треба швидко отримати CI/CD.

Ви, напевно, подумали, що зараз буде інструкція з налаштування цієї самої інтеграції, де я поділюся best practices, скриптами, рекомендаціями по інфраструктурі та іншими лайфхаками.

Я теж так думав.


Початок
Але раптово усвідомив, що все це просто копіпаста в промислових масштабах, а правильне рішення лежить не за інструкцією, а за інструментом. Інструментом, який проводить аналіз, налаштування та складання проектів самостійно. Зрештою, безперервна інтеграція була покликана спрощувати життя, а не додавати нових проблем із необхідністю створювати величезні туторіали для написання таких же непомірні за обсягом скриптів. А потім ще і підтримувати.

З цієї причини мене багато в чому радують такі сервіси як Travis і Circle за ємність їх мови, строгість і доступність інфраструктури, але тим не менше, цього недостатньо. Все це накладає обов'язки по дослідженню їх гайдів, вимагає глибокого розуміння особливостей платформи на яку розробляється продукт. Вже мало просто вміти робити iOS або Android програми, треба знати особливості SDK і пристрій у них під капотом.



Ви можете сказати, що це нормально, що кожен розробник повинен знати свою платформу і вміти налаштувати збірку з командного рядка, але я не погоджуся. Розробник повинен вміти розробляти, писати продукт, знати методи SDK, відповідні бібліотеки і вміти їх застосовувати. Але ніяк не розбиратися в системах дистрибуції, скриптових мовах і інфраструктурі. Це як раніше для створення простого сайту треба було бути ще й трохи системним адміністратором. Трохи перебільшую, але думаю, ви зрозуміли.

Дослідження
Щоб не винаходити велосипед, мені належало глибоке занурення в інтернет, де я розраховував знайти вже існуючі сервіси і випробувати їх на міцність. Як всі знають, ідея ніколи не приходить тільки в одну голову.

Я вирішив взяти якийсь тестовий проект, який буду віддавати на досліди всіх знайдених сервісів.
Критерієм успіху буде здатність провести повний цикл безперервної інтеграції — від отримання вихідного коду до деплоя в Crashlytics.

Для початку ми зосередимося на iOS, так як у мене особисто, як автора, більше експертизи в цій сфері, а по-друге, творіння apple завжди славилося головоломної налаштуванням з-за сертифікатів та інших перешкод.

В якості зразка для тестування, візьмемо старий добрий проект над яким я измываюсь в кожній своїй статті. І так, поїхали.

Після тривалого дайвінгу аж до 20-ї сторінки гугла, я знайшов три продукти, які підходили під опис. Два з них не запускалися в принципі, тому ми їх розглядати не будемо, а третій хоч і працював, але абияк: не зміг визначити підходящу версію Xcode, нез'ясовно довго збирав Carthage і Cocoapods(для непосвячених — залежності), і складалося враження, що про кеші будь-якого роду в принципі не чув. І в підсумку зафейлил збірку, як і очікувалося:
image

Ох вже ці казочки. Без удаваної скромності, я зрозумів, що можу зробити краще вже зараз. Тому що крім однієї честолюбної формулювання, було ще й чітке розуміння що у конкурентів працює не так, де, як це виправити і зробити в цілому краще і швидше.

Робота
Надихнувшись ідеєю разом з колегами, які підтримали задум, ми сіли за розробку прототипу. Опущу пихате розповідь про те як ми працювали дні і ночі безперервно під 'Eye of the tiger", і замість соковитого маркетингу краще розповім чого ми домоглися, які фішки реалізували і що зараз реально працює.

Основною метою було повністю автоматизувати налаштування безперервної інтеграції для всіх, щоб навіть менеджер зміг побудувати для своєї компанії нормальний бізнес-процес, маючи на руках лише посилання в репозитарій і з повною відсутністю технічних знань. Ми навіть провели експеримент, попросивши людини не розробляє під iOS налаштувати безперервну інтеграцію з допомогою нашого творіння. Ми були дуже раді, що у нього все вийшло. Це був сигнал, що ми рухаємося в правильному напрямку.

Невелике демо-відео про те як все відбувається.


Якщо порівнювати з Travis, то при рівних ресурсах, проекти збираються в 4-5 разів швидше за рахунок оптимізації залежностей та відсутність необхідності віртуалізувати кожного окремого worker-а і доставляти йому відсутня.

Забув сказати. Проект вирішили назвати Buildben. Спочатку хотіли просто Ben, на честь чудесного нашого офісного кота, а потім народилася гра слів між Big Ben та Build Ben.

Але ми відволіклися. Ви напевно і так всі зрозуміли, що клас, все сама робить, кіт класний, ми молодці і все таке. Як кажуть — " чим будемо дивувати?

А ось чим. Ми спеціально підготували кілька особливих фіч, які вам сподобаються:

  • Кешування Carthage frameworks в хмарі. Що сбилжено одного разу, не билдится знову.
    Якщо хто не стикався, то є така проблема, що багато фреймворки на github не надають скомпільований бінарники. А якщо й надають, то тільки під певний Swift. Ми зробили своє сховище бібліотек для кожної версії Swift, яке регулярно поповнюється по ходу роботи автоматично.

  • Утиліта для самостійної конфігурації кабінету iOS розробника. При деплое програми постійно доводиться думати про сертифікати, профайлах, bundle id, всяких entitlements, icloud і інших. Ми взяли все це на себе і автоматизували.

  • Засіб для підготовки Crashlytics програми. Всі, хто працював з Crashlytics знають, що коли створюєш нове додатку або хоча б просто міняєш його bundle id, доводиться його хоча б раз запустити, щоб воно склалося. А якщо треба додаток з новим bundle id перевірити? Або просто хочеться використовувати принади дистрибуції в крашлитик без мороки з SDK?

    Так ось, тепер все працює як треба. Достатньо в адмінці вибрати Crashlytics, далі воно саме.

    image

    Ми плануємо зробити можливість просто вбити логін-пароль від Fabric або, якщо у вас немає облікового запису, то самим його зареєструвати без танців з бубнами.

  • Асинхронна складання. Якщо що-то можна робити одночасно — ми це робимо. Наприклад, Cocoapods & Carthage встановлюються паралельно на різних машинах, а потім зливаються воєдино. У підсумку завдання, які не потребують потужних ресурсів, виконуються відповідними мікро-процесами, дозволяючи зосередити всю міць на компіляції.

    image
Наступний крок
В один момент ми усвідомили, що занадто довго варимося у своєму власному котлі, а про сервіс, крім пари знайомих і друзів практично ніхто не чув. Та й кошти не гумові, хмара в Amazon сама себе не оплатить, чи знаєте.

Було вирішено піти шукати інвестора в кращих традиціях стартапів. Довго шукати не довелося, що дивно, нами зацікавилися і призначили зустріч.

Задавали багато питань, розпитували про досвід як команди, які розробляли проекти, ким бачимо себе через 5 років, яка наша цільова аудиторія, попросили порахувати безліч різних складних цифр, та ще з десяток якихось дивних показників, паралельно читаючи лекції про те, як правильно жити. У підсумку нам сказали наступне:

"— Панове, все здорово, проект цікавий. Але є одне але. Вам потрібні користувачі. Без них немає впевненості, що проект дійсно затребуваний і його варто розвивати. Знайдіть хоча б пару десятків людей і компаній, які захочуть скористатися вашими послугами, і ми продовжимо розмову."

А де технар може знайти технаря, який любить нові продукти і готовий піти у перших рядах? Звичайно тут, на хабре. Моє невелике знайомство з аудиторією по декількох написаних статей показало, що народ тут хоч і любить покритикувати, але розумний і допитливий.

Я не продавець і маркетолог і не вмію красиво говорити про кохання, але якщо ти дочитав до цього моменту, то значить тема тобі здалося цікавим, і ми будемо раді, якщо ти нею скористаєшся.

У нас є невеликий посадковий сайт, де можна залишити заявку на бета тестування, милості прошу. Кожна заявка триггерит мій будильник, і я біжу відразу відповідати. Але, на жаль, наші ресурси зараз сильно обмежені, і запросити зможемо не всіх, але намагатимемося по максимуму.

Важливі нюанси
В кінці посту додам FAQ, який буде поповнюватися в міру спілкування в коментарях.
Питання безпеки там можна знайти вже зараз. Це особливо важливий аспект, який все розуміють.

Ще хочу сказати і навіть продублювати, що розробка коробкової версії, яку можна розгорнути в себе і забути про параною, знаходиться у нас серед найбільш пріоритетних і ми знаємо про її необхідність.

Висновок
Мабуть, це все що я хотів розповісти. Буду радий відповісти на запитання, вислухати поради та освятити детальніше будь-які аспекти.

Ах так, до речі, ось той самий кіт про який я говорив:



Диво, чи неправда?

І за традицією хочу поділитися корисними посиланнями:

  • Crashlytics — неймовірно зручна і безкоштовна система дистрибуції. Має хороші туторіали та виразне SDK для iOS & Android, рекомендую.
  • Mattermost — чат для командного комунікації, як Slack, тільки self-hosted і безкоштовний. Легко інтегрується зі всім чим тільки можна. Якщо ви досі обговорюєте ділові питання в телеграмі, то вам сюди.
  • Fastlane — швейцарський ніж для безперервної інтеграції. Якщо ви самостійно займаєтеся деплоем, то це просто must have. Правда, вимагає певних знань Ruby.


FAQ
Запитання: Чому я можу бути впевненим, що мій код нікуди не витече?
Відповідь: У першу чергу це основна наша головна відповідальність. Ми не читаємо ваш код і ніхто ззовні не може отримати до нього доступ, все заховано в індивідуальну пісочницю для кожного проекту. І навіть більше того, ми його відразу видаляємо після складання, залишаючи тільки логи. Це написано в нашій угоді про конфіденційність, який ви підписуєте автоматично реєструючись на нашому сервісі. Тобто Ми в угоді про конфіденційність пишемо, що видаляємо вихідний код після складання.

Запитання: Добре, а що щодо доступу до iTunes Connect? Як я можу бути впевнений, що ви не зламаєте нам додаток?
Відповідь: Ми рекомендуємо використовувати окремий аккаунт для зовнішнього доступу, незалежно від того чи використовуєте наш сервіс або власний скрипт. Ви можете самі визначити кордон, куди ви хочете допустити наш продукт. Зі свого боку ми більше кого б то не було б зацікавлені в збереженні інформації.

Запитання: ви Плануєте випускати коробочну версію, яку можна було б розгорнути у себе і не турбуватися за безпеку?
Відповідь: Плануємо і дуже скоро. Це один з пріоритетних напрямків.
Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.