Задать вопрос

Как оптимально переносить состояние таблиц и объектов PL/SQL из БД в GIT?

Доброго времени суток.

Наши клиенты работают с большим продуктом у которого основная конфигурация которая реализует различные бизнес-процессы хранится в виде plsql + записи в таблицах. Так же реализован процесс хранения и установки этой конфигурации на различные стенды (Prod, Preprod) заказчика.

Стек: Oracle, Gitlab, Liquibase, Jenkins
Схема такая:
  1. Заказчик вносит изменения в тестовой среде (правятся/вносятся записи в бд/пакеты/процедуры)
  2. После успешного тестирования изменения вручную выгружаются и вносятся в csv (если говорить о таблицах) или в .sql файлы в наш git репозиторий. Создается Merge Request
  3. Мы вручную запускаем Jenkins сборку которая на локальном стенд запускает liquibase миграцию по измененным в MR объектам
  4. Изменения применяются

    или

  5. возникают ошибки которые правятся либо силами заказчика, либо нашими
  6. Затем с определенной периодичностью формируется релизная сборка которая включает в себя все сделанные заказчиком изменения.
  7. Заказчик устанавливает ее на своих стендах через ansible + liquibase


Основная боль заключается в п.2, который за собой влечет п.5:
  1. Заказчик выполнив конфигурирование вынужден тратить время на корректный перенос этой информации в .csv .sql
  2. Мердж-конфликты потому что заказчик создал ветку не от актуального состояния master ветки
  3. Синтаксические ошибки при переносе данных в .csv (забыли дописать delimiter, исправили не то значение/не в той строке)
  4. Забыли перенести все изменения (из за чего при сборке мы ловим условные violates foreign key constraint Key (customer_id)=(123) is not present in table "customers". , в git зафиксировал тело пакета без его спеки)
  5. Ситуации когда в changesetах к таблицам указан primary_key который не дает достаточной уникальности строке (условно в таблице есть поле number_history по которому в БД есть constraint, но нет в changeset) и мы вместо вставки новой записи апдейтим текущую новыми значениями


Я заинтересован в оптимизации этого процесса и максимальном упрощении переноса выполненных изменений из БД в git.
Какие есть best practices?
Какие инструменты для этого используются?
  • Вопрос задан
  • 88 просмотров
Подписаться 2 Сложный Комментировать
Пригласить эксперта
Ответы на вопрос 2
@rPman
В одном старом проекте, необходимые структуры сохранялись в машиночитаемом виде (пусть будет json), сохраняется целиком вся текущая структура. Можно облегчить жизнь git и тем кто будет смотреть глазами дифы для написания комментариев к коммиту, если сохранять его с построчным форматированием на объект/свойство (построчно для БД).

Пишется утилита, которая доводит текущее состояние базы данных до указанной структуры, а именно удаляет удаленное, изменяет - измененное и добавляет новое (особо уделить время для реализации что бы изменения были именно изменения, а не удалил + добавил, только так корректно связи в базе останутся, для этого либо озаботиться идентификаторами, если структуру правит кто то один, либо как то договариваться о пометках между релизами в доп полях) и пусть она запускается после обновлений у клиента.
Ответ написан
Комментировать
Возможно, вам пригодится что-то из этого: https://github.com/bytebase/bytebase, https://github.com/dolthub/dolt
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы