services: контейнеры
Тема дорожной карты · GitHub Actions
Ключ services: в определении job в GitHub Actions запускает Docker-контейнеры в качестве сетевых сайдкаров, работающих рядом с шагами job, что позволяет легко предоставлять зависимости вроде баз данных, брокеров сообщений или кеш-слоёв для интеграционных тестов в CI/CD-пайплайне. Каждый сервис, объявленный в services:, запускается до выполнения steps: job, а GitHub Actions автоматически пробрасывает его порты, чтобы тестовый код мог подключаться через localhost:<port> или имя хоста сервиса в сети runner. Типичные сервисные контейнеры — postgres:15, redis:7, rabbitmq:3-management — конфигурируются переменными окружения в env: и параметрами health-check, гарантирующими готовность контейнера до запуска пайплайна. Контейнерные сервисы в GitHub Actions устраняют необходимость устанавливать и настраивать зависимости непосредственно на runner, делая автоматизацию workflow чище и ближе к производственной топологии. Блок services: доступен как на Linux-based GitHub-hosted runners, так и на self-hosted runners с установленным Docker, и каждый сервис автоматически останавливается после завершения job.
Как это работает
services: контейнеры: docker/build-push-action, docker/login-action, docker/setup-buildx-action — каноническое трио для build + push образа. Multi-arch через buildx + qemu (docker/setup-qemu-action). Build-кеш через cache-from: type=gha + cache-to: type=gha (использует GHA-cache backend — встроенная поддержка). Container-actions (ваш action работает внутри Docker-образа) и service containers (services: блок для sidecar БД, Redis при тестах).
Когда применять
buildx — для любого нетривиального Docker-образа: multi-arch + layer cache + cross-platform. Push в GHCR (ghcr.io) — бесплатный приватный storage, привязанный к репо. services: — для integration-тестов с Postgres/Redis/Kafka: стартуют до шагов. Multi-stage Dockerfile + buildx cache + GHA-cache backend даёт < 2 мин пересборки на cache hit.
Типичные ошибки
Ловушки services: контейнеры: push образов на каждый PR (засорённый registry — push только с main); базовые Docker-образы не запиннены по digest (сегодняшний node:22-alpine ≠ завтрашний); docker login напрямую с PAT вместо docker/login-action (теряет ergonomic-улучшения); долгие multi-arch сборки без buildx-кеша (10× медленнее).