Перейти к содержимому

Sergei Ozeranskii

Self-hosted runners или managed: реальная стоимость

Для CI на GitHub Actions рано или поздно встаёт вопрос стоимости. Если сравнивать цену инстанса с поминутной оплатой GitHub-hosted, свои раннеры на бумаге выглядят дешевле. Но инстанс — это только compute. Полная стоимость владения CI складывается из трёх статей расходов — compute, эксплуатация и риск; две последние в тарифах облака не показаны, и в них уходит разница.

Мы делаем managed-раннеры для GitHub Actions, то есть в этом сравнении — сторона заинтересованная. Поэтому ниже названы и случаи, где self-hosted выигрывает. Цифры — только опубликованные; Total Cost of Ownership — полная стоимость владения: не только цена ресурса, но и эксплуатация, обслуживание и риск за всё время использования.-итогов и «экономии X%» здесь не будет: свои цифры считайте на калькуляторе.

Три модели исполнения

У CI на GitHub Actions три модели:

  • GitHub-hosted — раннеры GitHub, оплата поминутно с округлением вверх. Ноль эксплуатации, но округление до минуты и меньше контроля над окружением.
  • Self-hosted — свои раннеры на своём железе или в своём облаке. Максимум контроля, но эксплуатация и безопасность целиком на вас.
  • Managed (сюда входит tempus.build) — чужие раннеры как сервис, но с той же простотой, что GitHub-hosted: меняете одну строку runs-on. Оплата за исполнение, эксплуатация — на стороне сервиса.

Дальше — про два полюса: self-hosted и managed.

Из чего складывается стоимость self-hosted

Цена «инстанс за N в час» покрывает только compute. Под ней лежит то, что оплачивается временем команды и простаивающей ёмкостью:

  • Idle / always-on. Облачные инстансы и ноды тарифицируются, пока запущены, а не пока исполняют job. Значит, вы платите за простой между сборками и за запас под пики. CI неравномерен: утренний наплыв, ночная тишина. Эта неравномерность и превращается в оплаченный простой.
  • Автоскейл. Чтобы не платить за постоянный пик, нужен автоскейлинг. Стандартное OSS-решение — ARC (actions-runner-controller), оператор Kubernetes от GitHub, который масштабирует self-hosted раннеры под нагрузку. Но это кластер, сам контроллер, runner scale sets, вебхуки, RBAC — их надо развернуть, обновлять и обслуживать. Работа платформенной команды, а не разовая установка.
  • Сборка и патчинг образов. Кто-то собирает образы раннеров, держит тулчейны и рантаймы свежими, пересобирает под патчи безопасности и не даёт копиться устаревшим версиям. Постоянный поток задач, а не «настроил и забыл».
  • Изоляция недоверенного кода. CI исполняет чужой код — из PR, из зависимостей. Безопасное исполнение требует изоляции на уровне VM, контроля Исходящий сетевой трафик из раннера — загрузка зависимостей, образов. В облаке за него берут плату, и его нужно контролировать ради безопасности., поведенческого мониторинга и Одноразовый раннер на один job: поднимается, выполняет, уничтожается. Ничего не переживает границу job'а.. Self-hosting на общих постоянных раннерах открывает риск breakout и горизонтального перемещения. Это не наша интерпретация: GitHub сам не рекомендует self-hosted для публичных репозиториев (открывается в новой вкладке) и советует одноразовые (ephemeral) раннеры — именно из-за недоверенного кода в PR. (Как устроена эта граница — в разборе изоляции Kata.)
  • Кэш-инфраструктура. Скорость сборок держится на кэше зависимостей рядом с раннерами (pull-through для npm/pip/docker, CAS). Без него каждая сборка загружает зависимости из публичного интернета — медленнее и дороже по Исходящий сетевой трафик из раннера — загрузка зависимостей, образов. В облаке за него берут плату, и его нужно контролировать ради безопасности..
  • On-call. У доступности, обновлений, инцидентов и ёмкости есть владелец. Регулярная человеческая стоимость, которой в сравнении «по цене VM» нет.
Вертикальный стек статей стоимости: сверху выделена «Цена compute» (видно в цене), ниже — скрытые статьи: idle и always-on ёмкость, автоскейл (ARC на Kubernetes), сборка и патчинг образов, изоляция недоверенного кода, кэш-инфраструктура, on-call и инциденты; справа скобка — полная стоимость владения.
Цена compute — лишь верхняя строка. Полную стоимость владения self-hosted CI добавляют эксплуатация и риск: простой, автоскейл, образы, изоляция, кэш, on-call.

Сложите эти статьи — и «дешевле» из сравнения по цене инстанса часто исчезает уже на средней команде, где нет отдельной платформенной группы под всю эту эксплуатацию.

Как устроена цена в tempus.build

Managed снимает эту операционную стоимость с вашей команды — образы, патчи, ёмкость, дежурства и изоляцию держит провайдер. Взамен появляется своя зависимость (аптайм и SLA провайдера, каталог форм-факторов, порог доверия) — поэтому ниже честно перечислены случаи, где self-hosted выигрывает.

