В современных проектах Django ускорение цикла разработки и развертывания стало критически важным. GitHub Actions, благодаря своей гибкости и интеграции с Docker, позволяет настроить полноценный CI/CD для любого Django‑проекта. В этой статье мы разберём, как упаковать приложение в контейнер, запустить тесты с pytest, собрать Docker‑образ и автоматически развернуть его на облачной VPS, используя единственный workflow в GitHub Actions. Следуя пошаговой инструкции, вы уменьшите количество ошибок при релизах и ускорите доставку новых функций.
Разбор задачи
Основная цель – автоматизировать весь процесс от коммита к деплою: сборка образа, тестирование и перенос на удалённый сервер. Ваша задача – гарантировать, что каждый пулл‑реквест проходит одинаковое тестовое окружение, а выпуск новой версии происходит без ручного вмешательства. При этом важно, чтобы Docker‑образ был лёгким и быстро загружался, а тесты с pytest выполнялись быстро и надёжно.
Пошаговое решение
В следующем разделе мы подробно опишем шаги, которые нужно включить в workflow: подготовка окружения, кэширование зависимостей, запуск pytest, сборка Docker‑образа и деплой на VPS. Каждая часть будет описана с учётом лучших практик, которые помогут вам избежать типичных ошибок и ускорить настройку. Продолжайте читать, чтобы узнать, как быстро интегрировать CI/CD для Django в GitHub Actions и получить надёжный pipeline для вашего проекта.
Рабочий код
# .github/workflows/ci.yml
name: Django CI
on: [push, pull_request]
jobs:
test:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:13
env:
POSTGRES_USER: postgres
POSTGRES_PASSWORD: password
POSTGRES_DB: test_db
ports:
- 5432:5432
options: >
--health-cmd pg_isready
--health-interval 10s
--health-timeout 5s
--health-retries 5
env:
DATABASE_URL: postgres://postgres:password@localhost:5432/test_db
PYTHONPATH: src
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Set up Python 3.12
uses: actions/setup-python@v5
with:
python-version: 3.12
- name: Install dependencies
run: |
python -m pip install --upgrade pip
pip install -r requirements.txt
- name: Run tests with pytest
run: pytest --cov=src --cov-report=xml
env:
DJANGO_SETTINGS_MODULE: myproject.settings
- name: Upload coverage report
uses: actions/upload-artifact@v4
with:
name: coverage-report
path: coverage.xml
deploy:
needs: test
runs-on: ubuntu-latest
if: github.ref == 'refs/heads/main'
steps:
- name: Checkout repository
uses: actions/checkout@v4
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to registry
uses: docker/login-action@v3
with:
registry: ghcr.io
username: ${{ github.actor }}
password: ${{ secrets.GITHUB_TOKEN }}
- name: Push image
run: |
docker tag myapp:${{ github.sha }} ghcr.io/${{ github.repository }}:${{ github.sha }}
docker push ghcr.io/${{ github.repository }}:${{ github.sha }}
- name: Deploy to production
run: |
# Здесь можно вызвать скрипт развертывания, например через SSH
echo 'Deploying to production server...'
Типичные ошибки
- Не указать переменную
DJANGO_SETTINGS_MODULEв тестовом step – Django не знает, какие настройки использовать. - Оставить
DATABASE_URLв пустом состоянии – тесты падают из‑за отсутствия соединения с БД. - Не включить
--cov-report=xml– отчёт покрытия не будет доступен для upload-artifact. - Неправильный тег Docker‑образа – при push в
ghcr.ioобраз не найдётся.
FAQ
Как добавить linting в workflow?
Добавьте step после установки зависимостей: flake8 src/ или black --check src/. Если тесты пройдут, linting можно выполнить параллельно.
Что делать, если тесты зависают на PostgreSQL?
Убедитесь, что сервис PostgreSQL готов к подключению: используйте --health-interval и --health-retries. Если всё равно, проверьте переменную DATABASE_URL и наличие миграций.
Можно ли использовать Docker‑сервисы для тестов, а не отдельный сервис?
Да, можно запустить Docker‑контейнер с БД в самом job, но это усложняет конфигурацию. Сервис проще и быстрее.
Заключение
- Убедитесь, что
requirements.txtсодержитpytest,pytest-djangoиcoverage. - Добавьте переменные окружения в секцию
envдля доступа к БД. - Проверьте, что Docker‑образ тегируется и пушится в нужный реестр.
- Регулярно обновляйте версии GitHub Actions и Docker.
- Периодически проверяйте покрытие тестами через
coverage.xml.
