Какие executors (исполнители) вы использовали в GitLab CI/CD и в каких сценариях?

«Какие executors (исполнители) вы использовали в GitLab CI/CD и в каких сценариях?» — вопрос из категории CI/CD, который задают на 24% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

В 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 является оптимальным по умолчанию.