−25%

yıllık Windows ödemesinde, 31 Ekim'e kadar. Paketlere git

EQVPS
Hemen başla

Kod incelemesi ve PR kontrolleri için sandbox: bir yamayı onaylamadan önce çalıştığını kanıtlayın

Bir diff'i okumak, yamanın ne iddia ettiğini söyler. Çalıştırmak, bunun doğru olup olmadığını söyler. Bir pull request'i tek kullanımlık bir microVM'e alın, hatayı öncesinde ve sonrasında yeniden üretin, testleri koşturun ve kanıtla inceleyin — geçiş başına yaklaşık yarım sente.

Bir diff, yamanın ne yaptığını iddia ettiğini gösterir. Hatanın gerçekten gidip gitmediğini, bir if'in yeni dalının hiç çalışıp çalışmadığını ya da bağımlılık güncellemesinin temiz kurulumda import'u bozup bozmadığını göstermez. İncelemeciler bunu bilir; bu yüzden pek çok inceleme "LGTM, testler geçerse" diye biter.

Yapay zekânın yazdığı yamalarda bu açık büyür. Bir model hızla makul görünen kod üretir ve makul görünen, tam da yorgun bir incelemecinin gözünden kaçan türdür. Ucuz çözüm, değişikliği kimse onaylamadan önce, hiçbir şeye zarar veremeyeceği bir yerde çalıştırmaktır.

Kontrol: base, head, testler

Bir yamanın sunabileceği en ikna edici kanıt, eski kodda başarısız olup yenisinde geçen bir yeniden üretimdir. Sandbox bunu 20 satırlık bir betiğe dönüştürür. Python 3.12, Node.js 22, git ve curl içeren, yaklaşık bir saniyede açılan bir Firecracker microVM'dir:

import os
from eqvps import Sandbox

REPO, BASE, HEAD = os.environ["REPO_URL"], os.environ["BASE_SHA"], os.environ["HEAD_SHA"]

def repro(sb, ref):
    sb.exec(f"cd /root/app && git checkout -q {ref}", timeout=55)
    return sb.exec("cd /root/app && python3 /root/repro.py", timeout=55).exit_code

with Sandbox.create(tariff="standard", ttl=1800) as sb:
    sb.exec(f"git clone -q {REPO} /root/app", timeout=55)
    sb.exec("cd /root/app && pip install -q -r requirements.txt", timeout=55)
    sb.upload("/root/repro.py", open("repro.py").read())
    before, after = repro(sb, BASE), repro(sb, HEAD)
    tests = sb.exec("cd /root/app && python3 -m pytest -q", background=True).wait()
    print(f"repro on base: {before}, on head: {after}; tests: {tests.state}, exit {tests.exit_code}")

repro.py, hata raporundaki kod parçasıdır. base üzerinde sıfırdan farklı, head üzerinde sıfır koduyla çıkıyorsa yama düzelttiğini iddia ettiği şeyi düzeltiyor demektir. Bu satırı test özetiyle birlikte pull request'e yorum olarak yazın; incelemeci olgularla başlasın.

Test paketi arka plan görevi olarak çalışır, çünkü tek bir senkron komut 55 saniyede durur. 30 dakikalık TTL, takılan bir koşunun size ne kadar fatura çıkarabileceğini sınırlar.

Kod çalıştıran inceleme ajanları

Aynı fikir yapay zekâ incelemecisi için de işler. MCP sunucusu üzerinden bağlanan bir ajanın sandbox araçları vardır: sandbox oluşturma, komut çalıştırma, dosya yükleme ve indirme. "Bu, Python 3.8 uyumluluğunu bozabilir" yazmak yerine branch'i alır, kodu çalıştırır ve traceback'i alıntılar — ya da her şeyin yolunda olduğunu bildirir.

Böyle bir ajana bir harcama limiti ve salt okunur bir token verin; hangi araçları sormadan çağırabileceğine karar verin. MCP güvenlik önlemleri her aracı risk düzeyine göre listeler.

Hangi tarife

