GitLab CI не видит Redis: обращаемся к services по alias
Тесты проходят на ноутбуке с Redis на localhost, но в GitLab CI получают Connection refused. В job уже указан services с образом Redis, поэтому хочется добавить задержку или открыть порт. Сначала нужно понять, откуда тест обращается к localhost. В Docker executor тесты и вспомогательный сервис работают в разных контейнерах.
Loopback внутри job указывает на сам контейнер задания. Наличие Redis в соседнем контейнере не делает его процессом внутри тестового образа. Адрес сервиса задаётся именем в сети задания. Явный alias полезнее неявно вычисленного имени: по нему сразу видно, какое имя ожидает конфигурация приложения.
Назвать зависимость в pipeline
Для тестов, которые читают REDIS_URL, фрагмент конфигурации может выглядеть так. Образ Python используется только как среда запуска; файл требований и сами тесты должны находиться в репозитории.
integration:
image: python:3.12-slim
services:
- name: redis:7.4-alpine
alias: cache
variables:
REDIS_URL: redis://cache:6379/0
script:
- pip install -r requirements-test.txt
- pytest tests/integration
Здесь cache — адрес Redis для контейнера job. Публиковать порт на хост runner не требуется: общение идёт по внутренней сети задания. Порт в URL остаётся портом самого сервиса, а не произвольным портом, который вы использовали дома в docker run -p.
После исправления имени может проявиться другая ошибка: сервис запущен, но ещё не готов выполнить нужную команду. Это уже отдельная стадия. Проверка runner на доступность порта не заменяет готовность приложения или нужной схемы базы. Для интеграционных тестов полезен ограниченный по времени retry подключения с понятной ошибкой после исчерпания попыток. Бесконечный sleep просто делает красную job медленной.
Отличить DNS от протокола
Начните с сообщения клиента. Ошибка разрешения cache указывает на сеть, имя или executor, а отказ подключения — на адрес, порт либо состояние сервиса. Если инструмент доступен в образе, проверьте getent hosts cache; затем выполните безопасную команду Redis PING подходящим клиентом. Ответ PONG показывает больше, чем открытый TCP-порт: сервис понимает свой протокол.
Уточните executor runner. Синтаксис services в конфигурации не означает одинаковое поведение у любого способа исполнения. Этот разбор относится к контейнерной job с Docker executor. При shell executor зависимость нужно организовать иначе, и редактирование alias само по себе её не создаст.
После исправления запустите pipeline на чистом runner и убедитесь, что тест не обращается к Redis разработчика или общему серверу. Конфигурация окружения должна читаться явно, без скрытого fallback на localhost. Тогда изоляция CI становится частью теста, а не случайным свойством машины, где он однажды прошёл.
Продолжить практику
Исправление одной job полезно закрепить в полном процессе выпуска. В программе курса «GitLab CI/CD: автоматизация сборки и деплоя» — pipeline учебного приложения с проверками, тестами, сборкой Docker-образа, registry и staging. Отдельно разбираются runners, секреты, нестабильные запуски и возврат к предыдущему образу. Такой проект помогает увидеть, как решение внутри одной job влияет на выпуск версии и дальнейший откат.
Источник: официальная документация.
Другие задачи по теме: Окружение задания и повторяемый pipeline.
Продолжить на практике
- GitLab CI/CD: автоматизация сборки и деплоя ↗
От первого .gitlab-ci.yml до pipeline, который тестирует код, собирает образ и выкладывает приложение. Runners, artifacts, cache, registry, окружения и безопасный откат — на одном практическом проекте.
