Django Github CI не может подключиться к mysql 'db'

Выпуск

Пытаясь настроить действие Github для автоматического тестирования проекта Django, мы столкнулись с проблемой при настройке django.yml. Каждый раз, когда мы запускали .yml, мы получали следующее исключение на последнем шаге (python manage.py test):

django.db.utils.OperationalError: (2005, "Unknown MySQL server host 'db' (-3)")

По состоянию, наше окружение docker и тесты сами по себе работают нормально, просто при попытке сделать это в действии Github мы получаем проблемы.

Что мы пробовали

  1. Мы попробовали запустить docker-compose up -d перед запуском теста, чтобы точно знать, что наша БД работает.
  2. Пробовали добавлять переменные окружения с информацией о БД, например: https://github.com/Cuda-Chen/django-mysql-github-actions-demo/blob/main/.github/workflows/django-ci.yml
  3. .

Текущий код

name: Django CI

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  build:

    runs-on: ubuntu-latest
    strategy:
      max-parallel: 4
      matrix:
        python-version: [3.8]

    steps:
    - uses: actions/checkout@v3
    - name: Set up Python ${{ matrix.python-version }}
      uses: actions/setup-python@v3
      with:
        python-version: ${{ matrix.python-version }}
    - name: Install Dependencies
      run: |
        python -m pip install --upgrade pip
        pip install -r requirements.txt
    - name: Run Tests
      run: |
        python manage.py test

Кто-нибудь знает, что здесь происходит, и как мы можем это разрешить?

Django ищет базу данных с именем хоста db (из вашего файла настроек), которую он не может найти, потому что в окружении Github Actions нет хоста или сервиса, отвечающего этому имени.

Для того чтобы это работало в Github Actions, вам нужно настроить контейнер службы базы данных, создать пользователя root с паролем, а затем запустить Django с этими настройками, что позволит Django подключиться к контейнеру базы данных, создать базу данных, запустить миграции, а затем протестировать с этой базой данных testdatabase.

Вот рабочий пример (при необходимости вы можете дополнить его деталями своего проекта):

jobs:
  tests:
    runs-on: ubuntu-latest
    services:
      mysql:
        image: mysql:8.0
        env:
          # The MySQL docker container requires these environment variables to be set
          # so we can create and migrate the test database.
          # See: https://hub.docker.com/_/mysql
          MYSQL_DATABASE: testdb
          MYSQL_ROOT_PASSWORD: testrootpass
        ports:
          # Opens port 3306 on service container and host
          # https://docs.github.com/en/actions/using-containerized-services/about-service-containers
          - 3306:3306
        options: --health-cmd="mysqladmin ping" --health-interval=10s --health-timeout=5s --health-retries=3
    steps:
      - uses: actions/checkout@v3
      - name: Install Ubuntu dependencies
        run: |
          sudo apt-get update
          sudo apt-get install libcurl4-openssl-dev libmysqlclient-dev libgirepository1.0-dev
      - name: Setup Python
        uses: actions/setup-python@v3
        with:
          python-version: 3.8
      - name: Install Python dependencies
        run: |
          pip install -r requirements.txt
      - name: Run tests
        # These environment variables will take precedence over the ones in the Django settings file
        env:
          # Set the DJANGO_SECRET_KEY in the Github repo settings: Go to Secrets and variables > Actions > New repository secret 
          DJANGO_SECRET_KEY: ${{ secrets.DJANGO_SECRET_KEY }}
          DATABASE_NAME: testdb
          DATABASE_USERNAME: root          
          DATABASE_PASSWORD: testrootpass          
          DATABASE_ENDPOINT: 127.0.0.1 # Will not work with 'localhost', since that will try a Unix socket connection (!)
        run: |
            python manage.py migrate
            python manage.py test
Вернуться на верх