በራስ የሚስተናገዱ የCI runners አንድ የማይመች ባህሪ አላቸው፦ ሁሉንም ያስታውሳሉ። cache፣ tokens፣ አንድ ሰው ባለፈው ፀደይ "ለጊዜው" ያከለው የdeploy ቁልፍ። ለራስዎ branches ይህ ችግር የለውም። ችግሩ የሚጀምረው ስሙን ሰምተው ከማያውቁት ሰው pull request ሲመጣ ነው — ወይም ገና ማንም ያላነበበውን patch ከጻፈው የራስዎ AI ኤጀንት።
ንጹሁ መልስ ለእያንዳንዱ ሩጫ አንድ ማሽን ነው። clone ያድርጉ፣ ይጫኑ፣ ይሞክሩ፣ ማሽኑን ይጣሉ።
ሩጫ ምን ይመስላል
sandbox በአንድ ሰከንድ ገደማ ከPython 3.12፣ Node.js 22፣ git እና curl ጋር የሚነሳ Firecracker microVM ነው። ወደ ውጭ የሚወጣ ኢንተርኔት ይሰራል፣ ስለዚህ git clone እና pip install -r requirements.txt እንደተለመደው ይሰራሉ። ወደ ውስጥ የሚገቡ ports የሉም — እየሄደ ሳለ ምንም ነገር ወደ የሙከራ አካባቢው መገናኘት አይችልም።
ከCI ስራ አንጻር ሙሉ ሂደቱ አጭር script ነው። ከማንኛውም የCI ስራ ሊጠራ የሚችለው የPython SDK ስሪት ይኸውና፦
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 በCI ሚስጥሮችዎ ውስጥ EQVPS_API_KEY በሚል ስም ይቀመጣል። ከCIዎ ሌላ ምንም ነገር — የdeploy ቁልፎችም ሆኑ የክላውድ ምስክርነቶች — ወደ sandbox አይገባም። የwith ብሎኩ ሲያልቅ sandbox ይሰረዛል፣ ስራው በመሀል ቢበላሽም እንኳ።
የሙከራው ሩጫ ራሱ የጀርባ ስራ ነው፣ ምክንያቱም አንድ synchronous ትዕዛዝ በ55 ሰከንድ ይቆማል። የጀርባ ስራ እየሰራ ውጤቱን ይልካል፣ እና እስከ sandbox TTL ድረስ ሊቀጥል ይችላል — እዚህ የተቆለፈ ሙከራ ሂሳብ እንዳያሳብጥ 30 ደቂቃ ተቀምጧል።
በእውነት የሚያጋጥሙዎት ገደቦች
ስለእነሱ ግልጽ መሆን ሙሉ ከሰዓት ያድንልዎታል።
በአንድ ጊዜ ማሄድ። አንድ መለያ 20 sandboxes ሊኖረው ይችላል፣ ነገር ግን በአንድ ጊዜ የሚሄዱት 2 ትዕዛዞች ብቻ ናቸው። ለCI ይህ በእውነት ትይዩ የሚሄዱ ሁለት ስራዎች ናቸው። በአንድ ጊዜ የመጡ አስር PRs ወረፋ ይይዛሉ። pipelineዎ ሙከራዎችን ለ16 workers የሚከፋፍል ከሆነ፣ ለዋናው pipeline ይህ ትክክለኛ መሳሪያ አይደለም — እሱን በVPS ላይ ባሉ የራስዎ runners ያቆዩት፣ sandboxesን ደግሞ ለማይታመነው መስመር ይጠቀሙ።
ውስጥ containers የሉም። Docker ከsandbox ጋር አይመጣም። የPostgres container የሚያስፈልጋቸው unit እና integration ሙከራዎች እንዳሉ አይሰሩም፤ በSQLite ወይም በማህደረ ትውስታ ውስጥ ባለ የውሸት ነገር የሚሰሩ ሙከራዎች ግን ይሰራሉ።
ፋይሎች። በAPI መስቀልና ማውረድ በአንድ ፋይል እስከ 5 MB ነው። archive ከመስቀል ይልቅ ኮዱን በsandbox ውስጥ በgit ያምጡ።
ስንት ያስከፍላል
ለታሪፉ vCPU እና RAM በሰከንድ ይከፍላሉ፣ ቢያንስ 60 ሰከንድ፣ ከቅድመ ክፍያ ቀሪ ሂሳብ — ያለ ምዝገባ ክፍያ።
| ሩጫ | ታሪፍ | ግምታዊ ወጪ |
|---|---|---|
| Lint + unit ሙከራዎች፣ 1 ደቂቃ | small (0.5 vCPU, 1 GB) | $0.0006 |
| ሙሉ ስብስብ፣ 3 ደቂቃ | standard (1 vCPU, 2 GB) | $0.0033 |
| Build + ሙከራዎች፣ 10 ደቂቃ | plus (2 vCPU, 4 GB) | $0.022 |
በእነዚህ ዋጋዎች አስደሳቹ ጥያቄ ወጪው ሳይሆን ሙከራዎችዎ ባስቀመጡት ጊዜ ውስጥ ያልቃሉ ወይ የሚለው ነው። ከዝግተኛው የተሳካ ሩጫዎ ትንሽ በላይ ለTTL ቦታ ይስጡ።
ምክንያታዊ ክፍፍል
የእኛ ምክር፦ የሚታመኑ branchesን በፈጣኑ፣ cache ባለው runnerዎ ላይ ያቆዩ። እርስዎ ያልጻፉትን ሁሉ — forks፣ የውጭ አስተዋጽዖ አበርካቾች፣ በኤጀንቶች የተፈጠሩ patches — መጀመሪያ በsandbox ውስጥ ያሳልፉ። የsandbox ሩጫው ከተሳካ እና አንድ ሰው diffን ከተመለከተ፣ ወደ ታማኙ pipeline ያሳድጉት።
በዚህ መንገድ ፍጥነትና cache የሚያስፈልጉበት አንድ መስመር፣ ንጹህ ማሽን የሚያስፈልግበት ሌላ መስመር ይኖርዎታል — አንድን መሳሪያ ሁለቱንም እንዲሆን ሳያስገድዱ።
በsandbox መግቢያ እና በየግንኙነት መመሪያ ይጀምሩ — አዲስ መለያዎች የ$1 የsandbox ጊዜ ያገኛሉ፣ ይህም ለጥቂት መቶ አጭር ሙከራዎች ይበቃል። ከላይ ጥቅም ላይ የዋለው እያንዳንዱ ዘዴ በSDK ማጣቀሻ ውስጥ አለ፣ ትክክለኛዎቹ የሂሳብ ደንቦች ደግሞ በsandbox ገደቦችና ሂሳብ ውስጥ።
አስተያየቶች
እስካሁን አስተያየቶች የሉም። መጀመሪያ ይሁኑ።