İçeriğe geç

PR konuşmaları

Kod hakkındaki konuşma zaten bir pull request’te gerçekleşir. PR konuşmaları onu bir Control Center çalışma alanında bir yüzey haline getirir; tıpkı bir sohbet köprüsünün Slack’i böyle bir yüzey haline getirmesi gibi: bir PR’da sunucunun GitHub App botunu @ ile anın, inceleme konularının içinde yanıtlayın veya ai-review etiketini ekleyin ve iş, PR’ın inceleme alanında gerçekleşir — uygulamada yazılan her şeyle aynı atıf ve korumalar altında. Bir yorum ayrıca üyeliğe bağlıdır; etiket değildir, çünkü onun bir yazarı yoktur. Botun yanıtları, sorunun sorulduğu kanal üzerinden GitHub’a geri döner.

Bu özelliği üç karar şekillendirir ve her biri, sohbet köprüsünün sohbet için verdiği aynı kararın bir forge için yeniden ifade edilmiş halidir: bağlantının hangi yönde çalıştığı, dışarıdan gelen bir yorumu neyin yetkilendirdiği ve her iki tarafın kime atfedildiği.

GitHub’ın bir uygulama için sunduğu tek push kanalı bir webhook’tur ve bir webhook gelen bir URL gerektirir — bu yüzeyin bilinçli olarak asla talep etmediği tek şey. Dolayısıyla keşif bir taramadır: yaklaşık her dakika, her uygulama kurulumu için takma adlı tek bir arama GitHub’dan botu (veya kısa slug’ını) anan PR’ları ve inceleme etiketini taşıyan açık PR’ları ister, hâlihazırda bir inceleme alanı olan PR’ların yorum konuları okunur ve her şeyin farkı, yorum kimliği üzerinden son taramada görülenlere göre alınır.

Tasarımın sonuçlarını adlandırmaya değer:

  • Gecikme bir olay değil, bir tarama aralığıdır. 👀 onayı yaklaşık bir dakika içinde düşer. Buna bağlı acil bir şey yok.
  • Her yorum için tam olarak bir kez. Yorum kimlikleri GitHub genelinde benzersizdir; her biri uygun olarak sınıflandırıldığı anda, üzerinde herhangi bir şey işlem yapmadan önce kaydedilir. Bir çökme bir yorumun işlenmesini kaybettirebilir, ama onu asla iki kez tetiklemez.
  • Çevrimdışı süre yakalanır, yeniden oynatılmaz. Görülenler kümesi kalıcıdır; dolayısıyla bir yeniden başlatma, kapalıyken gelenleri teslim eder. Tek istisna, ilk taramadır: karşılaştıracak bir belleği olmadığından, bekleyen her şey sessizce kaydedilir — bu sunucu var olmadan önce yirmi PR’ı etiketleyen bir operatör, dönüşünde yirmi çalışan incelemeyle karşılaşmamalıdır.
  • Etiket bir olay değil, bir kümedir. Arama etiketin varlığını bildirir; dolayısıyla etiketlenmiş bir PR yalnızca bir kez tetiklenir. Bir etiketi kaldırıp yeniden eklemek tarama için görünmezdir; yeniden çalıştırma yolu bir anmadır.

Arama, her kurulum hesabı için o sahibin kendi istemcisi üzerinden bir kez çalışır; çünkü bir kurulum token’ı yalnızca kendi kurulumunun depolarını görür — sunucu genelinde tek bir kimlik bilgisi, uygulamanın diğer kurulumları altındaki her PR’ı sessizce kaçırırdı.

Bir PR yorumu, bir yazar giriş adından biraz fazlasını taşıyarak gelir — kanıtlanana kadar kimliği doğrulanmamış bir dış kimlik. Bot bunu, çalışma alanının üyeleri ile onların bağlı GitHub hesaplarının ters dizinine karşı çözer; bu dizin, insanlar sunucu çalışırken oturum açıp davet aldığı için bir TTL ile yeniden kurulur.

