Наши клиенты работают с большим продуктом, у которого основная конфигурация, реализующая различные бизнес-процессы, хранится в виде PL/SQL и записей в таблицах. Также реализован процесс хранения и установки этой конфигурации на различные стенды (Prod, Preprod) заказчика.
Стек: Oracle, GitLab, Liquibase, Jenkins
Схема такая:
- Заказчик вносит изменения в тестовой среде (правятся/вносятся записи в БД, пакеты, процедуры)
- После успешного тестирования изменения вручную выгружаются и добавляются в CSV (для таблиц) или в .sql-файлы (для PL/SQL) в наш Git-репозиторий. Создается Merge Request
- Мы вручную запускаем Jenkins-сборку, которая на локальном стенде запускает миграцию Liquibase по изменённым в MR объектам
- Изменения применяются
или
- Возникают ошибки, которые правятся либо силами заказчика, либо нашими
- С определённой периодичностью формируется релизная сборка, включающая все изменения заказчика
- Заказчик устанавливает её на своих стендах через Ansible + Liquibase
Основная боль заключается в п.2, который влечёт за собой п.5:
- После конфигурирования заказчик вынужден тратить время на корректный перенос информации в .csv и .sql
- Merge-конфликты, потому что ветка заказчика не основана на актуальной версии ветки master
- Синтаксические ошибки при переносе данных в .csv (забыли delimiter, исправили не то значение/не ту строку)
- Забыли перенести все изменения (в результате при сборке возникают ошибки вроде violates foreign key constraint: Key (customer_id)=(123) is not present in table "customers", либо в Git зафиксировано только тело пакета без спецификации)
- В changeset к таблице указан primary key, который не обеспечивает уникальность строки (например, в таблице есть constraint на поле number_history, но его нет в changeset, и вместо вставки новой строки происходит update)
Я заинтересован в оптимизации этого процесса и максимальном упрощении переноса выполненных изменений из БД в Git.
Какие есть best practices?
Какие инструменты для этого используются?