−25%

за Windows при годишно плащане, до 31.10. Към плановете

EQVPS
Започни

Пясъчник за CI: изолирани тестови пускания за по-малко от цент всяко

Пускайте тестове за код, на който не вярвате — pull request от непознат, генериран пач — в нова microVM, която се изтрива след пускането. Таксуване на секунда, SDK за Python и TS и откровено за ограниченията на паралелността.

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 агенти.

Готов за deploy? Плати в crypto, без KYC — онлайн за около минута.

Deploy-ни сега →

Въпроси

Защо да не пускам ненадеждни pull requests на собствения си self-hosted runner?

Self-hosted runner пази състояние между задачите и обикновено държи ключове за деплой или облачни идентификационни данни. Pull request от човек, когото не познавате, може да ги прочете с една стъпка. Пясъчникът всеки път стартира чист и не съдържа нищо освен тествания код.

Може ли тест да върви повече от 55 секунди?

Да. Ограничението от 55 секунди е за една синхронна команда. Стартирайте тестовия пакет като фонова задача, проверявайте изхода ѝ и той може да работи до края на живота на пясъчника — до 24 часа за временен пясъчник.

Колко тестови пускания могат да вървят паралелно?

До 20 пясъчника на акаунт, но само 2 команди се изпълняват едновременно на акаунт. За CI това означава две задачи, които наистина вървят едновременно; останалите чакат на опашка. Ако ви трябва широко паралелно разделяне, по-добре пасва флот от runner-и на VPS.

Има ли Docker в пясъчника?

Пясъчникът съдържа Python 3.12, Node.js 22, bash, git и curl, а зависимостите инсталирате с pip или npm. Docker не е част от него — ако тестовете ви стартират контейнери, пускайте ги на runner на VPS.

Колко струва едно пускане?

На секунда, минимум 60 секунди, за vCPU и RAM на тарифа. Триминутно пускане на тариф standard (1 vCPU, 2 GB) струва около $0.0033.

Коментари

Още няма коментари. Бъди първият.

Остави коментар

Коментарите се модерират преди да се появят.