CrestVPS

self hosted github runner

CI и билд-раннеры

Сборки завершаются раньше, чем вы успеете переключить вкладку.

Что бы мы развернули

44,03 €/мес

62,90 €30% ежегодно

Облачные CI-минуты тарифицируются, ставятся в очередь и работают медленно, а стоимость растет по экспоненте, как только команда начинает работать продуктивно. Пара экземпляров с выделенными ядрами и быстрым NVMe обгонит большинство облачных тарифов и будет стоить фиксированную сумму каждый месяц независимо от частоты push. Включена вложенная виртуализация, поэтому тестовые сценарии Docker-in-Docker и KVM работают без обходных путей.

Почему такая конфигурация

TORQUE дает количество ядер, Gen5 NVMe - пропускную способность артефактов, а вложенная виртуализация ничего не стоит. Зарегистрируйте раннеры в своей forge и удалите облачный план.

Что бы мы развернули

PlanTORQUE T2
vCPU8 (dedicated)
RAM32 GB
Хранилище400 GB
ОбразUbuntu Server 24.04 LTS

Размер

Два выделенных ядра и 4 ГБ на одну параллельную задачу - это минимум; для компилируемых языков нужно 4 ядра и 8 ГБ. Таким образом, узел TORQUE на 32 ядра выполняет 8 тяжелых задач или около 14 легких, а не 32. Скретч-диск важнее: планируйте 30-50 ГБ на NVMe на одну параллельную задачу для слоев образов, деревьев зависимостей и результатов сборки. Добавьте одно ядро на узел, если задачам нужна вложенная виртуализация. Время ожидания в очереди, а не продолжительность задачи, подскажет, когда добавлять узел.

Вложенная виртуализация и когда она нужна

Большинство CI-задач выполняется в контейнере. Три случая требуют настоящего гипервизора внутри гостевой ОС: тестирование VM-образов и cloud-init, запуск эмуляторов Android или встроенных систем с ускорением KVM, и любая задача, где ненадежный pull request выполняет код, который не должен дотянуться до раннера. TORQUE открывает SVM гостевой системе, поэтому KVM работает внутри вашего VPS, и эмулятор работает на нативной скорости, а не через программную эмуляцию, что примерно на порядок быстрее для тестовых наборов Android. Стоимость - одно ядро накладных расходов для внешнего гипервизора и немного более медленный диск во внутренней гостевой системе. Учитывайте оба фактора.

Путь артефактов - обычно узкое место

Профилируйте медленный пайплайн - шаг компиляции редко бывает самым длинным. Скачивание базовых образов, восстановление кэшей, загрузка артефактов и отправка результата занимают большую часть времени в типичных сборках. Три исправления в порядке убывания эффекта: держите pull-through кэш реестра в той же частной VLAN, чтобы слои приходили по локальной сети, а не через публичный интернет; поместите скретч на NVMe, чтобы распаковка слоев не упиралась в seek; сделайте ключ кэша точным, чтобы восстанавливать только нужное, а не монолитный архив. Ядра Bergamo плотные и дешевые. Ожидание в сети - нет.

Что идёт не так

  • Наложение overlayfs на overlayfs для Docker-in-Docker. Вложенные overlay-драйверы медленные и периодически повреждают слои. Используйте выделенное блочное устройство внутри задачи или запускайте сборщик поверх вложенного KVM.
  • Отсутствие очистки. Висячие образы, кэши сборки и устаревшие тома заполняют скретч-NVMe за недели, и первый симптом - сбой сборки на шаге, который работал год. Очищайте по таймеру, а не по факту сбоя.
  • Превышение времени кэширования над временем сборки. Передача и скачивание кэша зависимостей на 3 ГБ на задачу может стоить дороже, чем компиляция с нуля. Измеряйте оба показателя и держите кэш в той же частной VLAN, что и раннеры.

Настройте машину

  • Всё остальноеNested virtualisation (VMX/SVM) · Включено
  • Планирование CPUPinned physical cores · 9 €
  • Хранилище и шифрованиеZFS with hourly snapshots · 7 €