−25%

Windows के सालाना भुगतान पर, 31 अक्टूबर तक। प्लान देखें

EQVPS
शुरू करें

CI के लिए सैंडबॉक्स: हर रन एक सेंट से कम में, पूरी तरह अलग टेस्ट

जिस कोड पर भरोसा नहीं है — किसी अनजान का pull request, अपने-आप बना पैच — उसके टेस्ट एक नए microVM में चलाएँ जो रन के बाद मिटा दिया जाता है। प्रति सेकंड बिलिंग, Python और TS के लिए SDK, और एक साथ चलने की सीमाओं के बारे में साफ़ बात।

self-hosted CI runner की एक असहज आदत है: वे सब कुछ याद रखते हैं। कैश, टोकन, एक डिप्लॉय कुंजी जो किसी ने पिछले वसंत में "अस्थायी रूप से" जोड़ी थी। आपकी अपनी ब्रांचों के लिए यह ठीक है। मुश्किल तब शुरू होती है जब किसी ऐसे व्यक्ति का pull request आता है जिसका नाम भी आपने नहीं सुना — या आपके अपने AI एजेंट का, जिसने ऐसा पैच लिखा है जिसे अभी किसी ने पढ़ा तक नहीं।

साफ़ जवाब है: हर रन के लिए एक मशीन। क्लोन करें, इंस्टॉल करें, टेस्ट करें, मशीन फेंक दें।

एक रन कैसा दिखता है

सैंडबॉक्स एक Firecracker microVM है जो लगभग एक सेकंड में 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 worker में बाँटती है, तो मुख्य पाइपलाइन के लिए यह सही औज़ार नहीं है — उसे VPS पर अपने runner पर रखें और सैंडबॉक्स का उपयोग अविश्वसनीय लेन के लिए करें।

अंदर कंटेनर नहीं। सैंडबॉक्स के साथ Docker नहीं आता। जिन यूनिट और इंटीग्रेशन टेस्ट को Postgres कंटेनर चाहिए, वे जैसे हैं वैसे नहीं चलेंगे; SQLite या मेमोरी वाले नकली ऑब्जेक्ट पर चलने वाले टेस्ट चलेंगे।

फ़ाइलें। 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 रखें।

समझदारी भरा बँटवारा

हमारी सलाह: भरोसेमंद ब्रांचों को अपने तेज़, कैश वाले runner पर रहने दें। जो कुछ भी आपने नहीं लिखा — fork, बाहरी योगदानकर्ता, एजेंट के बनाए पैच — उसे पहले सैंडबॉक्स से गुज़ारें। अगर सैंडबॉक्स रन सफल है और किसी इंसान ने diff देख लिया है, तो उसे भरोसेमंद पाइपलाइन में आगे बढ़ाएँ।

इस तरह आपके पास एक लेन होती है जहाँ गति और कैश मायने रखते हैं, और दूसरी जहाँ साफ़ मशीन मायने रखती है — बिना किसी एक औज़ार को दोनों बनने के लिए मजबूर किए।

सैंडबॉक्स के परिचय और कनेक्शन गाइड से शुरुआत करें — नए खातों को $1 का सैंडबॉक्स समय मिलता है, जो कुछ सौ छोटे टेस्ट रन के लिए काफ़ी है। ऊपर इस्तेमाल हुई हर विधि SDK संदर्भ में है, और सटीक बिलिंग नियम सैंडबॉक्स की सीमाएँ और बिलिंग में।

संबंधित: कोड रिव्यू और PR जाँच के लिए सैंडबॉक्स और AI एजेंटों के लिए सैंडबॉक्स।

तैनात करने के लिए तैयार? क्रिप्टो से भुगतान करें, बिना KYC — लगभग एक मिनट में ऑनलाइन।

अभी तैनात करें →

FAQ

अविश्वसनीय pull requests को अपने self-hosted runner पर क्यों न चलाएँ?

self-hosted runner एक जॉब से दूसरी जॉब तक स्थिति बनाए रखता है और आम तौर पर उसमें डिप्लॉय कुंजियाँ या क्लाउड क्रेडेंशियल रखे होते हैं। किसी अनजान व्यक्ति का pull request उन्हें एक ही कदम में पढ़ सकता है। सैंडबॉक्स हर बार साफ़ शुरू होता है और उसमें टेस्ट हो रहे कोड के अलावा कुछ नहीं होता।

क्या कोई टेस्ट 55 सेकंड से ज़्यादा चल सकता है?

हाँ। 55 सेकंड की सीमा हर एक सिंक्रोनस कमांड पर लागू होती है। टेस्ट सूट को बैकग्राउंड टास्क के रूप में शुरू करें, उसका आउटपुट बीच-बीच में देखें, और वह सैंडबॉक्स की उम्र ख़त्म होने तक चल सकता है — अस्थायी सैंडबॉक्स के लिए अधिकतम 24 घंटे।

कितने टेस्ट रन एक साथ चल सकते हैं?

हर खाते में 20 सैंडबॉक्स तक, लेकिन हर खाते में एक समय पर सिर्फ़ 2 कमांड चलती हैं। CI के लिए इसका मतलब है कि दो जॉब सच में एक साथ चलती हैं; बाक़ी कतार में रहती हैं। अगर आपको बड़े पैमाने पर समानांतर शार्डिंग चाहिए, तो VPS पर runner का समूह बेहतर रहेगा।

क्या सैंडबॉक्स के अंदर Docker है?

सैंडबॉक्स में Python 3.12, Node.js 22, bash, git और curl मिलते हैं, और डिपेंडेंसी आप pip या npm से इंस्टॉल करते हैं। Docker इसमें शामिल नहीं है — अगर आपके टेस्ट कंटेनर चलाते हैं, तो उन्हें VPS पर runner में चलाएँ।

एक रन की लागत कितनी है?

प्रति सेकंड, कम से कम 60 सेकंड, टैरिफ़ के vCPU और RAM के लिए। standard टैरिफ़ (1 vCPU, 2 GB) पर तीन मिनट का रन लगभग $0.0033 का पड़ता है।

टिप्पणियाँ

अभी तक कोई टिप्पणी नहीं। पहले बनें।

एक टिप्पणी छोड़ें

टिप्पणियाँ दिखने से पहले मॉडरेट की जाती हैं।