CI/CD

Документ описывает, как устроен автоматический деплой экосистемы GeoPoint: какие репозитории участвуют, что происходит при push в main и куда попадают артефакты.

Общая схема

GeoPoint состоит из пяти репозиториев. Деплой идёт через GitLab CI на runner с тегом geopoint. Триггер — push в ветку main.

Код и контейнеры лежат на сервере в /opt/geopoint.

Репозиторий

Назначение

Результат деплоя

rest_api

REST API

Docker-контейнер geopoint-rest

website

Сайт

Docker-контейнер geopoint-website

mobile

Android-приложение

APK в каталог загрузок сайта

codifier

Кодификатор Topomatic

Файл .semantic в каталог загрузок

robur_plugin

Плагин Topomatic Robur

Исполняемый файл в каталог загрузок

Адреса в проде:

  • Сайт — https://geopoint.end-point.ru

  • Загрузки — https://geopoint.end-point.ru/download

  • REST API — https://geopoint-rest.end-point.ru

Общие правила

При деплое rest_api и website код копируется на сервер через rsync. Из копирования исключаются:

  • .git, .gitlab

  • config/, .env

  • vendor/, storage/

  • resources/download/

Параллельные деплои одного окружения блокируются через resource_group: production.

Статус можно посмотреть в GitLab: репозиторий → CI/CD → Pipelines.

rest_api

Папка на сервере: /opt/geopoint/rest
Контейнер: geopoint-rest

Пайплайн из трёх стадий.

deploy:prepare — rsync кода в /opt/geopoint/rest, создание storage/cache и resources/download.

deploy:docker — в каталоге .deploy выполняется docker compose up -d --build, затем ожидание готовности контейнера.

deploy:finalizecomposer install --no-dev внутри контейнера, настройка прав на storage, перезагрузка Apache.

Конфигурация API — в core/config/.env и core/config/.ini на сервере. База подключается через внешнюю Docker-сеть geopoint_db.

website

Папка на сервере: /opt/geopoint/website
Контейнер: geopoint-website

Схема такая же, как у rest_api: prepare → docker → finalize.

Конфигурация — в config/ на сервере (в git не попадает). Зависимости ставятся через composer при finalize.

Сайт обращается к API через REST_URL из server-side config. Авторизация — через Authentik.

Страница /download показывает файлы из resources/download/, если они там есть:

  • GeoPoint.apk — мобильное приложение

  • GeoPoint.semantic — кодификатор

  • GeoPoint.msi — плагин Topomatic

mobile

Сборка и публикация APK — два этапа.

build:apk — сборка release APK в Docker. В GitLab CI/CD Settings должны быть заданы переменные:

  • ANDROID_KEYSTORE_BASE64

  • ANDROID_KEYSTORE_PASSWORD

  • ANDROID_KEY_ALIAS

  • ANDROID_KEY_PASSWORD

Результат — артефакт .ci/GeoPoint.apk.

deploy:apk — копирование в /opt/geopoint/website/resources/download/GeoPoint.apk. Сайт перезапускать не нужно.

Release-сборка ходит в реальный API. Debug-сборка с mock-данными собирается локально в Android Studio.

Сборка может занимать до 15 минут.

codifier

В репозитории лежит файл GeoPoint.semantic.

При push в main job deploy:semantic копирует его в /opt/geopoint/website/resources/download/GeoPoint.semantic. После этого файл доступен на странице загрузок.

robur_plugin

Плагин собирается локально в Visual Studio. CI только публикует готовый бинарник.

Job deploy:download запускается, если в коммите изменился файл .build/GeoPoint.exe. Он копируется в /opt/geopoint/website/resources/download/GeoPoint.exe.

Структура на сервере

/opt/geopoint/ ├── rest/ # rest_api │ ├── .deploy/ │ └── core/config/ └── website/ # website ├── .deploy/ ├── config/ └── resources/download/ ├── GeoPoint.apk ├── GeoPoint.semantic └── GeoPoint.exe

Если pipeline упал

rsync / Permission denied — на сервере мешают права на файлы или каталоги, которые rsync пытается удалить или перезаписать. Чаще всего это storage/ или логи.

Контейнер не стал healthy — смотреть логи: docker logs geopoint-rest или docker logs geopoint-website.

mobile: не задана переменная ANDROID_* — проверить CI/CD Variables в настройках репозитория.

codifier: файл не найден — в корне репозитория должен лежать GeoPoint.semantic.

robur_plugin: job не запустился — в коммите должен измениться .build/GeoPoint.exe.