Self-hosted CI runner-ите имат едно неудобно свойство: помнят всичко. Кешове, токени, ключ за деплой, който някой добави „временно“ миналата пролет. За собствените ви клонове това е наред. Проблемът започва в момента, в който пристигне pull request от човек, за когото никога не сте чували — или от собствения ви AI агент, написал пач, който още никой не е прочел.
Чистият отговор е една машина на пускане. Клонирай, инсталирай, тествай, изхвърли машината.
Как изглежда едно пускане
Пясъчникът е Firecracker microVM, която стартира за около секунда с Python 3.12, Node.js 22, git и curl. Изходящият интернет работи, така че git clone и pip install -r requirements.txt се държат както обикновено. Няма входящи портове — нищо не може да се свърже с тестовата среда, докато тя работи.
От CI задача всичко е кратък скрипт. Ето го с Python SDK, извикван от всяка CI задача:
import os, sys
from eqvps import Sandbox
repo, ref = os.environ["REPO_URL"], os.environ["PR_SHA"]
with Sandbox.create(tariff="standard", ttl=1800) as sb:
sb.exec(f"git clone {repo} /root/app && cd /root/app && git checkout {ref}", timeout=55)
sb.exec("cd /root/app && pip install -r requirements.txt", timeout=55)
task = sb.exec("cd /root/app && python3 -m pytest -q", background=True)
result = task.wait(on_output=lambda out, err: print(out, end=""))
sys.exit(result.exit_code or 0)
Токенът стои в тайните на вашия CI като EQVPS_API_KEY. Нищо друго от CI — нито ключове за деплой, нито облачни идентификационни данни — не влиза в пясъчника. Когато блокът with приключи, пясъчникът се изтрива, дори ако задачата е гръмнала по средата.
Самото пускане на тестовете е фонова задача, защото една синхронна команда спира на 55-ата секунда. Фоновата задача предава изхода си, докато работи, и може да продължи до TTL на пясъчника — тук зададен на 30 минути, за да не може увиснал тест да надуе сметката.
Ограниченията, на които наистина ще попаднете
Откровеността за тях ще ви спести един следобед.
Паралелност. Акаунтът може да държи 20 пясъчника, но само 2 команди се изпълняват едновременно. За CI това са две задачи, които наистина вървят паралелно. Десет PR, пристигнали наведнъж, ще се наредят на опашка. Ако pipeline-ът ви разпределя тестовете на 16 worker-а, това не е правилният инструмент за основния pipeline — оставете го на собствените си runner-и на VPS и използвайте пясъчници за ненадеждното платно.
Без контейнери вътре. Docker не идва с пясъчника. Модулни и интеграционни тестове, които изискват контейнер с Postgres, няма да работят както са; тестове срещу SQLite или фалшив обект в паметта — ще работят.
Файлове. Качването и изтеглянето през API е до 5 MB на файл. Вземайте кода с git вътре в пясъчника, вместо да качвате архив.
Колко струва
Плащате vCPU и RAM на тарифа на секунда, минимум 60 секунди, от предплатен баланс — без абонамент.
| Пускане | Тариф | Приблизителна цена |
|---|---|---|
| Lint + модулни тестове, 1 мин | small (0.5 vCPU, 1 GB) | $0.0006 |
| Пълен пакет, 3 мин | standard (1 vCPU, 2 GB) | $0.0033 |
| Билд + тестове, 10 мин | plus (2 vCPU, 4 GB) | $0.022 |
При тези цени интересният въпрос не е цената, а дали тестовете ви приключват в зададеното време. Оставете на TTL малко резерв над най-бавното ви зелено пускане.
Разумно разделение
Нашата препоръка: оставете доверените клонове на бързия си runner с кеш. Всичко, което не сте написали вие — fork-ове, външни сътрудници, генерирани от агенти пачове — първо прекарвайте през пясъчник. Ако пускането в пясъчника е зелено и човек е погледнал diff-а, повишете го в доверения pipeline.
Така имате едно платно, където значение имат скоростта и кешът, и друго, където значение има чистата машина, без да принуждавате един инструмент да бъде и двете.
Започнете от прегледа на пясъчниците и ръководството за свързване — новите акаунти получават $1 време в пясъчник, което стига за няколкостотин кратки тестови пускания. Всеки използван по-горе метод е в справочника на SDK, а точните правила за таксуване — в ограничения и таксуване на пясъчниците.
Свързано: пясъчник за преглед на код и проверки на PR и пясъчник за AI агенти.
Коментари
Още няма коментари. Бъди първият.