devops/pipline/init_db.yml

145 lines
4.5 KiB
YAML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

image: postgres:16-alpine
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: "db for restore"
description: '11'
POSTGRES_USER:
value: ""
description: 'user for postgresql remote host'
POSTGRES_PASSWORD:
value: ""
description: 'passwd for postgresql user remote host'
# 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:
script:
- mkdir -p "$DATA_DUMP_DIR"
.download_schema:
script:
- |
echo "Скачивание схемы: $SCHEMA_SQL_URL"
curl -f -u $NEXUS_USER:$NEXUS_PASSWORD -o "$SCHEMA_SQL_PATH" "$SCHEMA_SQL_URL"
if [ $? -ne 0 ]; then
echo "Ошибк при скачивании схемы"
exit 1
fi
echo "Схема успешно загружена: $SCHEMA_SQL_PATH"
.download_
script:
- |
echo "Скачиывание дампа данных: $DATA_DUMP_TAR_GZ_URL"
curl -f -u $NEXUS_USER:$NEXUS_PASSWORD -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:
script:
- |
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:
script:
- |
echo "Создание базы данных $POSTGRES_DB, если не существует..."
PGPASSWORD=$POSTGRES_PASSWORD psql -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" \
-c "CREATE DATABASE \"$POSTGRES_DB\";" || echo "База данных $POSTGRES_DB уже существует."
.apply_schema:
script:
- |
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_
script:
- |
echo "Распаковка архива $DATA_DUMP_TAR_GZ_PATH в $DATA_DUMP_DIR..."
tar -xzf "$DATA_DUMP_TAR_GZ_PATH" -C "$DATA_DUMP_DIR"
DUMP_FILE=$(find "$DATA_DUMP_DIR" -type f -name "*.dump" -o -name "backup" | head -n1)
if [ ! -f "$DUMP_FILE" ]; then
echo "Не найден файл дампа после распаковки."
exit 1
fi
echo "Найден дамп: $DUMP_FILE"
echo "Восстановление данных из $DUMP_FILE в БД $POSTGRES_DB..."
pg_restore -h "$POSTGRES_HOST" -p "$POSTGRES_PORT" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -v "$DUMP_FILE"
echo "Данные успешно восстановлены."
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"
- apk add --no-cache curl tar
script:
- *create_dump_dir
- *download_schema
- *download_data
- *wait_for_postgres
- *create_database
- *apply_schema
- *restore_data
tags:
- init_db