Когда GitLab Runner нашел 5 ошибок TypeScript за 9 секунд

GitLab Runner сломал сборку: как мы спасали TypeScript проект
Понедельник, 10 февраля. В 17:32 на сервере vmi3037455 запустился очередной CI/CD пайплайн нашего проекта trend-analisis. GitLab Runner 18.8.0 уверенно начал свою работу: клонировал репозиторий, переключился на коммит f7646397 в ветке main, установил зависимости. Всё шло как надо, пока…
Сначала казалось, что всё в порядке. npm ci отработал чисто: 500 пакетов установилось за 9 секунд, уязвимостей не найдено. Команда npm run build -- --mode production запустилась, TypeScript компилятор включился. И вот тут — взрыв.
Пять ошибок TypeScript сломали всю сборку. Сначала я подумал, что это очередное невезение с типизацией React компонентов. Но посмотрев внимательнее на стек ошибок, понял: это не просто синтаксические проблемы. Это был признак того, что в коде фронтенда рассинхронизировались типы между компонентом и API.
Проблема первая: в файле src/routes/_dashboard/analyze.$jobId.report.tsx компонент ожидал свойства trend_description и trend_sources на объекте AnalysisReport, но они попросту не существовали в типе. Это классический случай, когда один разработчик обновил API контракт, а другой забыл синхронизировать тип на фронтенде.
Проблема вторая: импорт @/hooks/use-latest-analysis исчез из проекта. Компонент src/routes/_dashboard/trend.$trendId.tsx отчаянно его искал, но находил только воздух. Кто-то либо удалил хук, либо переместил его, не обновив импорты.
Проблема третья совсем коварная: в роутере используется типизированная навигация (похоже, TanStack Router), и при переходе на страницу /analyze/$jobId/report не хватало параметра search в типе. Компилятор был совершенно прав — мы пытались пройти валидацию типов с неполными данными.
Иронично, что всё это выглядит как обычная рабочая пятница в любом JavaScript проекте. TypeScript здесь одновременно наш спаситель и палач: он не позволит нам развернуть баг в production, но заставляет потратить время на то, чтобы привести типы в порядок.
Интересный факт: GitLab Runner использует shallow clone с глубиной 20 коммитов для экономии трафика — видите параметр git depth set to 20. Это означает, что пайплайн работает быстро, но иногда может не найти необходимые коммиты при работе с историей. В данном случае это не помешало, но стоит помнить при отладке.
В итоге перед нами встала классическая задача: синхронизировать типы TypeScript, переимпортировать удалённые хуки и обновить навигацию роутера. Сборка не пройдёт, пока всё это не будет в порядке. Это момент, когда TypeScript раскрывает свою суть: быть стеной между плохим кодом и production.
Дальше предстояла работа по восстановлению целостности типов и проверка, не сломали ли мы что-нибудь ещё в спешке. Welcome to the JavaScript jungle! 😄
Метаданные
- Dev Joke
- Если npm работает — не трогай. Если не работает — тоже не трогай, станет хуже.