Tovább a tartalomhoz

PR-beszélgetések

Egy pull request már önmagában is az a hely, ahol a kód körüli beszélgetés zajlik. A PR-beszélgetések egy Control Center-munkaterület felületévé teszik, ugyanúgy, ahogy egy csevegőhíd a Slackből az: említse meg @-tel a szerver GitHub App botját egy PR-en, válaszoljon az átnézési szálain belül, vagy adja hozzá az ai-review címkét, és a munka a PR átnézési terében történik — ugyanolyan attribúció és korlátok mellett, mint bármi, amit az alkalmazásban gépelnek be. A hozzászólás emellett tagsághoz kötött; a címke nem, mert nincs szerzője. A bot válaszai a GitHubon jönnek vissza, abban a szálban, ahol a kérdést feltették.

Három döntés alakítja a funkciót, és mindegyik ugyanaz a döntés, amelyet a csevegőhíd a csevegéshez hozott, kódhosztra átfogalmazva: melyik irányban fut a kapcsolat, mi jogosít fel egy kívülről érkező hozzászólást, és kihez van rendelve a beszélgetés mindkét oldala.

A GitHub egyetlen push-csatornája egy alkalmazás számára a webhook, a webhookhoz pedig bejövő URL kell — pont az, amit ez a felület szándékosan soha nem igényel. A felderítés ezért pásztázás: nagyjából percenként, alkalmazástelepítésenként egy aliasolt keresés megkérdezi a GitHubot a botot (vagy annak rövid slugját) említő PR-ekről és az átnézési címkét viselő nyitott PR-ekről, azoknak a PR-eknek, amelyeknek már van átnézési terük, beolvassuk a hozzászólásszálait, és mindent a hozzászólás azonosítója alapján vetünk össze azzal, amit az előző pásztázás látott.

A tervezési következményeket érdemes megnevezni:

  • A késleltetés egy pásztázási intervallum, nem egy esemény. A 👀 visszaigazolás körülbelül egy percen belül megérkezik. Semmi sürgős nem múlik rajta.
  • Pontosan egyszer, hozzászólásonként. A hozzászólás-azonosítók a GitHubon egyediek; mindegyiket abban a pillanatban rögzítjük, amikor jogosultként osztályozzuk, mielőtt bármi hatna rá. Egy összeomlás elveszítheti egy hozzászólás feldolgozását, de soha nem indítja el kétszer.
  • Az offline időt behozzuk, nem újrajátsszuk. A látottak halmaza tartósan tárolódik, így egy újraindulás leszállítja azt, ami a leállás alatt érkezett. Az egyetlen kivétel a legelső pásztázás: mivel nincs mihez hasonlítani, minden függőben lévő elem csendben rögzítésre kerül — egy üzemeltető, aki húsz PR-t címkézett fel, mielőtt ez a szerver létezett, nem térhet vissza húsz futó átnézéshez.
  • A címke egy halmaz, nem egy esemény. A keresés a címke jelenlétét jelenti, így egy felcímkézett PR egyszer, és csakis egyszer indul el. Egy címke eltávolítás utáni újbóli hozzáadása láthatatlan a pásztázás számára; az újrafuttatás útja az említés.

A keresés telepítési fiókonként egyszer fut, az adott tulajdonos saját kliensén, mert egy telepítési token csak a saját telepítése repóit látja — egyetlen, a teljes szerverre érvényes hitelesítő adat csendben elszalasztaná az alkalmazás összes többi telepítése alá tartozó PR-t.

A tagság jogosít fel, nem a hozzászólás

Szekció neve “A tagság jogosít fel, nem a hozzászólás”

Egy PR-hozzászólás alig többet hoz magával, mint a szerző bejelentkezési nevét — egy hitelesítetlen külső identitást, amíg be nem bizonyosodik. A bot ezt a munkaterület tagjainak és a hozzájuk kapcsolt GitHub-fiókoknak a fordított indexe alapján oldja fel, amelyet TTL szerint építünk újra, mert az emberek bejelentkeznek és meghívót kapnak, miközben a szerver fut.

