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