−25%

no Windows com pagamento anual, até 31/10. Ver planos

EQVPS
Começar

Sandbox para CI: execuções de testes isoladas por menos de um centavo cada

Rode testes de código em que você não confia — um pull request de um desconhecido, um patch gerado — numa microVM nova que é apagada após a execução. Cobrança por segundo, SDK para Python e TS, e franqueza sobre os limites de concorrência.

Runners de CI self-hosted têm uma propriedade incômoda: eles lembram de tudo. Caches, tokens, uma chave de deploy que alguém adicionou "temporariamente" na primavera passada. Para os seus próprios branches, tudo bem. O problema começa quando chega um pull request de alguém de quem você nunca ouviu falar — ou do seu próprio agente de IA, que escreveu um patch que ninguém leu ainda.

A resposta limpa é uma máquina por execução. Clonar, instalar, testar, jogar a máquina fora.

Como é uma execução

Uma sandbox é uma microVM Firecracker que inicia em cerca de um segundo com Python 3.12, Node.js 22, git e curl. A internet de saída funciona, então git clone e pip install -r requirements.txt se comportam como sempre. Não há portas de entrada — nada consegue chamar o ambiente de testes enquanto ele roda.

A partir de um job de CI, tudo cabe num script curto. Aqui está com o SDK de Python, chamado de qualquer job de 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)

O token fica nos secrets do seu CI como EQVPS_API_KEY. Nada mais do seu CI — nem chaves de deploy, nem credenciais de nuvem — entra na sandbox. Quando o bloco with termina, a sandbox é apagada, mesmo que o job tenha falhado no meio.

A execução dos testes em si é uma tarefa em segundo plano, porque um único comando síncrono para aos 55 segundos. Uma tarefa em segundo plano transmite a saída enquanto trabalha e pode continuar até o TTL da sandbox — aqui definido em 30 minutos para que um teste travado não infle a conta.

Os limites que você vai encontrar de verdade

Falar deles com franqueza economiza uma tarde.

Concorrência. Uma conta pode ter 20 sandboxes, mas só 2 comandos executam ao mesmo tempo. Para CI, são dois jobs realmente em paralelo. Dez PRs chegando juntos vão para a fila. Se o seu pipeline divide os testes entre 16 workers, esta não é a ferramenta para o pipeline principal — mantenha-o nos seus próprios runners num VPS e use sandboxes para a faixa não confiável.

Sem contêineres dentro. O Docker não vem na sandbox. Testes unitários e de integração que precisam de um contêiner Postgres não vão funcionar como estão; testes contra SQLite ou um fake em memória, sim.

Arquivos. Uploads e downloads pela API vão até 5 MB por arquivo. Traga o código com git dentro da sandbox em vez de enviar um arquivo compactado.

Quanto custa

Você paga os vCPU e a RAM do plano por segundo, mínimo de 60 segundos, a partir de um saldo pré-pago — sem assinatura.

ExecuçãoPlanoCusto aprox.
Lint + testes unitários, 1 minsmall (0.5 vCPU, 1 GB)$0.0006
Suíte completa, 3 minstandard (1 vCPU, 2 GB)$0.0033
Build + testes, 10 minplus (2 vCPU, 4 GB)$0.022

Com esses preços, a pergunta interessante não é o custo, e sim se os seus testes terminam dentro do tempo definido. Dê ao TTL alguma folga acima da sua execução verde mais lenta.

Uma divisão sensata

Nossa recomendação: mantenha os branches confiáveis no seu runner rápido com cache. Passe primeiro por uma sandbox tudo o que você não escreveu — forks, colaboradores externos, patches gerados por agentes. Se a execução na sandbox ficar verde e uma pessoa tiver olhado o diff, promova-o para o pipeline confiável.

Assim você tem uma faixa onde velocidade e cache importam e outra onde uma máquina limpa importa, sem forçar uma única ferramenta a ser as duas coisas.

Comece pela visão geral das sandboxes e pelo guia de conexão — contas novas recebem $1 de tempo de sandbox, o que cobre algumas centenas de execuções curtas. Todos os métodos usados acima estão na referência do SDK, e as regras exatas de cobrança em limites e cobrança das sandboxes.

Relacionado: sandbox para revisão de código e verificação de PRs e sandbox para agentes de IA.

Pronto para implantar? Pague com cripto, sem KYC — online em cerca de um minuto.

Implantar agora →

FAQ

Por que não rodar pull requests não confiáveis no meu runner self-hosted?

Um runner self-hosted guarda estado entre jobs e costuma ter chaves de deploy ou credenciais de nuvem. Um pull request de alguém que você não conhece pode lê-las num único passo. Uma sandbox começa limpa toda vez e não contém nada além do código em teste.

Um teste pode durar mais de 55 segundos?

Sim. O limite de 55 segundos é por comando síncrono. Inicie a suíte de testes como tarefa em segundo plano, consulte a saída dela e ela poderá rodar até o fim da vida da sandbox — até 24 horas numa sandbox efêmera.

Quantas execuções podem rodar em paralelo?

Até 20 sandboxes por conta, mas só 2 comandos em execução ao mesmo tempo por conta. Para CI, isso significa dois jobs realmente simultâneos; o resto entra na fila. Se você precisa de sharding paralelo amplo, uma frota de runners em VPS se encaixa melhor.

Há Docker dentro da sandbox?

A sandbox vem com Python 3.12, Node.js 22, bash, git e curl, e as dependências são instaladas com pip ou npm. Docker não faz parte dela — se seus testes sobem contêineres, rode-os num runner em VPS.

Quanto custa uma execução?

Por segundo, mínimo de 60 segundos, pelos vCPU e pela RAM do plano. Uma execução de três minutos no plano standard (1 vCPU, 2 GB) custa cerca de $0.0033.

Comentários

Nenhum comentário ainda. Seja o primeiro.

Deixe um comentário

Os comentários são moderados antes de aparecerem.