Хостинг GitLab Runner на машине, которая принадлежит вам
Самоуправляемый runner в Праге или Ковильяне, которому принадлежит весь диск, поэтому кеш слоёв Docker всё ещё на месте на втором конвейере за день, а счёт не меняется, когда меняется сборка.
Для кого это
Команда, покупающая вычислительные минуты
Набор тестов вырос, конвейер стал длиннее, счёт пошёл вверх - и единственный рычаг, который предлагает тариф, это купить ещё больше точно тех же минут.
Конвейер, которому нужна одна и та же машина дважды
Каждая задача стартует с пустого диска. Базовый образ скачивается заново, зависимости тянутся заново, а выгрузка кеша занимает больше времени, чем шаг, который он должен был сэкономить.
Репозиторий под требованием резидентности
Код, артефакты и ключи развёртывания проходят через runner, а "общий парк машин где-то там" - это ответ, который ваш аудитор раз за разом обводит красным.
Что возвращает вам самоуправляемый runner
- Тёплый кеш слоёв Docker на локальном NVMe, чтобы второй конвейер за день начинался там, где закончился первый, а не с пустого диска.
- Любой executor на выбор - docker, shell, docker-autoscaler, instance или kubernetes - выбираемый для каждого runner, а не выданный тарифом.
- Собственная параллельность, заданная числом в config.toml, а не купленная как следующая ступень.
- Привилегированный режим, когда вам действительно нужен Docker-in-Docker, чего ни один общий парк машин вам никогда не даст.
- Статический исходящий IPv4 из AS204057, чтобы цель развёртывания, зеркало пакетов или файрвол базы данных мог разрешить runner по адресу.
- То, что сборке действительно нужно на хосте: старый набор инструментов, лицензированный SDK или набор тестовых данных, который никто не хочет качать на каждую задачу.
Размер по тому, что конвейер делает на самом деле
GitLab не публикует требований к железу для самого runner, и это не упущение: процесс runner мал, а сборка - нет. Значение имеет задача. Возьмите самую тяжёлую задачу, которую выполняете сегодня, умножьте на нужную параллельность и не жалейте диска - его заполняют кеш слоёв и рабочий каталог, а полный диск валит конвейер так, что это выглядит как сломанный тест. Одного фиксированный месячный хост не делает: он не исчезает в спокойную неделю. Минуты у провайдера не стоят ничего, когда никто не пушит, а это стоит столько же. Оно окупается с момента, когда конвейер работает почти каждый день.
Как установить GitLab Runner на новом хосте
Debian или Ubuntu, с чистого сервера, в том порядке, который документирует GitLab. Всё ниже - их последовательность, не наша.
-
Добавьте официальный репозиторий пакетов
curl -L "https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh" -o script.deb.sh less script.deb.sh sudo bash script.deb.shGitLab поставляет репозиторий как сценарий установки и просит прочитать его перед запуском - именно поэтому их собственная инструкция сначала скачивает его, а не передаёт сразу в оболочку.
-
Установите runner
sudo apt install gitlab-runnerПакет создаёт системного пользователя gitlab-runner, домашний каталог которого создаётся пустым, без файлов-шаблонов. Чтобы зафиксировать версию, установите gitlab-runner и gitlab-runner-helper-images вместе одной версии - с 17.7.1 они идут парой, и упоминание только одного завершается ошибкой зависимостей.
-
Установите Docker, если задачи выполняются в контейнерах
sudo apt install docker.io sudo systemctl enable --now dockerExecutor docker общается с локальным Docker Engine через API v1.25, поэтому демон должен быть на самом хосте runner. Пакета из дистрибутива достаточно для начала; собственный репозиторий Docker содержит более новые выпуски, если какой-то сборке они нужны.
-
Зарегистрируйте runner
sudo gitlab-runner register \ --non-interactive \ --url "https://gitlab.com/" \ --token "$RUNNER_TOKEN" \ --executor "docker" \ --docker-image alpine:latest \ --docker-pull-policy "if-not-present" \ --description "docker-runner"Сначала создайте runner в GitLab, в Settings, затем CI/CD, затем Runners - он вернёт токен аутентификации, начинающийся с glrt-, который идёт в --token. Теги задач и параметр для задач без тегов задайте в той же форме: с токенами аутентификации они принадлежат runner, а не команде register. Более старый путь с --registration-token устарел и запланирован к удалению в GitLab 20.0.
-
Задайте параллельность и запустите
sudo sed -i "s/^concurrent = .*/concurrent = 4/" /etc/gitlab-runner/config.toml sudo gitlab-runner restart sudo gitlab-runner statusconfig.toml лежит в /etc/gitlab-runner, когда runner работает от root. concurrent - это потолок для всех runner, зарегистрированных на этом хосте, а не настройка для каждого по отдельности, и каждый runner может нести под ней собственный, меньший лимит.
-
Проверьте это одной задачей
stages: [test] smoke: stage: test tags: [docker-runner] script: - cat /etc/os-release - echo "built on $CI_RUNNER_DESCRIPTION"Закоммитьте это как .gitlab-ci.yml, сделайте push, и задача должна попасть на ваш хост за несколько секунд. Если она остаётся в очереди, теги не совпадают с теми, что вы задали в интерфейсе, или runner привязан к другому проекту.
Сверено с официальной документацией 2026-08-15 — читать первоисточник
Чем мы не являемся
- Мы не GitLab. GitLab, GitLab CI/CD и GitLab Runner принадлежат им, и ничто на этой странице ими не одобрено. Мы продаём машину, на которой работает runner.
- Эта страница не о хостинге самого GitLab. Самоуправляемый экземпляр GitLab - это машина побольше и другой разговор; спросите, и мы её подберём, но здесь оценена не она.
- Мы не пишем ваш .gitlab-ci.yml. Конвейер ваш; хост, сеть и адрес - наши.
- Runner не обслуживается за вас, если вы об этом не попросите. Вы устанавливаете его сами или добавляете нашу услугу администрирования, и мы держим его обновлённым, зарегистрированным и под наблюдением.
- Ваша подписка GitLab остаётся у GitLab. Самоуправляемый runner не расходует их вычислительные минуты, в этом и смысл, но и лицензии пользователей он не заменяет.
Части, которые команды обнаруживают поздно
- Путь с регистрационным токеном уходит в прошлое. Runner, созданный в интерфейсе, возвращает токен аутентификации glrt-, который gitlab-runner register принимает как --token, а --registration-token запланирован к удалению в GitLab 20.0.
- Теги ушли вместе с ним. С токеном аутентификации теги задач, параметр без тегов и привязка принадлежат объекту runner, созданному в интерфейсе, поэтому флаги, которые раньше задавали их в командной строке, больше ничего не решают.
- Зафиксировать версию значит зафиксировать два пакета. С 17.7.1 явная версия gitlab-runner требует ещё и gitlab-runner-helper-images той же версии, иначе apt отказывает в установке.
- check_interval по умолчанию равен 3 секундам. На хосте со множеством зарегистрированных runner это очень много опросов; поднимите значение, прежде чем винить сеть.
- Docker-in-Docker требует привилегированного режима, что фактически даёт задаче root на хосте. Если конвейер только собирает образы, безрутовый сборщик вроде Kaniko или Buildah - более выгодный обмен.
- Артефакты и кеши по-прежнему путешествуют в GitLab, пока вы не направите кеш в собственный S3-совместимый бакет. На runner, который вы намеренно перенесли в ЕС, это обычно последний переход, оставшийся перенести.
Минуты CI у провайдера против собственного runner
| Минуты CI на стороне провайдера | Раннер на DCXV | |
|---|---|---|
| За что вы платите | За каждую минуту каждой задачи, пока существует проект | За фиксированный месячный хост, что бы конвейер ни делал в этом месяце |
| Сборка, которая замедляется | Стоит дороже каждый месяц, пока остаётся медленной | Не стоит ничего дополнительно - машина уже оплачена |
| Кеш слоёв Docker | Холодный на каждой задаче, если вы сами его не выгружаете и не загружаете | Тёплый на локальном NVMe, между задачами и между днями |
| Параллельность | Ступень тарифа, которую повышают | Число, которое вы задаёте в собственном файле конфигурации |
| Куда попадает checkout | На общий парк машин, часто в регионе, который невозможно зафиксировать | На одну машину в Праге или Ковильяне, по кипрскому договору |
| Исходящий адрес | Огромный общий диапазон, который ничем не разрешить | Один статический IPv4 из AS204057, ваш, чтобы его разрешать |
| Что может вместить машина | То, что случайно несёт образ runner | Любой набор инструментов, лицензию или набор тестовых данных, установленный один раз |
Как это запускается на вашем хосте
Скажите, что делает конвейер
Самая тяжёлая задача, которую вы выполняете сегодня, сколько их должно идти одновременно и собирает ли она образы контейнеров. Этого достаточно, чтобы подобрать хост без догадок.
Мы передаём машину
Прага или Ковильян, доступ root и статический IPv4, менее чем за десять минут. Принесите собственный образ, если runner уже внутри него.
Выполните пошаговую инструкцию с этой страницы
Это последовательность производителя, взятая из его текущей документации, а не из записи в блоге, и на чистом хосте она занимает несколько минут.
Сделайте снимок, а потом добавьте второй
Сделайте снимок, как только первый конвейер станет зелёным, чтобы следующая машина была восстановлением, а не сборкой с нуля. Пул растёт добавлением хостов, а не раздуванием одного.
Почему выбирают нас
- Сертифицированные объекты Tier III, SLA объекта 99,982 %
- Собственная сеть, AS204057, IPv4 и IPv6
- Поддержка 24/7/365 со средним временем ответа около 10 минут
- Компания на Кипре, юрисдикция ЕС, соответствие GDPR с 2007 года
FAQ
- Чем общий runner отличается от самоуправляемого?
Общий runner - это машина GitLab, и вы платите за минуты, которые она тратит на вашу задачу. Самоуправляемый runner - это ваша машина: вы устанавливаете на неё gitlab-runner, регистрируете её для своего проекта, группы или экземпляра, и она не расходует вычислительные минуты вовсе. Пространства имён на бесплатном тарифе GitLab получают 400 вычислительных минут в месяц, и оживлённый конвейер проходит их за дни
- Как установить и зарегистрировать GitLab Runner?
Добавьте их репозиторий apt из сценария установки на packages.gitlab.com, установите пакет gitlab-runner, а затем запустите gitlab-runner register в неинтерактивном режиме с токеном аутентификации, который GitLab выдаёт при создании runner в интерфейсе. Полная последовательность с точными командами есть на этой странице, взятая из их документации, а не из записи в блоге
- Регистрируют ли runner до сих пор регистрационным токеном?
Нет, и именно это изменение ломает большинство старых руководств. Сначала создайте runner в интерфейсе GitLab, и он вернёт токен аутентификации, начинающийся с glrt-, который gitlab-runner register принимает как --token. Старый путь с --registration-token устарел и запланирован к удалению в GitLab 20.0. Теги задач, параметр без тегов и привязка теперь принадлежат объекту runner, созданному в интерфейсе, а не команде register
- Какого размера сервер нужен GitLab Runner?
GitLab не публикует требований к железу для самого runner, потому что процесс runner мал, а ваша сборка - нет. Подбирайте по самой тяжёлой задаче, умноженной на нужную параллельность. На практике 4 vCPU, 8 ГБ и 120 ГБ NVMe тянут две-три задачи одновременно; 8 vCPU, 16 ГБ и 240 ГБ тянут от шести до восьми. Не жалейте диска - его заполняют кеш слоёв Docker и рабочий каталог
- Нужен ли Docker на хосте runner?
Только если вы пользуетесь executor docker, а так делает большинство. Он общается с локальным Docker Engine через API v1.25, поэтому демон должен быть установлен на самом хосте runner. Executor shell не требует Docker вовсе, а executor instance и docker-autoscaler создают машины в другом месте
- Могут ли несколько runner делить один хост?
Да, и это обычная форма. Регистрируйте сколько угодно на одной инсталляции; настройка concurrent в /etc/gitlab-runner/config.toml является потолком для них всех, и каждый runner может нести под ней собственный, меньший лимит. Следите за check_interval, по умолчанию 3 секунды, который превращается в очень много опросов, как только хост несёт десяток runner
Если вам нужна помощь или у вас возникли дополнительные вопросы, пожалуйста, обращайтесь к менеджерам или напишите в службу поддержки по адресу support@dcxv.com
Готовы начать?
- Оплата ежемесячно
- Без платы за подключение
- Без привязки