From 0b1feee9a03dc2230759943f98f7ba7cab80b5cf Mon Sep 17 00:00:00 2001 From: pashko Date: Wed, 6 Aug 2025 09:41:48 +0800 Subject: [PATCH] Add pipline/init_db.yml --- pipline/init_db.yml | 146 ++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 146 insertions(+) create mode 100644 pipline/init_db.yml diff --git a/pipline/init_db.yml b/pipline/init_db.yml new file mode 100644 index 0000000..19afed7 --- /dev/null +++ b/pipline/init_db.yml @@ -0,0 +1,146 @@ +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 + +# Job: Инициализация БД (вручную) +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 \ No newline at end of file