Зачем тесты в OTA‑пачке никогда не читают? Почему их убрать — победа
Вводка
Если открываешься в среде IoT, то в большом числе писем принялась лететь тишенька, вроде «старая версия прошивки 1.0.2». И тут, без предупреждений, частично в продакшн прилетает новый пакет 1.3.0. Почему он полон лишнего, если выстраивание не жаждет заглушать? Вы собираетесь один день летать по планшету, а явно заметили, что инсталляция скачивает почти 70 МБ. А разве в нём есть настоящая логика? Ни тестов, ни тех‑аккаунт, и не один байт кода, который реально повлияет на работу устройства.
Нам надо рассказать как будто за чашкой кофе. Я – девелопер, с 5 лет в сервисах, и я когда‑когда вижу, как разработчики выкладывают обновление с тестами, которые никогда не выполняются.
Где в итоге ложится груз?
- Утилита линкера, которая не знает о «неиспользуемом» и просто приносит всё, что находится в библиотеке. Это как собрать «склад» со всеми «сделанными» игрушками, даже если кто–нибудь ни разу ими не играл.
- Автоматический сбор тестов для CI/CD. Если вы включили «Coverall» в Jenkins, Jenkins каждый раз t‑проводит сборку, но потом пакует тестовый набросок в бинарник, даже самый лёгкий биска. Зачем? Потому что вы хотите, чтобы кто–нибудь мог видать все ошибки, которые не проявлялись в проде.
- Контейнеризованные API, где бойни скриптов пакуют документацию, атрибуты и мок‑сервера. Это уже не «прохладная» часть, а фактически полная дубликация данных. И тут «стандарт» – запаковать все, даже если язык использует упрощённые конструкции, которые удаляются на этапе доки.
Как это решаемо?
Первый шаг – аудит. Снимай пакет, разложи флаги, смотри, какие флаги gcc/clang линковали. Не тормози, но проверяйobjdump -p ./firmware | grep SONAME. Если видишь много «/lib/*.a» – это система, которая просто складывает файлы, даже если их никакой разметкой в коде нет.
Второй – разделение тестов и релизов. Просто создаёте отдельный «release branch» и в команде CI ставите условие: тесты надо собирать только если это «dev»‑рапит. В проде запускайтеmake release; он не будет включатьtests/*. Интересно, сколько раз мы позволили себе «dev‑пакет» пахнуть в проде?
Третий – использование статических флаг–прайтов. Говорят, что «-Wl,--gc-sections» сжимает мусор. Но для того чтобы он срабатывал, надо переспросить линкер, поставив-ffunction-sections
Комментарии