# Релизы Tuist использует систему непрерывного выпуска, которая автоматически публикует новые версии при слиянии значимых изменений с основной веткой. Такой подход гарантирует, что улучшения быстро дойдут до пользователей без ручного вмешательства со стороны сопровождающих. ## Обзор Мы постоянно выпускаем три основных компонента: - **Tuist CLI** - инструмент командной строки - **Tuist Server** - Внутренние службы - **Приложение Tuist** – приложения для macOS и iOS (приложение для iOS постоянно развертывается только в TestFlight, подробнее [здесь](#app-store-release)) Каждый компонент имеет свой собственный конвейер выпуска, который запускается автоматически при каждом пуше в основную ветку. ## Как это работает ### 1. Принятие условностей Мы используем [Conventional Commits](https://www.conventionalcommits.org/) для структурирования наших сообщений о фиксации. Это позволяет нашему инструментарию понимать природу изменений, определять переходы на новые версии и генерировать соответствующие журналы изменений. Формат: `Тип(область): описание` #### Типы обязательств и их влияние | Тип | Описание | Влияние версии | Пример | | ----------- | --------------------------------- | ---------------------------------- | --------------------------------------------------- | | `feat` | Новая функция или возможность | Небольшое изменение версии (x.Y.z) | `feat(cli): добавлена поддержка Swift 6` | | `исправить` | Исправление ошибок | Обновление версии патча (x.y.Z) | `fix(app): устранение сбоя при открытии проектов` | | `docs` | Изменения в документации | Нет релизов | `Документация: руководство по установке обновлений` | | `стиль` | Изменения в стиле кода | Нет релизов | `стиль: форматирование кода с помощью swiftformat` | | `рефактор` | Рефакторинг кода | Нет релизов | `refactor(server): упростить логику авторизации` | | `perf` | Улучшение производительности | Увеличение версии патча | `perf(cli): оптимизация разрешения зависимостей` | | `тест` | Дополнения/изменения в испытаниях | Нет релизов | `test: добавить модульные тесты для кэша` | | `работа` | Задачи технического обслуживания | Нет релизов | `работа: обновление зависимостей` | | `ci` | Изменения CI/CD | Нет релизов | `ci: добавить рабочий процесс для релизов` | #### Разрывные изменения Ломающие изменения приводят к переходу на основную версию (X.0.0) и должны быть указаны в теле коммита: ``` feat(cli): change default cache location BREAKING CHANGE: The cache is now stored in ~/.tuist/cache instead of .tuist-cache. Users will need to clear their old cache directory. ``` ### 2. Обнаружение изменений Каждый компонент использует [git cliff](https://git-cliff.org/) для: - Проанализируйте коммиты с момента выхода последнего релиза - Фильтруйте коммиты по области применения (клиент, приложение, сервер) - Определите, есть ли изменения, которые можно выпустить - Автоматическое создание журналов изменений ### 3. Выпускной трубопровод Когда обнаруживаются изменения, поддающиеся освобождению: 1. **Расчет версии**: Конвейер определяет номер следующей версии 2. **Генерация журнала изменений**: git cliff создает журнал изменений из сообщений коммита 3. **Процесс сборки**: Компонент собран и протестирован 4. **Создание релиза**: Создается релиз на GitHub с артефактами 5. **Распространение**: Обновления передаются менеджерам пакетов (например, Homebrew для CLI) ### 4. Фильтрация области действия Каждый компонент выпускается только тогда, когда в нем происходят соответствующие изменения: - **CLI**: Коммиты с диапазоном `(cli)` или без диапазона - **Приложение**: Коммиты с областью применения `(app)` - **Сервер**: Коммиты с охватом `(сервер)` ## Написание хороших сообщений для фиксации Поскольку сообщения о фиксации напрямую влияют на примечания к выпуску, важно писать ясные, описательные сообщения: ### Делайте: - Используйте настоящее время: "add feature", а не "added feature" - Будьте краткими, но описательными - Включите область применения, если изменения зависят от конкретного компонента - Ссылки на проблемы, когда это применимо: `исправление(cli): устранение проблемы с кэшем сборки (#1234)` ### Не надо: - Используйте расплывчатые сообщения вроде "fix bug" или "update code" - Смешивание нескольких несвязанных изменений в одном коммите - Забудьте включить информацию об изменениях ### Разрывные изменения Для разрывных изменений включите `BREAKING CHANGE:` в тело коммита: ``` feat(cli): change cache directory structure BREAKING CHANGE: Cache files are now stored in a new directory structure. Users need to clear their cache after updating. ``` ## Рабочие процессы выпуска Рабочие процессы выпуска определены в: - `.github/workflows/cli-release.yml` - релизы CLI - `.github/workflows/app-release.yml` - Релизы приложений - `.github/workflows/server-release.yml` - Релизы сервера Каждый рабочий процесс: - Запускается при нажатии на кнопку - Можно запускать вручную - Использует git cliff для обнаружения изменений - Дескриптор управляет всем процессом выпуска ## Мониторинг релизов Вы можете отслеживать выпуски через: - [Страница "Релизы GitHub"](https://github.com/tuist/tuist/releases) - Вкладка "Действия GitHub" для запуска рабочего процесса - Файлы Changelog в каждом каталоге компонентов ## Преимущества Такой подход к непрерывному выпуску обеспечивает: - **Быстрая доставка**: Изменения попадают к пользователям сразу после объединения - **Сокращение "узких мест"**: Отсутствие необходимости ждать ручных релизов - **Четкая коммуникация**: Автоматические журналы изменений из сообщений фиксации - **Последовательный процесс**: Одинаковый поток выпуска для всех компонентов - **Гарантия качества**: Выпускаются только проверенные изменения ## Устранение неполадок Если освобождение не удается: 1. Проверьте журналы GitHub Actions на предмет неудачного рабочего процесса 2. Убедитесь, что ваши сообщения о фиксации соответствуют общепринятому формату 3. Убедитесь, что все тесты пройдены 4. Проверьте успешность сборки компонента Для срочных исправлений, требующих немедленного выпуска: 1. Убедитесь, что у вашего обязательства есть четкая сфера применения 2. После объединения контролируйте рабочий процесс выпуска 3. При необходимости запустите ручной спуск ## Релиз в App Store В то время как CLI и сервер следуют процессу непрерывного выпуска, описанному выше, приложение **для iOS** является исключением, связанным с процессом проверки Apple App Store: - **Ручные релизы**: релизы iOS-приложений требуют ручной отправки в App Store - **Задержки с рецензированием**: Каждый релиз должен пройти через процесс рассмотрения Apple, который может занять 1-7 дней - **Пакетные изменения**: В каждом релизе iOS обычно объединяются несколько изменений - **TestFlight**: Бета-версии могут распространяться через TestFlight до выхода в App Store - **Примечания к выпуску**: Должны быть написаны специально для руководства App Store Приложение для iOS по-прежнему следует тем же соглашениям о фиксации и использует git cliff для создания журнала изменений, но фактический выпуск для пользователей происходит реже и вручную.