Ответ
В GitLab Runner можно настроить разные executors, и выбор зависит от требований к изоляции, скорости и среде выполнения. Я работал со следующими:
1. Docker (Наиболее часто используемый): Запускает каждую джобу в отдельном контейнере. Идеален для воспроизводимости и чистоты окружения.
- Сценарий: Сборка и тестирование приложений на разных версиях Node.js/Python/Go.
-
Пример
.gitlab-ci.yml:build: stage: build image: golang:1.21-alpine script: - go build -o myapp ./cmd/app artifacts: paths: - myapp test: stage: test image: golang:1.21-alpine services: - postgres:15-alpine # Запуск сервиса-контейнера (БД) рядом с джобой variables: POSTGRES_DB: test_db script: - go test -v ./...
2. Kubernetes: Запускает каждую джобу как Pod в Kubernetes-кластере. Обеспечивает наилучшую масштабируемость и интеграцию с инфраструктурой.
- Сценарий: В средах, где вся инфраструктура работает на k8s. Позволяет запрашивать специфичные ресурсы (CPU/RAM) и использовать ServiceAccounts для доступа к кластеру.
- Конфигурация Runner (
config.toml):concurrent = 10 [[runners]] name = "k8s-runner" url = "https://gitlab.example.com" token = "__TOKEN__" executor = "kubernetes" [runners.kubernetes] namespace = "gitlab-runner" image = "alpine:latest" cpu_limit = "1" memory_limit = "1Gi"
3. Shell: Выполняет команды напрямую на хосте, где установлен Runner. Самый быстрый, но без изоляции.
- Сценарий: Развертывание (deployment) на том же сервере, где работает Runner (например, для простых стендов). Или для задач, требующих прямого доступа к хосту (обновление самого Runner'а).
- Важно: Требует тщательного контроля безопасности и чистки окружения между джобами.
4. Docker Machine + Docker (Auto-scaling): Использовал в облачных средах для автоматического создания виртуальных машин под нагрузкой. Runner создает временные инстансы в AWS EC2 или GCP Compute Engine, запускает на них джобы в Docker, а затем уничтожает инстансы. Отлично подходит для экономии ресурсов при непостоянной нагрузке.
Выбор executor'а — это всегда компромисс между скоростью, безопасностью, воспроизводимостью и стоимостью. Для большинства проектов Docker executor является оптимальным по умолчанию.