DepoTarifeTipik geçişYaklaşık maliyet
Küçük kütüphane, saf Python veya JSsmall (0.5 vCPU, 1 GB)2 dk$0.0011
Test paketi olan web uygulamasıstandard (1 vCPU, 2 GB)5 dk$0.0055
Yerel eklentiler, derlenen bağımlılıklarplus (2 vCPU, 4 GB)15 dk$0.033

Geçici sandbox'lar en az 60 saniyeyle saniye başına faturalanır. Bir incelemeci birkaç gün boyunca aynı ortama dönmek istiyorsa, onu persistent olarak oluşturun: diskini 30 güne kadar korur ve başlayan her saat için faturalanır; iki günlük bir inceleme için tutulan standard bir sandbox yaklaşık $3.17 tutar. Pull request birleştirildiğinde silin.

Bilinmesi gereken sınırlar

  • Hesap başına aynı anda iki komut. Birbiri ardına yapılan incelemeler için fazlasıyla yeterli. Onlarca pull request'i aynı anda kontrol ederseniz sıraya girerler.
  • Gelen port yok. Uygulamayı tarayıcıda açamazsınız. İçeride başlatın ve ikinci bir komuttan curl localhost ile test edin.
  • İçeride Docker yok. Konteyner başlatan testlerin yeri bir VPS runner'ıdır.
  • Giden internet açık. pip install'ı çalıştıran şey bu. Sandbox'a, yamanın yazarına vermeyeceğiniz hiçbir şeyi koymayın.

Başlarken

Yeni hesaplar $1 sandbox süresi alır; bu, standard tarifesinde yüzden fazla inceleme geçişine yeter. Sandbox sayfasında tarifeler, SDK başvurusunda yukarıda kullanılan her yöntem, 5 dakikada Python SDK'sı sayfasında ise kurulum var.

İlgili: tüm pipeline için izole CI test koşuları ve kodu en baştan yazan ajanlar için yapay zekâ ajanları için sandbox.

Dağıtmaya hazır mısınız? Kripto ile ödeyin, KYC yok — yaklaşık bir dakikada çevrimiçi.

Dağıt →

SSS

Bunun pull request üzerinde CI çalıştırmaktan farkı ne?

CI, mevcut testlerin geçip geçmediğini yanıtlar. İnceleme kontrolü ise yamanın söylediğini yapıp yapmadığını yanıtlar: hata raporundaki yeniden üretimi eski ve yeni kod üzerinde çalıştırır, incelemeciyi endişelendiren uç durumu dener ve incelemecinin kurcalayabileceği bir sandbox'ı hazır tutar. İkisi birlikte iyi çalışır.

Bir yapay zekâ inceleme ajanı bunu kullanabilir mi?

Evet, en çok da orada işe yarar. MCP üzerinden ajan; sandbox oluşturma, komut çalıştırma ve dosya okuma araçları alır. Bir değişikliğin bir şeyi bozup bozmadığını tahmin etmek yerine kodu çalıştırır ve çıktıyı incelemesinde alıntılar.

Bir yabancının pull request'ini almak güvenli mi?

Sandbox'ın amacı tam olarak bu. Kod, kendi çekirdeğine sahip ayrı bir microVM'de çalışır ve içinde sizin koyduklarınız dışında size ait hiçbir şey yoktur. Deponuza yazabilen bir token vermeyin; özel depolar için salt okunur bir token yeterlidir.

Pull request'teki uygulamayı tarayıcımda açabilir miyim?

Hayır. Sandbox'ların gelen portu yoktur, bu yüzden dışarıdan hiçbir şey onlara bağlanamaz. Uygulamayı içeride başlatıp başka bir komuttan curl ile test edebilir ya da incelemecilerin bir arayüzde gezinmesi gerekiyorsa önizlemeleri bir VPS'e dağıtabilirsiniz.

Bir inceleme geçişi ne kadar tutar?

Tipik bir geçiş — klonla, kur, iki kez yeniden üret, testleri koştur — standard tarifesinde birkaç dakika sürer ve yaklaşık $0.005 tutar. Ön ödemeli bakiyeden, en az 60 saniyeyle saniye başına ödersiniz.

Yorumlar

Henüz yorum yok. İlk olun.

Bir yorum bırakın

Yorumlar görünmeden önce denetlenir.