Skip to content

Instantly share code, notes, and snippets.

@turbcool
Created July 25, 2023 20:16
Show Gist options
  • Save turbcool/969c545421cc0d8b43fa8b8c391e6571 to your computer and use it in GitHub Desktop.
Save turbcool/969c545421cc0d8b43fa8b8c391e6571 to your computer and use it in GitHub Desktop.
Пример liquibase.sh для запуска команд на разных БД в зависимости от контекста
#!/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