К вам приходит разработчик и говорит, что stage в CI/CD, который позавчера проходил 10 минут, а сейчас проходит полчаса. Код не менялся. С чем это может быть связано?

«К вам приходит разработчик и говорит, что stage в CI/CD, который позавчера проходил 10 минут, а сейчас проходит полчаса. Код не менялся. С чем это может быть связано?» — вопрос из категории CI/CD, который задают на 23% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Внезапное замедление stage при неизменном коде — классическая задача для DevOps. Я бы начал расследование с проверки инфраструктуры и зависимостей.

Основные причины:

  1. Проблемы с ресурсами CI-раннера: Нехватка CPU, памяти или дискового I/O. Возможно, на том же хосте запущены другие тяжелые задачи.
  2. Сетевые задержки: Замедление при скачивании зависимостей (образов Docker, пакетов из npm/pip/Maven) или обращении к внешним сервисам (артефактории, S3).
  3. Изменения в зависимостях: Косвенное обновление базового образа Docker или версии пакета в lock-файле, которое привело к скачиванию большего объема данных или более тяжелой runtime-среде.
  4. Проблемы с внешними системами: Замедление базы данных, используемой в тестах, или кэширующего сервера.
  5. Конфигурация пайплайна: Изменение таймаутов, шагов или условий выполнения stage, о котором забыли.

Пример диагностики:

# Проверим нагрузку на раннере (если это наш сервер)
ssh runner-host 'top -bn1 | head -20'

# Посмотрим логи конкретного пайплайна в GitLab CI
# Ищем этапы с наибольшей длительностью
cat job-log.json | jq -r '.stages[] | select(.name=="test") | .duration'

# Проверим размер скачанных зависимостей в кэше Docker
docker system df

Первым делом я бы сверил метрики мониторинга (например, Grafana dashboard для CI-инфраструктуры) и сравнил логи последнего медленного запуска с предыдущим успешным.