Percakapan PR
Pull request sudah menjadi tempat percakapan tentang kode berlangsung.
Percakapan PR menjadikannya permukaan pada ruang kerja Control Center, sama
seperti jembatan chat
menjadikan Slack demikian: sebut bot GitHub App milik server di sebuah PR,
balas di dalam utas tinjauannya, atau tambahkan label ai-review, dan
pekerjaannya berlangsung di space tinjauan milik PR — dengan atribusi dan
pagar pengaman yang sama seperti apa pun yang diketik di aplikasi. Komentar
juga digerbangi oleh keanggotaan; label tidak, karena label tidak punya
penulis. Jawaban bot kembali di GitHub, di jalur tempat pertanyaan diajukan.
Tiga keputusan membentuk fitur ini, dan masing-masing adalah keputusan yang sama yang dibuat jembatan chat untuk chat, dinyatakan kembali untuk forge: ke arah mana koneksinya berjalan, apa yang mengotorisasi komentar yang datang dari luar, dan siapa yang diatribusikan pada tiap sisinya.
Polling adalah transportnya
Bagian berjudul “Polling adalah transportnya”Satu-satunya kanal push GitHub untuk sebuah app adalah webhook, dan webhook memerlukan URL masuk — satu hal yang sengaja tidak pernah diwajibkan oleh permukaan ini. Jadi penemuannya berupa penyapuan: kira-kira setiap menit, satu pencarian ber-alias per instalasi app meminta GitHub mencari PR yang menyebut bot (atau slug pendeknya) dan PR terbuka yang membawa label tinjauan; PR yang sudah punya space tinjauan akan dibaca utas komentarnya; dan semuanya dibandingkan berdasarkan id komentar terhadap apa yang terlihat pada penyapuan sebelumnya.
Konsekuensi desainnya layak disebutkan:
- Latensi adalah interval penyapuan, bukan peristiwa. Pengakuan 👀 tiba dalam waktu sekitar satu menit. Tidak ada hal mendesak yang bergantung padanya.
- Tepat sekali, per komentar. Id komentar unik di seluruh GitHub; setiap id dicatat begitu diklasifikasikan sebagai memenuhi syarat, sebelum apa pun menindaklanjutinya. Crash dapat menghilangkan penanganan sebuah komentar, tetapi tidak akan pernah memicunya dua kali.
- Waktu offline dikejar, bukan diputar ulang. Himpunan yang sudah terlihat dipersistenkan, sehingga mulai ulang akan mengantarkan apa yang tiba saat server mati. Satu-satunya pengecualian adalah penyapuan pertama yang pernah terjadi: tanpa memori untuk dibandingkan, semua yang tertunda dicatat secara senyap — operator yang melabeli dua puluh PR sebelum server ini ada tidak boleh mendapati dua puluh tinjauan berjalan saat kembali.
- Label adalah himpunan, bukan peristiwa. Pencarian melaporkan keberadaan label, jadi PR yang dilabeli memicu sekali saja, selamanya. Menambahkan kembali label setelah menghapusnya tidak terlihat oleh penyapuan; sebutan adalah jalur untuk menjalankan ulang.
Pencarian berjalan sekali per akun instalasi pada klien milik pemilik itu sendiri, karena token instalasi hanya melihat repo instalasinya sendiri — satu kredensial tingkat server akan diam-diam melewatkan setiap PR di bawah instalasi app yang lain.
Keanggotaan yang mengotorisasi, bukan komentarnya
Bagian berjudul “Keanggotaan yang mengotorisasi, bukan komentarnya”Komentar PR datang hanya membawa login penulis — identitas eksternal yang belum terautentikasi sampai terbukti. Bot menyelesaikannya terhadap indeks terbalik anggota ruang kerja dan akun GitHub mereka yang terhubung, yang dibangun ulang berdasarkan TTL karena orang-orang masuk dan diundang saat server berjalan.
Perilaku fail-closed tampak seperti tangga, dan setiap anak tangganya menjawab di utas tempat penolakannya terjadi:
- Login yang tidak dikenal — tidak ditautkan, atau ditautkan oleh seseorang yang bukan anggota ruang kerja ini — diberi tahu untuk masuk dan memastikan bahwa dirinya termasuk anggota
- Anggota hanya-baca (
vieweratauguest) diberi tahu bahwa perannya tidak dapat memulai pekerjaan
Dua kasus login tak dikenal berbagi satu balasan: indeks terbalik hanya mengembalikan anggota ruang kerja ini, jadi akun yang tidak ditautkan dan non-anggota yang ditautkan adalah luput yang sama. Tak satu pun dari mereka lanjut. Komentar tidak pernah diatribusikan kepada orang yang tidak mengirimnya, dan kata-kata orang asing tidak pernah masuk ke ruang kerja yang tidak dapat mereka lihat.
Label ai-review tidak punya penulis untuk diselesaikan, jadi label ini tidak
menaiki tangga tersebut. Menambahkannya memulai tinjauan di ruang kerja yang
sudah menautkan repositori itu.
Dua identitas, dengan sengaja
Bagian berjudul “Dua identitas, dengan sengaja”Tiap sisi percakapan membawa identitas yang berbeda, dan perbedaan itulah fiturnya:
- Di GitHub, bot adalah server. Setiap komentar, reaksi, dan balasan yang diposting jembatan memakai token instalasi app. Tidak ada yang mengklik apa pun di klien, jadi tidak ada yang meminjam akun seseorang — aturan yang sama yang menjauhkan webhook dan polling dari kredensial manusia.
- Di space, pertanyaannya milik Anda. Pesan diatribusikan kepada anggota yang menjadi hasil penyelesaian penulisnya, dan run agen dieksekusi atas nama mereka: commit mencantumkan mereka sebagai ko-penulis, dan dial otonomi serta pagar pengaman tindakan milik space berlaku persis seperti pada pesan yang diketik di aplikasi. Penulisan ke forge dari run tetap keluar sebagai app — aturan yang sama seperti butir di atas — bukan memakai token pribadi anggota.
Menerbitkan temuan tinjauan kembali ke GitHub tetap merupakan keputusan seseorang, yang dibuat di Control Center. Sebutan dapat memulai sebuah tinjauan; hanya manusia yang menerbitkannya.
Penjaga loop, dan nama pendeknya
Bagian berjudul “Penjaga loop, dan nama pendeknya”Semua yang ditulis oleh akun bot dibuang sebelum gerbang mana pun berjalan —
milik kita secara khusus, dan setiap akhiran [bot], sehingga bot peninjau
milik app lain juga tidak dapat membangunkan bot kita. Tanpa ini, jawaban bot
sendiri akan datang sebagai komentar baru dan memicunya berulang tanpa henti.
Akhiran [bot] juga alasan bentuk pendek itu ada. GitHub menetapkan login akun
app pada <slug>[bot], tidak menyediakan autocomplete untuknya, dan tidak
pernah me-resolve @slug ke app — jadi menerima slug telanjang adalah
keputusan pencocok kita, dan menemukannya memerlukan jalur pencarian teks
komentar mentah alih-alih indeks sebutan GitHub. Biayanya dinyatakan alih-alih
dihaluskan: pengguna manusia yang berbagi slug app akan menyapa bot dengan
setiap sebutan bentuk pendek untuk dirinya sendiri. Nama app yang khas
membuat tabrakan itu hanya hipotetis.
Apa yang sengaja tidak ditawarkan
Bagian berjudul “Apa yang sengaja tidak ditawarkan”- Tanpa publikasi otomatis. Temuan mendarat di space tinjauan; menerbitkan ke GitHub adalah tindakan manusia yang terpisah
- Tanpa identitas kabur. Penulis diselesaikan ke tepat satu anggota atau ditolak — tidak ada atribusi berdasarkan dugaan terbaik
- Tanpa webhook GitHub App. Permukaan ini tidak pernah mendaftarkannya, jadi tidak ada URL masuk yang perlu diekspos untuk komentar PR. Webhook produk lain (pipeline, sinkronisasi tiket) merupakan penyiapan terpisah yang opsional.
Lihat juga
Bagian berjudul “Lihat juga”- Bicara ke Control Center dari PR GitHub: panduan praktis untuk semua ini
- Jembatan chat: tiga keputusan yang sama, dibuat untuk chat
- Buat GitHub App: dari mana identitas bot berasal
- Multiplayer — identitas, keanggotaan dan kehadiran: principal dan peran yang dilalui login saat diselesaikan
- Pagar pengaman: apa yang boleh dilakukan agen yang menjawab
- Gunakan tinjauan bertenaga AI: pipeline yang dimulai oleh sebutan atau label