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