Add pipline/initdb01.yml

This commit is contained in:
pashko 2025-08-09 21:10:37 +08:00
parent cc5dfa4c03
commit 7e881d8f55

148
pipline/initdb01.yml Normal file
View File

@ -0,0 +1,148 @@
image: $POSTGRESQL_IMAGE
workflow:
rules:
- if: $CI_PIPELINE_SOURCE == "push"
when: never
- when: always
variables:
GIT_CLEAN_FLAGS: -ffdx
POSTGRES_HOST:
value: ""
description: 'postgresql remote host'
POSTGRES_PORT:
value: "5432"
description: 'port for postgresql remote host'
POSTGRES_DB:
value: ""
description: 'db for restore"'
POSTGRES_USER:
value: ""
description: 'user for postgresql remote host'
POSTGRES_PASSWORD:
value: ""
description: 'passwd for postgresql user remote host'
LOAD_DATA:
value: "true"
options:
- "true"
- "false"
description: 'https://nexus.example.com/repository/raw/db/schema.sql'
# URL дампов в Nexus
SCHEMA_SQL_URL:
value: ""
description: 'https://nexus.example.com/repository/raw/db/schema.sql'
DATA_DUMP_TAR_GZ_URL:
value: ""
description: 'https://nexus.example.com/repository/raw/db/data.tar.gz'
# Локальные пути
SCHEMA_SQL_PATH: "/tmp/schema.sql"
DATA_DUMP_TAR_GZ_PATH: "/tmp/data.tar.gz"
DATA_DUMP_DIR: "/tmp/dump_data"
.create_dump_dir: &create_dump_dir
- mkdir -p "$DATA_DUMP_DIR"
.download_schema: &download_schema
- |
echo "Скачивание схемы: $SCHEMA_SQL_URL"
curl -f -u $SED_NEXUS_USER:$SED_NEXUS_PASS -o "$SCHEMA_SQL_PATH" "$SCHEMA_SQL_URL"
if [ $? -ne 0 ]; then
echo "Ошибк при скачивании схемы"
exit 1
fi
echo "Схема успешно загружена: $SCHEMA_SQL_PATH"
.download_data: &download_data
- |
echo "Скачиывание дампа данных: $DATA_DUMP_TAR_GZ_URL"
curl -f -u $SED_NEXUS_USER:$SED_NEXUS_PASS -o "$DATA_DUMP_TAR_GZ_PATH" "$DATA_DUMP_TAR_GZ_URL"
if [ $? -ne 0 ]; then
echo "Ошибка при скачивании дампа данных"
exit 1
fi
echo "Дамп данных успешно загружен: $DATA_DUMP_TAR_GZ_PATH"
.wait_for_postgres: &wait_for_postgres
- |
echo "Ожидание готовности PostgreSQL ($POSTGRES_HOST:$POSTGRES_PORT)..."
for i in {1..30}; do
if pg_isready -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER"; then
echo "PostgreSQL доступен."
break
fi
echo "PostgreSQL не готов, ожидание... ($i/30)"
sleep 5
done
if [ $i -eq 30 ]; then
echo "PostgreSQL не стал доступен за отведённое время."
exit 1
fi
.create_database: &create_database
- |
echo "Создание базы данных $POSTGRES_DB, если не существует..."
PGPASSWORD=$POSTGRES_PASSWORD psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" \
-c "CREATE DATABASE \"$POSTGRES_DB\";" || echo "База данных $POSTGRES_DB уже существует."
.restore_schema: &restore_schema
- |
echo "Применение схемы из $SCHEMA_SQL_PATH..."
PGPASSWORD=$POSTGRES_PASSWORD psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -f "$SCHEMA_SQL_PATH"
echo "Схема успешно применена."
.restore_data: &restore_data
- |
if [ "$LOAD_DATA" != "false" ]; then
echo "Загрузка данных включена"
# Скачивание данных
echo "Скачивание файла: $DATA_DUMP_TAR_GZ_URL"
curl -f -u $SED_NEXUS_USER:$SED_NEXUS_PASS -o "$DATA_DUMP_TAR_GZ_PATH" "$DATA_DUMP_TAR_GZ_URL"
if [ $? -ne 0 ]; then
echo "Ошибка при скачивании данных"
exit 1
fi
echo "Данные успешно загружены: $DATA_DUMP_TAR_GZ_PATH"
# Восстановление данных
echo "Восстановление данных из $DATA_DUMP_TAR_GZ_PATH в БД $POSTGRES_DB..."
pg_restore -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" --data-only -v "$DATA_DUMP_TAR_GZ_PATH"
echo "Данные успешно восстановлены."
else
echo "Загрузка данных пропущена (LOAD_DATA=$LOAD_DATA)"
fi
stages:
- init_db
init_db:
stage: init_db
before_script:
- export PGPASSWORD=$POSTGRES_PASSWORD
- export POSTGRES_HOST=$POSTGRES_HOST
- export POSTGRES_PORT=$POSTGRES_PORT
- export POSTGRES_USER=$POSTGRES_USER
- export POSTGRES_DB=$POSTGRES_DB
- export SCHEMA_SQL_URL=$SCHEMA_SQL_URL
- export SCHEMA_SQL_PATH=$SCHEMA_SQL_PATH
- export DATA_DUMP_TAR_GZ_URL=$DATA_DUMP_TAR_GZ_URL
- export DATA_DUMP_TAR_GZ_PATH=$DATA_DUMP_TAR_GZ_PATH
- export DATA_DUMP_DIR="/tmp/dump_data"
script:
- *create_dump_dir
- *download_schema
- *download_data
- *wait_for_postgres
- *create_database
- *restore_schema
- *restore_data
tags:
- mmedo