Runner CI self-hosted có một đặc điểm khó chịu: chúng nhớ mọi thứ. Cache, token, một khóa deploy mà ai đó đã thêm "tạm thời" từ mùa xuân năm ngoái. Với các branch của chính bạn thì không sao. Vấn đề bắt đầu khi có một pull request từ người bạn chưa từng nghe tên — hoặc từ chính AI agent của bạn, vốn vừa viết một bản vá chưa ai đọc.
Câu trả lời gọn gàng là mỗi lần chạy một máy. Clone, cài đặt, test, vứt máy đi.
Một lần chạy trông như thế nào
Sandbox là một microVM Firecracker khởi động trong khoảng một giây với Python 3.12, Node.js 22, git và curl. Internet chiều đi hoạt động, nên git clone và pip install -r requirements.txt chạy như bình thường. Không có cổng chiều vào — không gì có thể kết nối vào môi trường test khi nó đang chạy.
Từ một job CI, toàn bộ chỉ là một script ngắn. Đây là phiên bản dùng SDK Python, gọi được từ bất kỳ job CI nào:
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)
Token nằm trong secret của CI dưới tên EQVPS_API_KEY. Ngoài ra không gì từ CI của bạn — không khóa deploy, không thông tin đăng nhập cloud — đi vào sandbox. Khi khối with kết thúc, sandbox bị xóa, kể cả khi job gặp sự cố giữa chừng.
Bản thân lần chạy test là một tác vụ nền, vì một lệnh đồng bộ đơn lẻ sẽ dừng ở giây thứ 55. Tác vụ nền truyền output trong lúc làm việc và có thể chạy tiếp đến TTL của sandbox — ở đây đặt 30 phút để một bài test bị treo không đẩy hóa đơn lên.
Những giới hạn bạn thực sự sẽ gặp
Nói thẳng về chúng sẽ giúp bạn tiết kiệm cả buổi chiều.
Chạy đồng thời. Một tài khoản có thể giữ 20 sandbox, nhưng chỉ 2 lệnh được thực thi cùng lúc. Với CI, đó là hai job thực sự chạy song song. Mười PR đến cùng lúc sẽ phải xếp hàng. Nếu pipeline của bạn chia test cho 16 worker, đây không phải công cụ cho pipeline chính — hãy giữ nó trên runner của chính bạn ở VPS và dùng sandbox cho làn không đáng tin.
Không có container bên trong. Docker không đi kèm sandbox. Test unit và test tích hợp cần container Postgres sẽ không chạy được nguyên trạng; test dùng SQLite hoặc bản giả lập trong bộ nhớ thì chạy được.
Tệp. Tải lên và tải xuống qua API tối đa 5 MB mỗi tệp. Hãy kéo mã bằng git bên trong sandbox thay vì tải lên một tệp nén.
Chi phí bao nhiêu
Bạn trả cho vCPU và RAM của gói theo giây, tối thiểu 60 giây, từ số dư trả trước — không cần đăng ký thuê bao.
| Lần chạy | Gói | Chi phí ước tính |
|---|---|---|
| Lint + test unit, 1 phút | small (0.5 vCPU, 1 GB) | $0.0006 |
| Toàn bộ bộ test, 3 phút | standard (1 vCPU, 2 GB) | $0.0033 |
| Build + test, 10 phút | plus (2 vCPU, 4 GB) | $0.022 |
Với mức giá này, câu hỏi đáng quan tâm không phải là chi phí, mà là test có hoàn thành trong thời gian bạn đặt hay không. Hãy để TTL dư một chút so với lần chạy xanh chậm nhất của bạn.
Một cách chia hợp lý
Khuyến nghị của chúng tôi: giữ các branch đáng tin trên runner nhanh có cache của bạn. Đưa mọi thứ không phải do bạn viết — fork, người đóng góp bên ngoài, bản vá do agent sinh ra — qua sandbox trước. Nếu lần chạy trong sandbox xanh và đã có người xem diff, hãy nâng nó lên pipeline đáng tin.
Như vậy bạn có một làn nơi tốc độ và cache quan trọng, và một làn nơi máy sạch quan trọng, mà không bắt một công cụ phải kiêm cả hai.
Hãy bắt đầu với trang tổng quan sandbox và hướng dẫn kết nối — tài khoản mới nhận $1 thời gian sandbox, đủ cho vài trăm lần chạy test ngắn. Mọi phương thức dùng ở trên đều có trong tài liệu tham khảo SDK, còn quy tắc tính phí chính xác nằm ở giới hạn và tính phí sandbox.
Liên quan: sandbox cho review mã và kiểm tra PR và sandbox cho AI agent.
Bình luận
Chưa có bình luận nào. Hãy là người đầu tiên.