Как выяснить причину сбоя в пайплайне CI/CD, если информация о сборке (buildinfo) отсутствует?

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

Ответ

Когда билд-инфо недоступно, я действую методом исключения и анализа доступных артефактов. Вот мой пошаговый подход:

1. Анализ логов пайплайна: Первым делом смотрю сырые логи выполнения джобы в интерфейсе CI/CD (GitLab CI, Jenkins, GitHub Actions). Ищу строки с ERROR, FAILED, exception. Часто ошибка кроется в последних 50-100 строках лога.

2. Использование git bisect для поиска "плохого" коммита: Это золотой стандарт, когда сбой связан с кодом, а не с инфраструктурой.

git bisect start
# Помечаем текущий HEAD как сломанный
git bisect bad
# Помечаем последний известный рабочий коммит
git bisect good v1.2.0
# Git будет автоматически перемещаться по коммитам.
# Для каждого коммита запускаем скрипт, проверяющий сборку/тесты.
git bisect run ./scripts/test-build.sh
# После завершения Git укажет на первый "плохой" коммит.
git bisect reset

3. Сравнение окружений и зависимостей:

  • Зависимости: Сравниваю package-lock.json, yarn.lock, Pipfile.lock, Gemfile.lock между рабочей и сломанной версиями. Внезапное обновление минорной версии библиотеки может сломать сборку.
  • Конфигурация CI/CD: Проверяю изменения в файле конфигурации (.gitlab-ci.yml, Jenkinsfile, .github/workflows/). Часто проблема в изменении образа Docker (image:), секретов или шагов.

4. Проверка артефактов и кэша: В GitLab CI можно принудительно перезапустить пайплайн с очисткой кэша (CI/CD -> Pipelines -> Run Pipeline -> Clear runner caches). Проблема могла быть в "протухшем" кэше зависимостей.

5. Анализ системных причин:

  • Квоты и лимиты: Закончилось место на диске раннера, исчерпана память, превышено время выполнения джобы.
  • Внешние сервисы: Сбои в Nexus, Docker Hub, npm registry, которые использовались во время сборки.

6. Воспроизведение локально: Пытаюсь воспроизвести среду раннера локально с помощью Docker, используя тот же базовый образ, чтобы отловить специфичные для окружения проблемы.