Created
July 25, 2023 20:16
-
-
Save turbcool/969c545421cc0d8b43fa8b8c391e6571 to your computer and use it in GitHub Desktop.
Пример liquibase.sh для запуска команд на разных БД в зависимости от контекста
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#!/bin/bash | |
# Вспомогательный скрипт для запуска команд liquibase. | |
# Автоматически подставляет контекст, схему и url нужной базы в зависимости от контекста. | |
# | |
# Использование: | |
# ./liquibase.sh <команда_liquibase> <название_контекста>, например: ./liquibase.sh status storm | |
# Запуск в режиме Docker: добавьте опцию --docker | |
# P.S. Если <название_контекста> не передано - скрипт будет применён на всех контекстах по очереди. | |
script_dir="$(cd "$(dirname "$0")" && pwd)" | |
env_file="$script_dir/liquibase.env" | |
# Загрузим ENV переменные из файла, которые ещё не были установлены: | |
source liquibase.env | |
# Список доступных контекстов: | |
contexts=(core storm test) | |
contextArgs=() | |
# Проверка, является ли переданное значение одним из доступных контекстов | |
isContext() { | |
if [[ " ${contexts[@]} " =~ " ${1} " ]]; then | |
return 1 | |
else | |
return 0 | |
fi; | |
} | |
# Проверка наличия опции в списке аргументов | |
check_option() { | |
local option=$1 | |
shift | |
for arg in "$@"; do | |
if [[ "$arg" == "$option" ]]; then | |
return 1 # Опция найдена | |
fi | |
done | |
return 0 | |
} | |
# Проверяем наличие опции --docker | |
check_option "--docker" "$@" | |
dockerMode=$? | |
filtered_arguments=() | |
# Обрабатываем переданные контексты | |
for arg in "$@"; do | |
isContext "$arg" | |
if [ $? = 1 ]; then | |
contextArgs+=("$arg") | |
elif [ $arg != '--docker' ]; then | |
filtered_arguments+=("$arg") | |
fi | |
done | |
# Если контексты не переданы, используем все доступные | |
if [ ${#contextArgs[@]} -eq 0 ]; then | |
contextArgs=("${contexts[@]}") | |
fi | |
for context in "${contextArgs[@]}"; do | |
schema=$context | |
# для core и storm нужна схема public | |
if [ "$context" = "core" ] || [ "$context" = "storm" ]; then | |
schema=public | |
fi; | |
# Задаём БД в зависимости от контекста: | |
if [ "$context" = "storm" ]; then | |
database=$STORM_JDBC_URL | |
elif [ "$context" = "test" ]; then | |
database=$TEST_JDBC_URL | |
else | |
database=$CORE_JDBC_URL | |
fi; | |
if [ "$dockerMode" = 1 ]; then | |
# MSYS_NO_PATHCONV=1 нужен чтобы пофиксить запуск через Git Bash | |
liquibaseCmd="MSYS_NO_PATHCONV=1 docker run --rm -v ${PWD}/:/liquibase/changelog/ liquibase/liquibase --defaultsFile=/liquibase/changelog/liquibase.properties --changelog-file=liquibase.json --search-path=/liquibase/changelog/" | |
else | |
liquibaseCmd="liquibase" | |
fi | |
echo -e "Запускаем $1 для контекста $context... \n" | |
if [ "$context" = "target" ]; then | |
for targetDbUrl in ${TARGET_JDBC_URLS[@]}; do | |
echo "Запускаем скрипт на БД $targetDbUrl..." | |
echo "$liquibaseCmd $1 --contexts $context --default-schema-name $schema --url=$targetDbUrl ${filtered_arguments[@]:1}" | |
$liquibaseCmd $1 --contexts $context --default-schema-name $schema --url=$targetDbUrl ${filtered_arguments[@]:1} | |
echo "" | |
done | |
else | |
echo "$liquibaseCmd $1 --contexts $context --default-schema-name $schema --url=$database ${filtered_arguments[@]:1}" | |
$liquibaseCmd $1 --contexts $context --default-schema-name $schema --url=$database ${filtered_arguments[@]:1} | |
echo "" | |
fi; | |
done | |
exit $? |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment