Уявіть, що ви працюєте над великим проєктом у команді з десятка розробників. Кожного дня — десятки змін у моделях даних, оновлень схем бази даних і купа міграцій. Ваш CI/CD пайплайн має бути досить розумним, щоб:
- Перевіряти нові міграції.
- Застосовувати їх автоматично до бази даних у тестовому оточенні, щоб уникнути непередбачених помилок.
- Деплоїти зміни в базу даних на production без вашого втручання.
Автоматизація міграцій допомагає економити час, уникати розбіжностей у версіях баз даних між оточеннями і зменшувати людські помилки.
Основні компоненти автоматизації
Щоб автоматизувати міграції, нам знадобляться:
- Alembic (для FastAPI) або Django ORM:
Alembic ми вже обговорювали раніше — він чудово генерує й застосовує міграції.
Django ORM має вбудовану систему міграцій, яка теж відмінно справляється з цим завданням. - Система контролю версій (Git):
Щоб зберігати міграції й зміни в коді. - Система CI/CD (наприклад, GitHub Actions):
Для виконання міграцій під час тестування й деплою. - Тестові і продакшн оточення:
Для безпечного тестування міграцій перед їх застосуванням у production.
Налаштування автоматизації міграцій у FastAPI
1. Інтеграція Alembic з CI/CD
Припустімо, у нас є FastAPI проєкт з уже підключеним SQLAlchemy і Alembic. Налаштуємо автоматичне оновлення бази даних.
Крок 1. Переконайтесь, що alembic.ini налаштований правильно
Ваш файл alembic.ini, який було ініціалізовано раніше, має вказувати на правильну базу даних:
sqlalchemy.url = postgresql+psycopg2://user:password@db_host/db_name
Крок 2. Додайте скрипт для автоматичного застосування міграцій
Створіть bash-скрипт migrate.sh у корені вашого проєкту:
#!/bin/bash
# Виконуємо міграції бази даних
echo "Running Alembic migrations..."
alembic upgrade head
Зробіть файл виконуваним:
chmod +x migrate.sh
Тепер цей скрипт буде оновлювати базу даних до останньої версії.
Крок 3. Інтеграція з GitHub Actions
Створіть файл .github/workflows/deploy.yml, щоб налаштувати CI/CD пайплайн:
name: CI/CD Pipeline
on:
push:
branches:
- main
jobs:
run-migrations:
runs-on: ubuntu-latest
steps:
- name: Checkout Git Repository
uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: '3.12'
- name: Install Dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run Alembic Migrations
run: ./migrate.sh
Ця конфігурація виконує міграції щоразу, коли ви пушите зміни у гілку main.
2. Тестова база даних
Перед тестами корисно оновити базу даних тією ж самою послідовністю міграцій. Це гарантує, що в тестовому оточенні використовується актуальна схема.
Додайте міграції в ваш тестовий скрипт:
pytest && ./migrate.sh
Налаштування автоматизації міграцій у Django
Django відомий своєю вбудованою системою міграцій. Налаштуємо деплой і міграції для Django-додатка.
- Переконайтесь, що міграції в репозиторії
Не забудьте додати папку з міграціями в Git, щоб вони завжди були в актуальному стані:git add your_app/migrations/ git commit -m "Add migrations" - Додайте міграції в пайплайн
Створіть bash-скриптmigrate.shдля Django:
Зробіть файл виконуваним:#!/bin/bash # Виконуємо міграції бази даних echo "Running Django migrations..." python manage.py migratechmod +x migrate.sh - Інтеграція з GitHub Actions
Налаштування пайплайна CI/CD для Django:name: Django CI/CD Pipeline on: push: branches: - main jobs: run-migrations: runs-on: ubuntu-latest steps: - name: Checkout Git Repository uses: actions/checkout@v3 - name: Set up Python uses: actions/setup-python@v4 with: python-version: '3.12' - name: Install Dependencies run: | python -m pip install --upgrade pip pip install -r requirements.txt - name: Collect Static Files run: python manage.py collectstatic --noinput - name: Run Migrations run: ./migrate.sh
Поради та хитрощі
- Автоматичне створення міграцій: налаштуйте окремий крок у CI/CD для перевірки наявності всіх актуальних міграцій:
alembic revision --autogenerate - Перевірка нових міграцій перед збіркою:
ви можете автоматично перевіряти, що всі існуючі моделі відповідають схемі бази даних:alembic check - Створення резервних копій бази даних:
кожного разу перед автоматичним застосуванням міграції на production робіть дампи бази даних. Це врятує від потенційних помилок:pg_dump db_name > backup.sql - Безпечне розгортання:
використовуйте стратегію "blue-green deployment" (або її аналоги), щоб спочатку оновити схему бази даних у новому оточенні, протестувати її, а потім переключити трафік.
Поширені проблеми та помилки
Автоматизація часто додає трохи магії, а магія, як ви знаєте, іноді ламається сама по собі. Ось кілька поширених проблем:
- Застосування міграцій у неправильному порядку:
якщо ви випадково видалите стару міграцію, Alembic або Django можуть заплутатися. Переконайтесь, що порядок міграцій узгоджений у всіх оточеннях. - Конфлікт версій:
якщо два розробники одночасно створюють міграції, це може призвести до конфліктів при мерджі. Використовуйте командні правила, щоб узгоджувати міграції. - Неповне тестування міграцій:
зміни в базі даних можуть бути непомітні до деплою. Завжди тестуйте міграції в ізольованому оточенні. - Проблеми з автогенерацією:
Alembic іноді не може коректно зрозуміти зміни (наприклад, при зміні зв'язків між таблицями). Завжди перевіряйте автогенерований код!
Автоматизація міграцій — це важливий крок на шляху до серйозної розробки. Тепер база даних вашого додатка завжди буде в актуальному стані, а ви зможете приділяти більше часу написанню коду й питтю кави (або чаю, якщо ви з тих рідкісних розробників).
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