−25%

op Windows bij jaarbetaling, tot 31/10. Naar de pakketten

EQVPS
Aan de slag

Sandbox voor CI: geïsoleerde testruns voor minder dan een cent per stuk

Draai tests voor code die u niet vertrouwt — een pull request van een onbekende, een gegenereerde patch — in een verse microVM die na de run wordt verwijderd. Facturering per seconde, SDK voor Python en TS, eerlijk over de limieten op gelijktijdigheid.

Self-hosted CI-runners hebben één lastige eigenschap: ze onthouden alles. Caches, tokens, een deploy-key die iemand vorig voorjaar „tijdelijk” heeft toegevoegd. Voor uw eigen branches is dat prima. Het wordt een probleem zodra er een pull request binnenkomt van iemand van wie u nog nooit hebt gehoord — of van uw eigen AI-agent, die een patch schreef die nog niemand heeft gelezen.

Het schone antwoord is één machine per run. Clonen, installeren, testen, machine weggooien.

Hoe een run eruitziet

Een sandbox is een Firecracker-microVM die in ongeveer een seconde start met Python 3.12, Node.js 22, git en curl. Uitgaand internet werkt, dus git clone en pip install -r requirements.txt gedragen zich zoals gewoonlijk. Er zijn geen inkomende poorten — niets kan de testomgeving bereiken terwijl die draait.

Vanuit een CI-job is het geheel een kort script. Hier met de Python-SDK, aan te roepen vanuit elke CI-job:

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)

Het token staat in uw CI-secrets als EQVPS_API_KEY. Verder gaat er niets uit uw CI de sandbox in — geen deploy-keys, geen cloudgegevens. Wanneer het with-blok eindigt, wordt de sandbox verwijderd, ook als de job halverwege is gecrasht.

De testrun zelf is een achtergrondtaak, omdat één synchrone opdracht na 55 seconden stopt. Een achtergrondtaak streamt uitvoer terwijl hij werkt en kan doorgaan tot de TTL van de sandbox — hier 30 minuten, zodat een vastgelopen test de rekening niet opdrijft.

De limieten waar u echt tegenaan loopt

Daar eerlijk over zijn bespaart u een middag.

Gelijktijdigheid. Een account kan 20 sandboxes hebben, maar slechts 2 opdrachten worden tegelijk uitgevoerd. Voor CI zijn dat twee jobs die echt parallel draaien. Tien PR's die tegelijk binnenkomen, sluiten aan in de rij. Als uw pipeline tests over 16 workers verdeelt, is dit het verkeerde gereedschap voor de hoofdpipeline — houd die op uw eigen runners op een VPS en gebruik sandboxes voor de onbetrouwbare baan.

Geen containers binnenin. Docker zit niet in de sandbox. Unit- en integratietests die een Postgres-container nodig hebben, werken niet zomaar; tests tegen SQLite of een in-memory fake wel.

Bestanden. Uploads en downloads via de API gaan tot 5 MB per bestand. Haal de code met git binnen in de sandbox in plaats van een archief te uploaden.

Wat het kost

U betaalt de vCPU en het RAM van het tarief per seconde, minimaal 60 seconden, vanuit een prepaid tegoed — zonder abonnement.

RunTariefGeschatte kosten
Lint + unittests, 1 minsmall (0.5 vCPU, 1 GB)$0.0006
Volledige suite, 3 minstandard (1 vCPU, 2 GB)$0.0033
Build + tests, 10 minplus (2 vCPU, 4 GB)$0.022

Bij deze prijzen is de interessante vraag niet de prijs, maar of uw tests binnen de ingestelde tijd klaar zijn. Geef de TTL wat speling boven uw traagste groene run.

Een verstandige verdeling

Ons advies: houd vertrouwde branches op uw snelle runner met cache. Stuur alles wat u niet zelf schreef — forks, externe bijdragers, door agents gegenereerde patches — eerst door een sandbox. Is de sandboxrun groen en heeft een mens de diff bekeken, promoveer hem dan naar de vertrouwde pipeline.

Zo hebt u één baan waar snelheid en cache tellen en één waar een schone machine telt, zonder één gereedschap te dwingen beide te zijn.

Begin met het overzicht van sandboxes en de verbindingshandleiding — nieuwe accounts krijgen $1 aan sandboxtijd, genoeg voor een paar honderd korte testruns. Elke hierboven gebruikte methode staat in de SDK-referentie, en de exacte factureringsregels in limieten en facturering van sandboxes.

Gerelateerd: sandbox voor code review en PR-controles en sandbox voor AI-agents.

Klaar om te implementeren? Betaal met crypto, geen KYC — live in ongeveer een minuut.

Nu implementeren →

FAQ

Waarom niet gewoon onbetrouwbare pull requests op mijn self-hosted runner draaien?

Een self-hosted runner bewaart status tussen jobs en heeft meestal deploy-keys of cloudgegevens. Een pull request van iemand die u niet kent, kan die in één stap uitlezen. Een sandbox start elke keer schoon en bevat niets behalve de code die getest wordt.

Kan een test langer dan 55 seconden duren?

Ja. De limiet van 55 seconden geldt per synchrone opdracht. Start de testsuite als achtergrondtaak, vraag de uitvoer op, en hij kan draaien tot de levensduur van de sandbox afloopt — tot 24 uur bij een kortstondige sandbox.

Hoeveel testruns kunnen parallel lopen?

Tot 20 sandboxes per account, maar slechts 2 opdrachten die tegelijk worden uitgevoerd per account. Voor CI betekent dat twee jobs die echt tegelijk draaien; de rest wacht in de rij. Hebt u breed parallel sharden nodig, dan past een vloot runners op VPS beter.

Is Docker beschikbaar in de sandbox?

De sandbox heeft Python 3.12, Node.js 22, bash, git en curl, en afhankelijkheden installeert u met pip of npm. Docker hoort er niet bij — als uw tests containers starten, draai ze dan op een runner op een VPS.

Wat kost een run?

Per seconde, minimaal 60 seconden, voor de vCPU en het RAM van het tarief. Een run van drie minuten op het tarief standard (1 vCPU, 2 GB) kost ongeveer $0.0033.

Reacties

Nog geen reacties. Wees de eerste.

Laat een reactie achter

Reacties worden gemodereerd voordat ze verschijnen.