top of page

Тисяча запусків збірки на місяць — і жоден не коштує ні копійки ⚙️

Фото автора: Marcel Dütscher
Marcel Dütscher
26 лип.
Читати 3 хв

Спершу виправлення. У першій версії цієї статті стверджувалося, що наші хвилини збірки на GitHub закінчилися і це змусило перейти на акаунт Pro. Це було неправдою, і один погляд у документацію усунув би цю помилку: для публічних репозиторіїв хвилини збірки на GitHub безкоштовні. Артефакти й кеші теж. Наш репозиторій публічний із кінця травня — тож ми ніколи не платили за жодну хвилину і ніколи не платитимемо. Замість того щоб тихо виправити текст, ми вважаємо за краще переписати його й розповісти, що насправді показали виміри. Це виявляється значно цікавішим, ніж хибна версія.


Спершу здогад, потім погляд. Поштовхом став вечір, коли готовий pull request стояв у браузері, а жодна перевірка не запускалася. Жодних зелених галочок, лише тиша. Ми вхопилися за очевидне пояснення — «квоту вичерпано» — і взяли акаунт Pro. Після цього все знову запрацювало, що, здавалося, підтверджувало теорію. Але ні: тиша мала іншу причину (pull request, який GitHub у цей момент не може чисто злити з головною гілкою, не запускає жодних перевірок). Відтоді ми запитали дані білінгу кожного окремого запуску. Відповідь для кожного запуску й кожної операційної системи: оплачуваний час = 0 мілісекунд. Підтримувати платформу підпискою цілком нормально — але як пояснення для цього репозиторію воно не тримається.


Що правда: механізм виріс. Кожен pull request запускає невелику фабрику: збирається весь сервер і запускається його набір тестів, лінтер і аналіз коду переглядають його, CodeQL шукає діри в безпеці, а також створюються образи Docker для ігрового сервера, порталу, WorldHost і ШІ-бекенду. Реліз додає збірки клієнта для Windows, Linux і macOS, а також WebGL-версію для браузерної гри. З кінця травня це складається в 1 723 запуски збірки, 1 092 з них — лише в липні — за 131 злитий pull request за чотири тижні. І так, нещодавній сплеск справді пов'язаний зі ШІ 😉: проєкт розробляється на 100% за допомоги ШІ, і з більшою підпискою просто більше всього відбувається паралельно. Лише валюта не гроші — а час очікування.


Куди йде час очікування. Виміряно за вісім днів: звичайний запуск перевірок (CI) — 379 хвилин, аналіз безпеки CodeQL — 230, збірки релізів — 126, решта — дрібниці. Один реліз коштує близько 110 хвилин обчислень, розподілених між WebGL (31,6), образом Docker (19,4), macOS (13,7), Linux (13,7), великим тестовим бар'єром (12,1), Windows (10,9) і пакуванням (7,2). Це час між «готово» і «можна встановити вам».


А тепер те, чого справді не вистачає: кеш. Щоб збірка щоразу не починалася з нуля, GitHub зберігає проміжні результати — і для цього ви отримуєте 10 ГБ на репозиторій, хоч який публічний він би був. Наш зараз містить 5,3 ГБ у 63 записах. Проблема в розподілі: приблизно дві третини — це проміжні шари Docker, які завантажуються заново на кожному запуску, — і вони витісняють саме те, що допомогло б найбільше. Це справжнє вузьке місце, і жодна підписка у світі не дозволить його обійти.


Найприємнішою знахідкою став справжній баг. Під час збірки Unity створює величезну проміжну теку (Library), повторне використання якої заощаджує хвилини. Вимірювання показало: для Windows, Linux і macOS ця тека ніколи не зберігалася — збірки сумлінно намагалися її відновити, але ніхто її ніколи не записував. А збірка для Windows була єдиною з ключем кешу без позначки платформи. Результат: вона завантажувала 1,7 ГБ проміжного стану WebGL, який Unity потім сумлінно викидала, перш ніж знову імпортувати все. Журнал показує це чорним по білому: 257 секунд імпорту ресурсів замість 85 у «теплому» випадку. Це майже дев'ять хвилин, змарнованих на реліз, — бо в ключі бракувало одного слова.


Що ще знайшлося. Наш набір тестів запускається тричі на кожен випущений коміт (у pull request, після злиття і ще раз під час релізу). CodeQL перевіряє три мови на кожному pull request, хоча це навіть не обов'язкова перевірка. Кеш для пакетів .NET відсутній зовсім. Емулятор для чужих архітектур процесорів налаштовується, хоча ми збираємо лише під одну. А 7,4 ГБ старих артефактів збірки лежать за типового 90-денного зберігання. Нічого драматичного — але разом це чималий шматок життя.


Урок той самий, якого нас навчив наш сервер. Тоді ми виміряли, що половина зайнятої пам'яті йшла зовсім не на гру, а на Docker і моніторинг. Цього разу було ще прикріше: ми припустили рахунок, якого ніколи не існувало, і заплатили, не глянувши. Вимірюй, а не здогадуйся — це речення, схоже, діє, доки не засвоїш його по-справжньому. Роботи з наведення ладу заплановані, але ще не виконані; коли вони пройдуть, ми розповімо, що це нам дало. 🚀

Останні пости

Дивитися всі
Чому нова версія називається 2026.7.19, а не 0.9.2 🗓️

Хто оновлюється сьогодні, перестрибує з версії 0.9.1 на 2026.7.19. Це схоже на помилку друку, але це навмисне рішення: ми змінили схему версіонування, від «семантичних» версій до версій за датою (рік.

 
 

Коментарі


Коментування цього посту більше не доступне. Зверніться до власника сайту, щоб дізнатися більше.
bottom of page