Kapalı tarafa düşmek bir merdiven gibidir ve her basamak, reddettiği konuda yanıt verir:

  • Bilinmeyen bir giriş adına — bağlı değil ya da bu çalışma alanının üyesi olmayan biri tarafından bağlanmış — oturum açması ve buraya ait olduğundan emin olması söylenir
  • Salt okunur bir üyeye (viewer veya guest) rolünün iş başlatamayacağı söylenir

İki bilinmeyen giriş adı durumu tek bir yanıtı paylaşır: ters dizin yalnızca bu çalışma alanının bir üyesini döndürür; dolayısıyla bağlı olmayan bir hesap ile bağlı olan ama üye olmayan biri aynı ıskalamadır. Hiçbiri devam etmez. Bir yorum asla onu göndermeyen birine atfedilmez ve bir yabancının sözleri, göremediği bir çalışma alanına asla girmez.

ai-review etiketinin çözülecek bir yazarı yoktur; dolayısıyla bu merdiveni tırmanmaz. Onun eklenmesi, depoyu zaten bağlamış olan çalışma alanında incelemeyi başlatır.

Konuşmanın her tarafı farklı bir kimlik taşır ve fark da özelliğin kendisidir:

  • GitHub’da bot sunucudur. Köprünün gönderdiği her yorum, tepki ve yanıt uygulamanın kurulum token’ını kullanır. Hiç kimse bir istemcide bir şeye tıklamadı; dolayısıyla hiçbir şey bir kişinin hesabını ödünç almaz — webhook’ları ve yoklamayı insan kimlik bilgilerinden uzak tutan kuralın aynısı.
  • Alanın içinde soru size aittir. İleti, yazarın çözümlendiği üyeye atfedilir ve ajan çalıştırması onun adına yürütülür: commit’ler onları ortak yazar olarak gösterir ve alanın özerklik kadranı ile eylem korumaları, tıpkı uygulamada yazılan bir iletiye uygulandığı gibi uygulanır. Çalıştırmadan gelen forge yazmaları yine de uygulama olarak çıkar — yukarıdaki maddenin aynı kuralı — üyenin kişisel token’ıyla değil.

İnceleme bulgularını GitHub’a geri yayımlamak, Control Center’da verilen bir kişi kararı olarak kalır. Bir anma bir incelemeyi başlatabilir; onu yalnızca bir insan yayımlar.

Bir bot hesabı tarafından yazılan her şey, herhangi bir denetim çalışmadan önce düşürülür — özellikle bizimki ve her [bot] son eki; böylece başka bir uygulamanın inceleme botu da bizimkini uyandıramaz. Bu olmasaydı botun kendi yanıtları yeni yorumlar olarak gelir ve onu sonsuza dek yeniden tetiklerdi.

[bot] son eki, kısa biçimin var olmasının nedenidir. GitHub bir uygulama hesabının giriş adını <slug>[bot] olarak sabitler, onun için otomatik tamamlama sunmaz ve @slugı asla uygulamaya çözmez — dolayısıyla çıplak slug’ı kabul etmek bizim eşleştiricimizin kararıdır ve bunun keşfi, GitHub’ın anma dizini yerine ham bir yorum metni arama kanalı gerektirir. Maliyet yumuşatılmadan belirtilir: uygulamanın slug’ını paylaşan bir insan kullanıcı, kendisinden yapılan her kısa biçimli anmayla bota seslenir. Kendine özgü uygulama adları bu çakışmayı varsayımsal kılar.

  • Otomatik yayımlama yok. Bulgular inceleme alanına düşer; GitHub’a yayımlamak ayrı, insan eliyle yapılan bir eylemdir
  • Bulanık kimlik yok. Yazar tam olarak tek bir üyeye çözülür ya da reddedilir — tahmine dayalı atıf yoktur
  • GitHub App webhook’u yok. Bu yüzey hiçbir zaman bir webhook kaydetmez; dolayısıyla PR yorumları için açığa çıkarılacak bir gelen URL yoktur. Diğer ürün webhook’ları (pipeline’lar, bilet eşitleme) ayrı ve isteğe bağlı bir kurulumdur.