## CI 🚀

**Continuous Integration (CI)** — это ключевая DevOps-практика, ускоряющая процесс разработки, обеспечивающая стабильность кода и предотвращающая ошибки ещё до попадания в продакшн. Практика непрерывной интеграции кода, при которой разработчики регулярно сливают изменения в общий репозиторий, а затем автоматически запускаются проверки, тесты и сборки.

![CICD](/pictures/Common/CICD.png?raw=true)

**CD** — это логичное продолжение **CI**:
* **Continuous Delivery** автоматизирует подготовку к деплою, но требует ручного вмешательства;
* **Continuous Deployment** убирает этот шаг и автоматически разворачивает изменения в продакшн. Выбор зависит от проекта и бизнес-требований;

## Как работает CI/CD?

1. Разработчик вносит изменения в коде локально;
2. Изменения отправляются в удалённый репозиторий (GitHub, GitLab, Bitbucket и т. д.);
3. CI-сервер автоматически запускает процесс сборки (сборка кода, линтинг, тестирование);
4. Если сборка успешна, код можно развернуть на тестовый сервер или в продакшн (при использовании CD – Continuous Deployment);
5. Если есть ошибки, CI-система может уведомляет разработчика (email, Slack, Telegram и др.);

## Bundle (пакет или архив)

Включает все компоненты приложения, включая скомпилированный код, ресурсы (изображения, файлы и т. д.), конфигурации, библиотеки и другие данные. 
* Для iOS, например, это `.ipa` файл, который затем устанавливается на устройства;
* Для андроид - `.apk`;

**Bundle id** - уникальный идентификатор вашего приложения среди всех существующих приложений в мире. Нет в мире приложения в двумя одинаковыми bundle id. 

При создании bundle id можно указать возможности для приложения: Push Notification, Apple Pay, App group и тп.


## [Сертификаты](/2%20ComputerScience/2.5%20Cybersecurity/2.5.4%20Digital%20Signature%20(signing).md)

Сущность [подписки](/2%20ComputerScience/2.5%20Cybersecurity/2.5.4%20Digital%20Signature%20(signing).md), которая связана с аккаунтом разработчика. Для iOS существует несколько типов сертификатов:

* **Development** - нужен для того, чтобы можно было сбилдить и запустить дебаг-конфигурацию приложения из Xcode на реальном устройстве

* **Distribution** - используется для подписания приложений, которые будут распространяться в App Store или через Ad Hoc distribution. Для каждого типа распространения (App Store, Enterprise, Ad Hoc) можно использовать один и тот же сертификат, если они принадлежат одному аккаунту разработчика.

    > ❗ distribution сертификатов может быть максимум 3 штуки

Один сертификат Development и **один сертификат** Distribution можно использовать для подписки **всех приложений** в рамках аккаунта разработчика. Выпускаются на 1 год.

## Профили (Provisioning Profiles)

> Профили - специальный файл, обеспечивающий доступ к некоторой функциональности в конкретной сборке вашего приложения

Профили настройки — это не сертификаты, но они тесно связаны с ними. Профиль настройки — связующее звено между конкретным приложением и конкретным сертификатом. 

Они делятся на два типа: 
* **Development Provisioning Profile** используется для разработки и тестирования приложения на устройствах; 
* **Distribution Provisioning Profile** используется для распространения приложения через App Store или внутри компании. Каждое приложение должно быть подписано сертификатом и связано с соответствующим профилем, чтобы приложение могло быть установлено или распространено.

Вида дистрибуции профилей:

1. **Development** создается с помощью**development** сертификат и профиля  , что позволяет сбилдить приложение на реальном устройстве и дебажить; 
2. **Ad-hoc** - экспортировать сборку в сервисы дистрибуции (н/р: Firebase), кроме TestFlight. Создается с помощью **Distribution** сертификат;
    
    При подписке приложения Ad-hoc профилем, в этом профиле должны быть явно указаны UDID всех устройств, на которых будет возможно тестирование;
    
    Максимальное количество устройств - 100, устройства берутся из списка устройств аккаунта разработчика;
3. **App Store** позволяет экспортировать сборку в TestFlight и далее в App Store. Создается с помощью **Distribution** сертификат;

    При подписке приложения App Store профилем, UDID устройств указывать не требуется. Пользоваться приложением сможет любой, кто скачал его из TestFlight или App Store;
    
     B TestFlight можно добавить до 100 внутренних тестировщиков (моментально получают сборки) и до 10000 внешних (получают сборки после ревью от Apple);

## Зачем все это?

Валидный профиль и сертификат необходимы для того, чтобы в принципе иметь возможность сделать сборку. Если у вас нет валидного профиля и сертификата - вы не сможете создать сборку

При создании сборки в нее добавляется копия профиля, которым она была подписана. Поэтому даже если оригинал профиля станет невалидным или будет удален, сборка останется работоспособной

### Как долго сборка останется работоспособной? зависит от типа профиля и сертификата

[Инвалидация](https://github.com/eldaroid/iTWiki/blob/master/5%20Swift/5.2%20Glossary.md#инвалидация) **профилей** приводит только к тому, что вы не можете создать новые сборки. 

[Инвалидация](https://github.com/eldaroid/iTWiki/blob/master/5%20Swift/5.2%20Glossary.md#инвалидация) **сертификата** ведет себя по разному в зависимости от типа:

* **Development** и **Ad-hoc** - срок жизни сборки ограничен сроком жизни сертификата, приложенной к сборке. Инвалидация серта приведет к неработающим приложениям  ;
* **TestFlight** - имеет срок жизни в 90 дней с момента выкладки. По истечении 90 дней ее невозможно будет скачать, а уже скачанные сборки перестанут работать;
* **App Store** - если приложение было выложено в App Store и затем скачано пользователем, приложение будет работать **вечно**, пока пользователь не удалит его самостоятельно; 

### Нюанс Nº1. Не подтягивается сертификат под профиль

Если вы часто используете проекты с автоматической подпиской Debug конфигураций, в определенный момент Xcode может отказаться билдить приложение на устройстве

![ProvisionDoesNotIncludeCertificate](/pictures/Swift/ProvisionDoesNotIncludeCertificate.png?raw=true)

**Решение:** зайти в Keychain и удалите руками указанный сертификат (на примере картинки это `iPhone Distribution: ...`), после чего убейте Xcode и запустите заново. Xcode скачает валидный сертификат и профиль, после чего все будет работать.

### Нюанс Nº2. Ввод пароля

Если вы сгенерировали новые сертификаты, первая сборка на любом компьютере потребует ввода пароля от этого компьютера (относится в т.ч. к С) 

---

[4.3 Docker Theme Folder](/4%20Linkage/4.3%20Docker/) | [Back To iTWiki Contents](https://github.com/eldaroid/iTWiki) | [4.4.2 iOS CI Guide Theme](/4%20Linkage/4.4%20CI-CD/4.4.2%20%20iOS_CI.md)