self hosted github runner
CI и билд-раннеры
Сборки завершаются раньше, чем вы успеете переключить вкладку.
Что бы мы развернули
44,03 €/мес
62,90 €−30% ежегодно
Облачные CI-минуты тарифицируются, ставятся в очередь и работают медленно, а стоимость растет по экспоненте, как только команда начинает работать продуктивно. Пара экземпляров с выделенными ядрами и быстрым NVMe обгонит большинство облачных тарифов и будет стоить фиксированную сумму каждый месяц независимо от частоты push. Включена вложенная виртуализация, поэтому тестовые сценарии Docker-in-Docker и KVM работают без обходных путей.
Почему такая конфигурация
TORQUE дает количество ядер, Gen5 NVMe - пропускную способность артефактов, а вложенная виртуализация ничего не стоит. Зарегистрируйте раннеры в своей forge и удалите облачный план.
Что бы мы развернули
Размер
Два выделенных ядра и 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) · Включено
- Планирование CPU — Pinned physical cores · 9 €
- Хранилище и шифрование — ZFS with hourly snapshots · 7 €
Ещё
Для конкретных задач
Хостинг игровых серверов
Tick rate — это проблема одного потока. Всё остальное — шум.
VPS для трейдинга и низкой задержки
Расстояние до матчинг-движка и ничего между вами и проводом.
Приватные VPN и прокси-энdpoints
Собственный выход в юрисдикции, которую вы выбрали осознанно.
Сидбоксы и оптовое хранилище
Терабайты, которые остаются дешёвыми, и порт, который остаётся открытым.
Рабочие узлы Kubernetes
Дёшево за ядро, плотно и каждый раз одинаково.
Инференс и дообучение ИИ
Целый GPU, прокинутый насквозь, при обязательствах, которые делают расчёты рабочими.