CI/CD Плагинов
Логика деплоя новых плагинов и их версий базируется на принципах из CI/CD Сервисов.
GitOps
Имеем несколько репозиториев для каждого environment'а:
rp-plugins
crp-plugins
gca-plugins
и другие
Каждый репозиторий разделен на основные ветки:
main
– Основная ветка. Изменения уходят на прод.dev
– Ветка открытого тестирования. Изменения уходят на дев.
В репозиториях хранятся сбилдженые плагины. Они сгруппированы по папкам для миров (overworld, farmworld, nether, ...). Плагины, присутствующие на сервере глобально и имеющие одинаковые конфиги, лежат в директории shared
.
Каждый из репозиториев привязан через git-sync (который, кстати, не так легко настроить)
в свою директорию на машине, которая смонтирована внутрь контейнера с сервером. Он подхватывает изменения и переносит их на машину. Какая ветка получила изменение, такая машина и подхватила.
Обновление плагинов
Большое количество плагинов на наших серверах не самописные, и единственний способ обновления – ручками проверять GitHub репозитории, страницы на Modrinth или ждать анонса новой версии платных плагинов в Discord серверах.
Самописные плагины
Все самописные плагины при пуше в dev
автоматически билдятся в GitHub Actions и выдают на выходе готовые .jar
файлы на Paper
и Velocity
.
До принятия решения об адекватном пайплайне плагинов, Хаффку в лс прилетала большая ссылка от Апехума на выполненный workflow, у которого в артефактах лежал 5-и мегабайтный .jar
файл:

Каждый раз заходить в локальный клон rp-plugins
, ручками переносить в каждый мир новый плагин, удалять старую версию, коммитить, пушить и ждать 1 минуту пока git-sync
сделает свое дело очень надоело:

А ведь так запускались не только бета версии, но и версии для простого тестирования впроцессе разработки.
Тогда мы написали наш первый GitHub Action: digitaldrugstech/mc-plugin-update@main
и код билд-н-деплоя в наших плагинах стал выглядеть опрятней:
Как итог, мы получили красивый workflow который при пуше билдит плагин, загружает его на все нужные сервера и отправляет в Discord уведомление о заливе новой версии (пока что только по sha, потому что в плагинах еще не настроено версионирование).



Динамические конфиги
Большинство значений в конфигах могут отличаться в зависимости от того где этот конфиг используется: на проде или деве, в мире ферм или мире построек, поэтому мы используем встроенное в docker-minecraft
форматирование конфигов через ENV
.
Подробнее почитать можно тут: https://docker-minecraft-server.readthedocs.io/en/latest/configuration/interpolating/#replacing-variables-inside-configs
Отличный пример на конфиге CoreProtect
:

CoreProtect
и его конфиги должны быть на всех серверах кроме прокси, поэтому он хранится в папке shared
.
Добавлять данные от БД в конфиг на GitHub не только небезопасно, но и работать не будет: на проде и деве пароли разные, поэтому в конфиге мы используем динамические, но общие на весь env параметры для подключения БД: CFG_MYSQL_HOST
, CFG_MYSQL_USER
Чтобы разные сервера не перемешивались в БД корпротекта, плагин просит называть базы данных уникально, и тут нам на помощь приходит значение CFG_SERVER_NAME
, которое уникально для каждого сервера: в мире построек в конфиге будет написано mysql-database: mc_overworld
, в мире ферм – :mc_farmworld,
а в энде – :mc_the-end
– и всё, сервера пользуются общим конфигом!
Last updated