A zártra váltó viselkedés egy létrához hasonlít, és minden fokozat abban a szálban válaszol, amelyben elutasított:

  • Egy ismeretlen bejelentkezési név — nincs összekapcsolva, vagy olyasvalaki kapcsolta össze, aki nem tagja ennek a munkaterületnek — azt a választ kapja, hogy jelentkezzen be, és győződjön meg róla, hogy ide tartozik
  • Egy csak olvasásra jogosult tag (viewer vagy guest) azt a választ kapja, hogy a szerepköre nem indíthat munkát

A két ismeretlen bejelentkezési eset egyetlen választ oszt meg: a fordított index csak ennek a munkaterületnek a tagját adja vissza, így egy nem összekapcsolt fiók és egy összekapcsolt, de nem tag felhasználó ugyanaz a kihagyás. Egyikük sem folytatja. Egy hozzászólást soha nem tulajdonítunk olyasvalakinek, aki nem ő küldte, és egy idegen szavai soha nem lépnek be olyan munkaterületre, amelyet nem láthat.

Az ai-review címkének nincs szerzője, akit fel lehetne oldani, ezért nem mászik fel ezen a létrán. A hozzáadása abban a munkaterületben indítja el az átnézést, amely már kapcsolódik a repóhoz.

A beszélgetés mindkét oldala más identitást visel, és épp a különbség maga a funkció:

  • A GitHubon a bot maga a szerver. Minden hozzászólás, reakció és válasz, amelyet a híd közzétesz, az alkalmazás telepítési tokenjével megy ki. Senki nem kattintott semmire egy kliensben, így semmi nem kölcsönöz egy személy fiókját — ugyanaz a szabály, amely a webhookokat és a lekérdezést távol tartja az emberi hitelesítő adatoktól.
  • A térben a kérdés az Öné. Az üzenet ahhoz a taghoz van rendelve, akivé a szerző feloldódott, és az ügynökfuttatás az ő nevében történik: a commitok társszerzőjeként tüntetik fel, a tér autonómiatárcsája és műveletkorlátai pedig pontosan úgy érvényesek, mint egy az alkalmazásban beírt üzenetre. A futtatásból származó kódhoszt-írások továbbra is az alkalmazás nevében mennek ki — ugyanaz a szabály, mint a fenti pontban —, nem a tag személyes tokenjével.

Az átnézési megállapítások visszaközzététele a GitHubra továbbra is egy személy döntése marad, amelyet a Control Centerben hoz meg. Egy említés elindíthat egy átnézést; közzétenni csak ember tud egyet.

A hurok elleni védelem és a rövid név

Szekció neve “A hurok elleni védelem és a rövid név”

Minden, amit botfiók írt, még azelőtt kiesik, hogy bármelyik kapu lefutna — konkrétan a miénk, és minden [bot] utótag, így egy másik alkalmazás átnéző botja sem ébresztheti fel a miénket. E nélkül a bot saját válaszai új hozzászólásként érkeznének meg, és a végtelenségig újraaktiválnák.

A [bot] utótag az oka annak is, hogy létezik a rövid forma. A GitHub egy alkalmazásfiók bejelentkezési nevét <slug>[bot] formában rögzíti, nem kínál hozzá automatikus kiegészítést, és soha nem oldja fel a @slug nevet az alkalmazásra — a csupasz slug elfogadása tehát a mi illesztőnk döntése, a felderítéséhez pedig a hozzászólás nyers szövegére irányuló keresési sávra van szükség, nem a GitHub említési indexére. A költséget kimondjuk, nem elsimítjuk: egy olyan emberi felhasználó, aki ugyanazt a slugot használja, mint az alkalmazás, a saját minden rövid formájú említésével a botot szólítja meg. A jellegzetes alkalmazásnevek hipotetikussá teszik ezt az ütközést.

  • Nincs automatikus közzététel. A megállapítások az átnézési térbe kerülnek; a GitHubra való közzététel külön, emberi művelet
  • Nincs homályos identitás. A szerző pontosan egy tagra oldódik fel, vagy elutasításra kerül — nincs találgatáson alapuló attribúció
  • Nincs GitHub App webhook. Ez a felület soha nem regisztrál egyet sem, így nincs PR-hozzászólásokhoz kitett bejövő URL. A termék egyéb webhookjai (pipeline-ok, jegyszinkronizáció) külön, opcionális beállítást jelentenek.