Ewolucja schematu bazy danych (Flyway)
Wprowadzenie
Wraz z coraz szerszym zastosowaniem zwinnych metodyk oprogramowania, zapotrzebowanie na narzędzia automatyzujące zarządzanie zmianami w schemacie baz danych znacząco wzrosło. Technologie umożliwiające rozwój schematu bazy danych podczas pracy nad kodem aplikacji pozwoliły developerom znacząco zwiększyć efektywność pracy
W tym czasie narzędzia takie jak Flyway czy Liquidbase zyskiwały na popularności. Migracje schematu baz danych wprowadzają koncept wersjonowania. Migracja są zarządzane w sposób przyrostowy i odwracalny, znacząco ułatwiają pracę z bazami danych na kilku środowiskach na raz (local, tst, stg i prd). Pozwalają także developerom odtworzyć bazę danych od zera, co jest niesamowicie pomocne przy tworzeniu nowych środowisk. Dają nam także pewność, że schemat bazy danych i kod aplikacji są zsynchronizowane, więc błędy w stylu “relation xyz does not exist” są nam nie straszne.
Flyway
Flyway jest projektem OpenSource (https://github.com/flyway/flyway) stworzonym w języku Java, który automatyzuje migracje schematów bazy danych dla projektów JVM. Zazwyczaj skrypty migracji schematów są umieszczane w tym samym repozytorium co kod aplikacji. W ten sposób projekt osiąga bezpośrednie wersjonowanie skryptów razem z wersjonowaniem aplikacji.
Zalety
Wiele projektów nadal ręcznie zmienia swój schemat bazy danych podczas wydania. Wymaga to dobrej dokumentacji wszystkich wymaganych kroków, które należy wykonać. Szczególnie niebezpiecznie są wszelkiego rodzaju szybkie naprawy/wdrożenia, które zostały wprowadzone bezpośrednio na środowisku i nie zostały nigdzie opisane, mogą one powodować utratę synchronizacji między poszczególnymi co w prosty sposób będzie prowadziło do większego chaosu i awaryjności. Flyway powstał po to, aby uniknąć takich sytuacji. Ogólnym celem umieszczania skryptów migracji bezpośrednio w repozytorium kodu jest narzucenie braku ręcznych zmian w bazie danych. W ten sposób możemy być pewni, że na wszystkich środowiskach zastosowano dokładnie taki sam zestaw skryptów. Nie tylko umożliwia to mniejszą częstotliwość błędów i wystąpienia błędów podczas wydań, ale także ułatwia nasze życie w zakresie powtarzalności i większej automatyzacji procesów.
Integracja - podstawowy
Integracja Flyway do projektu Spring Boot jest bardzo prosta i zamyka się w kilku krokach opisanych poniżej:
Dodaj zależność Flyway do pliku pom.xml lub build.gradle projektu.
Skonfiguruj połączenie z bazą danych w pliku application.properties lub application.yml.
Stwórz katalog w którym będzie przechowywał skrypty, domyślnie jest to "db/migration" w src/main/resources.
Napisz skrypty migracji w formacie SQL i oznacz je numerem wersji (np. V1__init.sql, V2__add_column.sql itp.).
Uruchom aplikację Spring Boot, a Flyway automatycznie wykona skrypty migracji w kolejności numerów wersji.
Możesz również użyć polecenia "mvn flyway:migrate" lub "./gradlew flywayMigrate" w wierszu poleceń, aby ręcznie wykonać migrację bazy danych.
Integracja - inne sposoby użycia
Flyway jako osobny moduł w aplikacji wielomodułowej: W aplikacji wielomodułowej, gdzie każdy moduł jest oddzielnym projektem z własnymi zależnościami i zasobami, Flyway może być użyty jako osobny moduł, który jest współdzielony przez wszystkie moduły aplikacji. W takim przypadku, migracje schematów bazy danych są zdefiniowane i zarządzane przez ten osobny moduł Flyway, dzięki czemu każdy moduł może korzystać z tego samego schematu bazy danych i aktualizować go w sposób centralizowany.
Flyway jako obraz do uruchomienia w pipeline CI/CD: Flyway może być użyty jako obraz Docker do uruchomienia w pipeline CI/CD. W takim przypadku, migracje schematów bazy danych są zdefiniowane i zarządzane przez ten obraz Flyway. Każde uaktualnienie schematu bazy danych jest wykonywane automatycznie po uruchomieniu tego obrazu w pipeline CI/CD, co umożliwia łatwe i szybkie wdrożenie aktualizacji schematu bazy danych na środowiska produkcyjne gdzie czasami wymagana jest większa kontrola nad wdrożeniem.
Integracja - repozytorium z przykładami
W celu ułatwienia startu z Flyway warto zapoznać się z repozytorium w któym zaprezentowane są przykładowe sposoby użycia Flyway’a: Tutorials / flyway-examples · GitLab (blue.pl)
Baseline - projekty legacy
Baseline jest używany w Flyway do ustawienia wersji bazowej w już istniejących projektach legacy. Po ustawieniu wersji bazowej, Flyway zignoruje wszystkie skrypty aż do tej wersji, a dla nowych baz danych zastosuje wszystkie skrypty jak zwykle. Jest to przydatne, gdy chcesz wykorzystać korzyści automatyzacji migracji schematu bazy danych w już istniejącym projekcie, w którym schemat bazy danych jest już określony. Można go ustawić za pomocą polecenia Flyway "baseline". Pełna dokumentacja na temat stosowania Flyway w projektach legacy można znaleźć na stronie https://flywaydb.org/documentation/existing.
Podsumowanie
Każdy projekt jest unikalny i wymaga indywidualnego podejścia do jego implementacji i wdrożenia. Niemniej jednak, Flyway jest narzędziem, które może być użyte we wszystkich projektach, które używają relacyjnej bazy danych. Flyway zapewnia jednoznaczne i kontrolowane migracje bazy danych, co zwiększa jakość i niezawodność wydań. Korzystanie z Flyway oznacza mniej błędów i pomyłek podczas wydań, a także ułatwia reprodukowalność bazy danych w razie migracji do innej bazy lub nowego wdrożenia. Każdy nowy projekt zdecydowanie powinien zastosować narzędzie tego typu, będzie to również bardzo duży uzysk jakościowy dla niemal każdej aplikacji legacy, który zwróci się bardzo szybko