−25%

su Windows con pagamento annuale, fino al 31/10. Vai ai piani

EQVPS
Inizia

Sandbox per la CI: test isolati a meno di un centesimo per esecuzione

Esegui i test di codice di cui non ti fidi — una pull request di uno sconosciuto, una patch generata — in una microVM nuova che viene eliminata dopo l'esecuzione. Fatturazione al secondo, SDK per Python e TS, e trasparenza sui limiti di concorrenza.

I runner CI self-hosted hanno una proprietà scomoda: ricordano tutto. Cache, token, una chiave di deploy che qualcuno ha aggiunto «temporaneamente» la primavera scorsa. Per i tuoi branch va bene. Il problema nasce quando arriva una pull request da qualcuno di cui non hai mai sentito parlare, o dal tuo stesso agente IA, che ha scritto una patch che nessuno ha ancora letto.

La risposta pulita è una macchina per esecuzione. Clonare, installare, testare, buttare via la macchina.

Com'è fatta un'esecuzione

Una sandbox è una microVM Firecracker che si avvia in circa un secondo con Python 3.12, Node.js 22, git e curl. L'accesso a internet in uscita funziona, quindi git clone e pip install -r requirements.txt si comportano come al solito. Non ci sono porte in ingresso: niente può raggiungere l'ambiente di test mentre è in esecuzione.

Da un job CI, il tutto è uno script breve. Eccolo con l'SDK Python, richiamabile da qualsiasi job 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)

Il token vive nei secret della tua CI come EQVPS_API_KEY. Nient'altro della tua CI — né chiavi di deploy, né credenziali cloud — entra nella sandbox. Quando il blocco with termina, la sandbox viene eliminata, anche se il job si è bloccato a metà.

L'esecuzione dei test è un'attività in background, perché un singolo comando sincrono si ferma a 55 secondi. Un'attività in background trasmette l'output mentre lavora e può continuare fino al TTL della sandbox, qui impostato a 30 minuti perché un test bloccato non faccia lievitare il conto.

I limiti che incontrerai davvero

Parlarne con franchezza ti fa risparmiare un pomeriggio.

Concorrenza. Un account può avere 20 sandbox, ma solo 2 comandi vengono eseguiti contemporaneamente. Per la CI sono due job davvero in parallelo. Dieci PR arrivate insieme finiranno in coda. Se la tua pipeline distribuisce i test su 16 worker, questo non è lo strumento per la pipeline principale: tienila sui tuoi runner su un VPS e usa le sandbox per la corsia non fidata.

Niente container all'interno. Docker non è incluso nella sandbox. I test unitari e di integrazione che richiedono un container Postgres non funzioneranno così come sono; quelli su SQLite o su un fake in memoria sì.

File. Upload e download tramite API arrivano fino a 5 MB per file. Scarica il codice con git dentro la sandbox invece di caricare un archivio.

Quanto costa

Paghi vCPU e RAM della tariffa al secondo, minimo 60 secondi, da un credito prepagato, senza abbonamento.

EsecuzioneTariffaCosto indicativo
Lint + test unitari, 1 minsmall (0.5 vCPU, 1 GB)$0.0006
Suite completa, 3 minstandard (1 vCPU, 2 GB)$0.0033
Build + test, 10 minplus (2 vCPU, 4 GB)$0.022

A questi prezzi la domanda interessante non è il costo, ma se i tuoi test finiscono entro il tempo impostato. Lascia al TTL un po' di margine oltre la tua esecuzione verde più lenta.

Una divisione sensata

Il nostro consiglio: tieni i branch fidati sul tuo runner veloce con cache. Fai passare prima da una sandbox tutto ciò che non hai scritto tu: fork, contributori esterni, patch generate da agenti. Se l'esecuzione nella sandbox è verde e una persona ha guardato il diff, promuovila alla pipeline fidata.

Così hai una corsia in cui contano velocità e cache e un'altra in cui conta una macchina pulita, senza costringere un solo strumento a essere entrambe le cose.

Parti dalla panoramica delle sandbox e dalla guida alla connessione: i nuovi account ricevono $1 di tempo sandbox, sufficiente per qualche centinaio di esecuzioni brevi. Ogni metodo usato sopra è nel riferimento dell'SDK, e le regole di fatturazione esatte in limiti e fatturazione delle sandbox.

Correlati: sandbox per code review e controlli delle PR e sandbox per agenti IA.

Pronto a fare il deploy? Paga in crypto, niente KYC — online in circa un minuto.

Fai il deploy ora →

FAQ

Perché non eseguire le pull request non fidate sul mio runner self-hosted?

Un runner self-hosted conserva lo stato tra un job e l'altro e di solito contiene chiavi di deploy o credenziali cloud. Una pull request di qualcuno che non conosci può leggerle in un solo passaggio. Una sandbox parte pulita ogni volta e non contiene altro che il codice in esame.

Un test può durare più di 55 secondi?

Sì. Il limite di 55 secondi vale per un singolo comando sincrono. Avvia la suite di test come attività in background, interroga il suo output e potrà girare fino alla fine della vita della sandbox: fino a 24 ore per una sandbox effimera.

Quante esecuzioni possono andare in parallelo?

Fino a 20 sandbox per account, ma solo 2 comandi in esecuzione contemporanea per account. Per la CI significa due job davvero simultanei; gli altri restano in coda. Se ti serve uno sharding parallelo ampio, è più adatta una flotta di runner su VPS.

Docker è disponibile nella sandbox?

La sandbox include Python 3.12, Node.js 22, bash, git e curl, e le dipendenze si installano con pip o npm. Docker non ne fa parte: se i tuoi test avviano container, eseguili su un runner su VPS.

Quanto costa un'esecuzione?

Al secondo, minimo 60 secondi, per vCPU e RAM della tariffa. Un'esecuzione di tre minuti sulla tariffa standard (1 vCPU, 2 GB) costa circa $0.0033.

Commenti

Ancora nessun commento. Sii il primo.

Lascia un commento

I commenti sono moderati prima di comparire.