Ответ
Когда билд-инфо недоступно, я действую методом исключения и анализа доступных артефактов. Вот мой пошаговый подход:
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, используя тот же базовый образ, чтобы отловить специфичные для окружения проблемы.