Сама модель оплаты меняется так:

  • Посекундно, без округления. Job на 75 секунд стоит 75 секунд. GitHub-hosted округляет каждый job до целой минуты — на коротких частых job’ах это накапливается.
  • Только исполнение — никакого idle. Вы не платите за простой между сборками и за запас под пики: ёмкость и автоскейл — наша забота, не строка в вашем счёте.
  • Задержка на запуск чистого окружения (VM или раннера) перед стартом job'а. Тёплый пул её маскирует ценой простаивающей ёмкости. не тарифицируется. Счётчик включается, когда job уже исполняется; секунды на запуск чистой VM — на нас. Тёплую ёмкость под пики держим тоже мы — это Заранее запущенные простаивающие раннеры, готовые сразу принять job. Убирают cold start, но простаивающая ёмкость оплачивается всё время, пока ждёт. на нашей стороне.
  • Предоплата — потолок расходов встроен. Баланс пополняется заранее и списывается посекундно; больше баланса не потратить, счёта-сюрприза в конце месяца нет. Баланс не сгорает.
  • Цена зашита в метку. tempus-ubuntu-24.04-4core — это всегда 0,008 $/мин, в любом репозитории. Что выбрали в runs-on, то и платите, без скрытых множителей.

Опубликованные ставки (2 → 16 ядер, память 1:4 к vCPU):

Метка runs-onРесурсыСтавка
tempus-ubuntu-24.04-2core2 vCPU / 8 GB0,004 $/мин
tempus-ubuntu-24.04-4core4 vCPU / 16 GB0,008 $/мин
tempus-ubuntu-24.04-8core8 vCPU / 32 GB0,016 $/мин
tempus-ubuntu-24.04-16core16 vCPU / 64 GB0,032 $/мин

Ставка 4core (0,008 $/мин) дешевле сопоставимого GitHub-hosted larger-раннера; оплата в долларах, другая валюта — по запросу. Точные цены GitHub и множители — в официальной документации (открывается в новой вкладке) (на публичных репозиториях standard-раннеры бесплатны — речь о приватных). На малых объёмах приватные репо могут укладываться во включённые минуты GitHub — поэтому мы и говорим «посчитайте на своём объёме», а не обещаем экономию всем. Сколько выйдет именно у вас — на калькуляторе; универсального «дешевле на X%» не бывает, всё зависит от пайплайна.

Калькулятор считает по допущениям, которые вы вводите. Coverage считает по факту: зарегистрируйтесь в платформе, поставьте GitHub App (открывается в новой вкладке) — и по вашей реальной истории GitHub Actions он покажет, во сколько обошлись бы те же прогоны на раннерах tempus.build. Не переключая на наши раннеры ни одного job.

Поверх — контроль расходов: бюджеты с уведомлениями и жёсткой остановкой, оповещения о всплесках, автопополнение по желанию. Начать можно с приветственных $5 на балансе — привязывать карту не нужно (для персональных аккаунтов; организациям бонусный баланс зачисляется по запросу). Это примерно 10 часов работы 4-core раннера.

Сравнение по осям

ОсьSelf-hostedtempus.build (managed)
Модель оплатыза запущенную ёмкость (часто always-on)посекундно за исполнение, без округления
Idleплатите за простой и запас под пикине тарифицируется
Эксплуатациякластер, ARC, образы, патчинг, on-callна стороне сервиса
Масштабированиестроите и настраиваете сами (ARC)эластично по умолчанию
Cold startсами держите тёплый пул против ценыуправляем; не тарифицируется
Изоляцияваша ответственность, легко ошибитьсяVM на job + egress-контроль + поведенческий мониторинг
Supply-chainаттестуете образы самиподписанные образы + SBOM + SLSA, open-source
Кэшстроите и держите самилокальный кэш зависимостей включён
Порог входадни-недели на безопасный запускодна строка runs-on, откат тоже одной

Где self-hosted выигрывает

Managed — не всегда правильный ответ. Self-hosted сильнее, когда:

  • Нужен полный контроль и своё железо — GPU, ARM, Windows/macOS, собственные образы, особые тулчейны. tempus.build сейчас (MVP) — только Ubuntu 24.04 x64 и фиксированный каталог форм-факторов.
  • Строгие требования к данным — data residency, изоляция в своём VPC или периметре, air-gap. Свои раннеры работают там, где скажете; managed-сервис — это третья сторона в контуре доверия.
  • Ровная 24/7-загрузка. Если нода занята почти на 100% круглые сутки, собственное железо по себестоимости может обойти любую поштучную managed-цену. Посекундная модель выигрывает на неравномерном CI, а не на плоской полной загрузке.
  • Независимость от вендора — нет привязки к доступности чужого сервиса.

Развилка: неравномерный CI + небольшая команда + желание ноль эксплуатации → managed; ровная 100%-загрузка + строгий residency + особое железо → self-hosted.

Если пробовать tempus.build

Порог входа и выхода низкий:

  • Переход — одна строка. runs-on: ubuntu-latestruns-on: tempus-ubuntu-24.04-4core. Остальной workflow не меняется.
  • Откат — тоже одна строка. Вернули ubuntu-latest — и вы снова на GitHub-hosted. Баланс возвратный, уйти можно в любой момент.
  • Изоляция как у отдельной машины. Каждый job — в своей одноразовой VM, уничтожается после завершения. Образ раннера — open-source (tempusbuild/runner-images (открывается в новой вкладке)), можно собрать и проверить самому; как устроена изоляция — на странице «Безопасность и изоляция» и в разборе изоляции Kata.
  • Приветственные $5 на балансе, без карты — запустите свои пайплайны и посмотрите на реальные цифры до первого пополнения.

Не верьте на слово — посчитайте на своём объёме и сравните с тем, во сколько обходится собственная эксплуатация.

← в блог