Liquibase, czyli automatyczne instalowanie skryptów

Lubimy mieć kontrolę nad tym co robimy. Żartuje się nawet, że kontrola jest podstawą zaufania. Czemu w takim razie, instalując skrypty na bazie danych, rezultat pozostawiamy przypadkowi? Czemu pozwalamy, aby instalacje odbywały się losowo?

Ręczna instalacja prowadzi do tego, że nie kontrolujemy rezultatów instalacji. Skrypty mogą zostać uruchomione w innej kolejności, istnieje prawdopodobieństwo pominięcia części z nich. Niestety, bardzo dużo projektów stosuje właśnie takie podejście. Przygotujmy listę plików do wgrania, niech administrator wykona całą pracę. Czy mamy w takim razie stuprocentowe zaufanie do administratora?

W projektach gdzie liczy się szybkość wdrożenia, oraz w większości innych języków programowania rozwiązuje się to w inny sposób. Poza kontrolą kodu istnieje również kontrola tego, co jest wgrywane na bazę danych. Najczęściej wykorzystywanymi do tego narzędziami są Liquibase i Flyway.

Wykorzystanie Liquibase do instalacji na bazie danych Oracle nie jest skomplikowane. Dla potrzeb prezentacji przygotowałem prosty przykład. Pakiet do logowania zdarzeń. Do działania potrzebujemy tabeli oraz pakietu PL/SQL. Jak ma się do tego Liquibase?

Struktura plików SQL

Liquibase działa na tak zwanych changesetach, które grupowane są w changlogi. Całość ma strukturę drzewiastą, przez co dokładnie wiemy co i w którym momencie zostanie zainstalowane. Pełna informacja o wyniku instalacji odkładana jest w tabeli konfiguracyjnej — databasechangelog. Dzięki temu Liquibase wie, które pliki zostały już zainstalowane, które musi ponowić, a dla których zaszły jakieś zmiany. Do zamodelowania struktury możemy użyć zarówno YAMLa, XMLa jak i samego SQLa.

We wcześniejszym artykule opisywałem jak przy pomocy Dockera uruchomić bazę danych. Tak przygotowany obraz wykorzystam teraz do instalacji. Proces rozpoczynamy od utworzenia dwóch użytkowników. Jeden dedykowany bezpośrednio dla Liquibase. Ma on dość szerokie uprawnienia, które przed wdrożeniem na produkcje powinny zostać zrewidowane. Drugi, zwyczajny użytkownik, na którym będziemy instalować nasz kod.

> sys@PDB1.LOCALDOMAIN
CREATE USER liqui IDENTIFIED BY pass;
GRANT CONNECT TO liqui;
GRANT ALL PRIVILEGES TO liqui;

CREATE USER test_user IDENTIFIED BY test_user;
ALTER USER test_user QUOTA 1024M ON USERS;

Po skonfigurowaniu użytkowników przechodzimy do utworzenia wcześniej wspomnianych changelogów. Zawierają one informację o tym, co będzie instalowane. Przykładowy changelog dla dwóch pakietów wygląda następująco.

 main ±  cat changelog.yaml 
databaseChangeLog:
- changeSet:
      id: package_PKG_LOG
      author:  piszu
      runOnChange: true
      sqlFile:
        dbms: oracle
        endDelimiter: /
        path: PKG_LOG.spc
        relativeToChangelogFile: true
        splitStatements: true
        stripComments:  true

- changeSet:
      id: body_PKG_LOG
      author:  piszu
      runOnChange: true
      sqlFile:
        dbms: oracle
        endDelimiter: /
        path: PKG_LOG.bdy
        relativeToChangelogFile: true
        splitStatements: true
        stripComments:  true

Następnie zbieramy changelogi w jeden zbiorczy, który będzie naszym domyślnym i od którego Liquibase będzie zaczynać instalację.

 main ±  cat master.yaml
databaseChangeLog:
- include:
    file: Packages/changelog.yaml
- include:
    file: Scripts/changelog.yaml    

Po skonfigurowaniu możemy uruchomić Liquibase:

 main ±  ./utils/liquibase --changelog-file=master.yaml --defaults-file=./utils/liquibase.properties update
####################################################
##   _     _             _ _                      ##
##  | |   (_)           (_) |                     ##
##  | |    _  __ _ _   _ _| |__   __ _ ___  ___   ##
##  | |   | |/ _` | | | | | '_ \ / _` / __|/ _ \  ##
##  | |___| | (_| | |_| | | |_) | (_| \__ \  __/  ##
##  \_____/_|\__, |\__,_|_|_.__/ \__,_|___/\___|  ##
##              | |                               ##
##              |_|                               ##
##                                                ## 
##  Get documentation at docs.liquibase.com       ##
##  Get certified courses at learn.liquibase.com  ## 
##  Free schema change activity reports at        ##
##      https://hub.liquibase.com                 ##
##                                                ##
####################################################
Starting Liquibase at 18:21:48 (version 4.12.0 #3073 built at 2022-06-17 05:59+0000)
Liquibase Version: 4.12.0
Liquibase Community 4.12.0 by Liquibase
Running Changeset: Packages/changelog.yaml::package_PKG_LOG::piszu
Running Changeset: Packages/changelog.yaml::body_PKG_LOG::piszu
Running Changeset: Scripts/changelog.yaml::create_table::piszu
Liquibase command 'update' was executed successfully.

Jak widać, Liquibase bez problemu zainstalowało nam pakiet oraz stworzyło tabelę w bazie danych. Cała konfiguracja i przygotowanie procesu zajęła dosłownie chwilę. Oczywiście, możemy też sprawdzić dokładne szczegóły instalacji. Wystarczy, że spojrzymy do tabeli databasechangelog.

Tabela Databasechangelog

Powyżej idealnie widać najważniejsze profity z używania Liquibase. Dokładnie wiemy co, kiedy, oraz w jakim stanie zostało zainstalowane na bazie danych. Dzięki temu możemy w pełni zarządzać zmianą oraz wdrażać wiele funkcjonalności jednocześnie. W prosty sposób możemy również przygotować środowisko do Continuous Integration. Traktował będzie o tym kolejny artykuł.

Cały kod możecie znaleźć w moim repozytorium na Githubie. Jest tam również pełna konfiguracja, dzięki czemu bezpośrednio po ściągnięciu można przetestować rozwiązanie.

 

 

 

Możesz również polubić…

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany.