VPS под GitLab Runner: сколько ресурсов нужно CI и когда свой раннер дешевле
Собственный раннер снимает лимиты общих минут и ускоряет пайплайны за счёт кэша. Разбираем, сколько ядер и памяти закладывать под параллельные джобы, почему диск заканчивается первым и где размещать раннер.
Когда есть смысл поднимать свой раннер
GitLab даёт общие раннеры с ограничением по минутам. Пока пайплайнов немного, этого хватает. Свой раннер начинает окупаться в трёх случаях: минут стабильно не хватает, сборки долгие и хочется их ускорить, либо в пайплайне нужен доступ к внутренней сети или специфическому окружению.
Второй мотив часто важнее первого. На своём раннере вы контролируете кэш зависимостей и слои Docker между запусками, а это обычно сокращает время сборки заметно сильнее, чем прирост от более быстрого процессора.
Третий сценарий — приватность: код и артефакты не покидают вашу инфраструктуру. Для части команд это решающий довод.
Сколько ресурсов закладывать
Отправная точка для одного раннера с одним-двумя параллельными джобами: 2 ядра, 4 ГБ оперативной памяти, диск от 40 ГБ. На этом комфортно собираются типовые веб-проекты и небольшие сервисы.
Для команды с регулярными пайплайнами и несколькими параллельными джобами — 4 ядра, 8 ГБ памяти, диск от 80 ГБ. Помните, что параллельные джобы делят ресурсы машины: четыре одновременные сборки на двух ядрах будут выполняться дольше, чем последовательно.
Настройка concurrent в конфигурации раннера должна соответствовать железу. Поставить восемь параллельных джобов на двухъядерной машине можно, но каждая сборка станет тормозить остальные, а на тяжёлых шагах вы упрётесь в память.
Диск заканчивается первым
Самая частая проблема самостоятельного раннера — не нехватка процессора, а закончившееся место. Docker-образы, слои сборки, кэш зависимостей и артефакты накапливаются с каждым запуском и без уборки съедают диск за недели.
Поэтому берите диск с запасом и обязательно настройте регулярную очистку неиспользуемых образов и томов. Тип диска тоже важен: сборка активно читает и пишет, и SSD или NVMe заметно быстрее HDD на этой нагрузке.
Отдельно заложите место под кэш, если пользуетесь им осознанно: кэш ускоряет пайплайны ровно до тех пор, пока для него есть место.
Где размещать раннер
Раннер общается с сервером GitLab, реестрами образов и репозиториями пакетов, поэтому важна не столько география, сколько стабильность и скорость канала.
Площадка в России удобна, если раннер должен ходить во внутреннюю сеть компании или деплоить на российские серверы — меньше задержка и проще с доступами. Европейская площадка бывает выгоднее, когда пайплайн активно тянет образы и пакеты из зарубежных реестров.
Если деплой идёт на ваши же серверы, разумно держать раннер рядом с ними: это сокращает время выкладки и упрощает сетевые правила.
Безопасность: раннер имеет доступ ко всему
Раннер выполняет код из репозитория и держит переменные окружения с секретами. Фактически это машина с доступом к вашим ключам деплоя, реестрам и, возможно, продакшену.
Отсюда два правила. Первое: не запускайте на одном раннере пайплайны из доверенных и недоверенных источников — например, сборки merge request от внешних участников. Второе: используйте Docker executor, чтобы каждая сборка шла в изолированном контейнере, а не напрямую в системе.
И держите раннер отдельно от продакшен-серверов: компрометация сборочной машины не должна автоматически означать компрометацию боевой.
Типичные ошибки
Поставить количество параллельных джобов больше, чем тянет железо. Пайплайны начинают мешать друг другу, и общее время растёт вместо того, чтобы падать.
Не настроить очистку Docker-образов. Через несколько недель раннер встанет с ошибкой нехватки места, обычно в самый неудачный момент.
Экономить на памяти: сборки фронтенда и тесты с поднятой базой данных потребляют её заметно больше, чем кажется по размеру проекта.
Держать раннер на той же машине, что и продакшен, ради экономии.
Чек-лист перед выбором
- Оцените, сколько параллельных джобов вам реально нужно, и приведите concurrent в соответствие с ядрами
- Заложите память с запасом: сборки фронтенда и тесты с базой требуют больше, чем кажется
- Берите SSD или NVMe — сборка активно читает и пишет
- Настройте регулярную очистку Docker-образов и томов с первого дня
- Оставьте место под кэш зависимостей, если планируете им пользоваться
- Разместите раннер рядом с целью деплоя, если выкладываете на свои серверы
- Используйте Docker executor и не смешивайте доверенные и внешние пайплайны
- Держите раннер отдельно от продакшен-серверов
Частые вопросы
Сколько ресурсов нужно для GitLab Runner?
Для одного раннера с одним-двумя параллельными джобами достаточно 2 ядер, 4 ГБ оперативной памяти и диска от 40 ГБ. Для команды с регулярными пайплайнами и несколькими параллельными сборками берите 4 ядра, 8 ГБ памяти и диск от 80 ГБ. Параллельные джобы делят ресурсы машины, поэтому настройка concurrent должна соответствовать железу.
Зачем свой раннер, если есть общие?
Есть три причины. Общих минут перестало хватать; нужно ускорить сборки за счёт контроля над кэшем зависимостей и слоями Docker между запусками; либо пайплайну нужен доступ во внутреннюю сеть или особое окружение. На практике выигрыш от кэша часто оказывается заметнее, чем от более быстрого процессора.
Почему на раннере постоянно заканчивается место?
Docker-образы, слои сборки, кэш зависимостей и артефакты накапливаются с каждым запуском. Без регулярной очистки неиспользуемых образов и томов диск заполняется за недели. Это самая частая проблема самостоятельных раннеров — чаще, чем нехватка процессора или памяти.
Можно ли держать раннер на том же сервере, что и продакшен?
Не стоит. Раннер выполняет код из репозитория и хранит переменные окружения с секретами — фактически это машина с доступом к ключам деплоя и реестрам. Компрометация сборочной машины не должна автоматически означать компрометацию боевого сервера, поэтому их разделяют.