У 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 і пісочниця для ШІ-агентів.
Коментарі
Поки немає коментарів. Будьте першим.