В современных проектах 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.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *