−25%

на річну оплату Windows, до 31.10. До тарифів

EQVPS
Почати

Пісочниця для CI: ізольовані прогони тестів дешевше за цент за прогін

Запускайте тести коду, якому не довіряєте, — пул-реквест від незнайомця, згенерований патч — у свіжій мікро-VM, що видаляється після прогону. Посекундна оплата, SDK для Python і TS, чесно про ліміти паралельності.

У self-hosted CI-раннерів є одна незручна властивість: вони все пам'ятають. Кеші, токени, ключ деплою, який хтось додав «тимчасово» минулої весни. Для своїх гілок це нормально. Проблема починається, коли приходить пул-реквест від людини, про яку ви ніколи не чули, — або від вашого ж ШІ-агента, який написав патч, якого ще ніхто не читав.

Чиста відповідь — окрема машина на кожен прогін. Клонувати, встановити, протестувати, викинути машину.

Як виглядає прогін

Пісочниця — це мікро-VM Firecracker, яка стартує приблизно за секунду з 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, що прийшли разом, стануть у чергу. Якщо ваш пайплайн шардить тести на 16 воркерів, для основного пайплайна це не той інструмент — залиште його на своїх раннерах на VPS, а пісочниці використовуйте для недовіреної смуги.

Без контейнерів усередині. Docker у пісочниці немає. Юніт- та інтеграційні тести, яким потрібен контейнер Postgres, не запрацюють як є; тести проти SQLite або in-memory заглушки — запрацюють.

Файли. Завантаження й вивантаження через API — до 5 MB на файл. Тягніть код через git усередині пісочниці, а не завантажуйте архів.

Скільки це коштує

Ви платите за vCPU і RAM тарифу посекундно, мінімум 60 секунд, з передплаченого балансу — без підписки.

ПрогінТарифПриблизна вартість
Лінтер + юніт-тести, 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 запас над найповільнішим зеленим прогоном.

Розумний поділ

Наша рекомендація: довірені гілки залиште на своєму швидкому раннері з кешем. Усе, що писали не ви, — форки, зовнішні контриб'ютори, патчі від агентів — спершу пропускайте через пісочницю. Якщо прогін у пісочниці зелений і людина подивилася дифф, переводьте його в довірений пайплайн.

Так у вас одна смуга, де важливі швидкість і кеш, і друга, де важлива чиста машина, і жоден інструмент не доводиться змушувати бути і тим, і тим.

Почніть зі сторінки пісочниць і посібника з підключення — нові акаунти отримують $1 часу пісочниць, цього вистачить на кілька сотень коротких прогонів. Усі методи з прикладу — у довіднику SDK, точні правила оплати — у розділі ліміти й оплата пісочниць.

За темою: пісочниця для рев'ю коду й перевірки PR і пісочниця для ШІ-агентів.

Готові розгорнути? Оплата криптою, без KYC — сервер за хвилину.

Розгорнути →

Часті питання

Чому не запускати недовірені пул-реквести на своєму self-hosted раннері?

Self-hosted раннер зберігає стан між задачами й зазвичай тримає ключі деплою або хмарні креди. Пул-реквест від незнайомця може прочитати їх за один крок. Пісочниця щоразу стартує чистою й не містить нічого, крім коду, що тестується.

Чи може тест тривати довше за 55 секунд?

Так. Ліміт 55 секунд — на одну синхронну команду. Запустіть набір тестів фоновим завданням, опитуйте його вивід, і він може працювати до кінця життя пісочниці — до 24 годин у тимчасової.

Скільки прогонів можна запустити паралельно?

До 20 пісочниць на акаунт, але одночасно виконуються лише 2 команди на акаунт. Для CI це означає дві задачі, що реально працюють одночасно; решта чекає в черзі. Якщо потрібен широкий паралельний шардинг, краще підійде флот раннерів на VPS.

Чи є Docker усередині пісочниці?

У пісочниці є Python 3.12, Node.js 22, bash, git і curl, а залежності ставляться через pip або npm. Docker до неї не входить — якщо ваші тести піднімають контейнери, запускайте їх на раннері на VPS.

Скільки коштує прогін?

Посекундно, мінімум 60 секунд, за vCPU і RAM тарифу. Трихвилинний прогін на тарифі standard (1 vCPU, 2 GB) коштує близько $0.0033.

Коментарі

Поки немає коментарів. Будьте першим.

Залишити коментар

Коментарі проходять модерацію перед публікацією.