CI/CD¶
Все репозитории экосистемы используют GitHub Actions. Эта страница описывает общие шаблоны и соглашения.
Основные принципы¶
- Проверяем на PR, разворачиваем на main. PR запускает сборку и тесты и
ничего не деплоит. Деплой стартует только после слияния в
main. - Собираем только изменившееся. С помощью
paths-filterопределяется, что изменилось, и пересобираются только эти сервисы. - Никаких одновременных деплоев. Группа
concurrencyставит production- деплои в очередь, так что параллельно они не идут. - Секреты только в GitHub Secrets. В файле workflow они не пишутся никогда.
Типичная структура workflow¶
name: deploy
on:
push:
branches: [main]
paths:
- 'backend/**'
- 'frontend/**'
- '.github/workflows/deploy.yml'
workflow_dispatch: # возможность ручного запуска
concurrency:
group: deploy-production
cancel-in-progress: false # деплой не прерываем на середине
cancel-in-progress: false — это важно
Прерванный на середине деплой может оставить незавершённое состояние: новый контейнер не поднялся, старый уже погашен. Деплою нужно дать дойти до конца, а следующий поставить в очередь.
Стадия проверок (PR)¶
| Проверка | Что делает |
|---|---|
| Сборка | Компилируется ли код |
| Модульные тесты | Бизнес-логика |
| Интеграционные тесты | testcontainers — настоящие PostgreSQL/Redis |
| Lint | Стиль кода |
| Строгая сборка документации | Выявляет битые ссылки и отсутствующие файлы |
Строгая проверка документации¶
MkDocs собирается в режиме --strict. В этом режиме предупреждения
становятся ошибками:
- битые внутренние ссылки,
- файлы, указанные в
nav, но отсутствующие, - файлы, которые есть, но не включены в
nav.
Так поломка документации не доходит до production.
Стадия деплоя¶
Выполняется подключением к хосту по SSH. Необходимые секреты (общая нотация):
| Секрет | Значение |
|---|---|
DEPLOY_HOST |
Адрес сервера |
DEPLOY_USER |
Пользователь SSH |
DEPLOY_SSH_KEY |
Приватный ключ |
DEPLOY_PORT |
Порт SSH (необязательно, по умолчанию 22) |
DEPLOY_PATH |
Путь на хосте |
SSH-ключ, а не пароль
Для деплоя используется SSH-ключ, а не пароль. Ключ легко отозвать, он реже случайно попадает в логи, и его можно ротировать, не раздавая заново множеству людей.
Частичная сборка¶
В монорепозитории одно изменение не должно требовать сборки всех сервисов:
- uses: dorny/paths-filter@v3
id: filter
with:
filters: |
backend: 'backend/**'
frontend: 'frontend/**'
edge: 'nginx/**'
Далее пересобираются только изменившиеся сервисы. Если изменился edge (nginx),
полной пересборки нет — только синхронизация конфига + nginx -t + reload.
Деплой конфигурации edge¶
conf.d у edge nginx управляется через git. Порядок деплоя:
- Синхронизировать репозиторий на хосте:
git fetch && git reset --hard, docker exec <nginx> nginx -t— проверить конфигурацию,- При успехе —
nginx -s reload.
nginx -t пропускать нельзя
Reload с неверным конфигом приведёт к тому, что nginx не поднимется, — и
в этот момент упадут все домены. nginx -t должен выполняться до
reload, и при ошибке деплой обязан остановиться.
Self-hosted runner¶
Для сборок под iOS и Windows (подписание кода, нотаризация, упаковка MSIX) используются self-hosted раннеры macOS / Windows. Им нужны специфические инструменты платформы и сертификаты, поэтому на облачных раннерах они не работают.
Версионирование и откат¶
- У образов есть теги. Переменной
<SVC>_IMAGE_TAGна хосте можно закрепить конкретную версию. - Для статических сайтов заново распаковывается архив предыдущей сборки.
CI/CD этого репозитория¶
У репозитория docs-gerege-mn два workflow:
| Workflow | Когда | Что делает |
|---|---|---|
ci.yml |
PR + push в main |
Сборка MkDocs --strict; оставляет артефакт |
deploy.yml |
Push в main + вручную |
Сборка → копирование → обновление контейнера → установка edge vhost → проверка живого сайта |
Подробности — на странице Платформа этой документации.