uVersion
Türkçe
İndir →

Wiki

Webhook'lar

Depo başına giden bildirimler (Discord, Slack, Teams, custom): check-in, check-out ve etkinlik özetlerinde. Oluşturma, mesaj biçimi, şablon değişkenleri, SSRF koruması.

Giriş

Bir webhook, bir depoda her olay gerçekleştiğinde harici bir hizmete (Discord, Slack, Microsoft Teams, veya seçtiğiniz bir URL) giden bir bildirim gönderir: bir check-in, bir check-out veya periyodik bir etkinlik özeti. Bir ekibi istemciyi açmadan haberdar tutmanın en basit yoludur: biri iş gönderdiğinde kanalınıza bir mesaj düşer.

Webhook'lar depo başına, masaüstü istemcisinin yönetim panelinde, Webhooks sekmesinde yapılandırılır. Bir deponun birden çok webhook'u olabilir (örneğin tüm ekip için Discord'a bir tane, liderler için özel bir Slack'e bir tane).

Erişim ve roller

Webhook yönetimi depo yöneticilerine ayrılmıştır: herhangi bir depoda bir süper yönetici (admin rolü) veya yönettiği depolarda bir project_admin. Diğer roller bu sekmeyi görmez.

Bilinmesi gereken Webhooks sekmesi çoklu webhook sistemini kullanır (depo başına birden çok kayıt). Tek URL'li eski bir Discord bildirimi uyumluluk için sunucu tarafında hâlâ mevcuttur, ancak bu yeni sekmede gösterilmez: burada anlatılan webhook'ları kullanın.

Webhook oluşturma

Add Webhook formu: Name, URL, Type (discord/slack/teams/custom), Events kutucukları, Enabled anahtarı.
  1. Yönetim panelini açın, depoyu seçin, ardından Webhooks sekmesini açın.
  2. Add Webhook'a tıklayın.
  3. Alanları doldurun, ardından Create.
AlanDeğer
NameSonradan tanımak için bir etiket (ör. Discord équipe). Zorunlu.
URLHedef hizmetin sağladığı webhook URL'si. Zorunlu. Reddedilen URL'ler için Güvenlik bölümüne bakın.
Typediscord, slack, teams veya custom.
Eventscheckin, checkout, activity_summary arasından bir veya birkaçı. En az biri zorunlu.
EnabledEtkinleştirme anahtarı (düzenlemede ve listeden görünür).

Discord tarafında URL'yi almak için: Kanal ayarları → Entegrasyonlar → Webhook'lar → Yeni Webhook → Webhook URL'sini Kopyala. Slack tarafında: Slack uygulaması ayarlarında bir Incoming Webhook oluşturun. Teams tarafında: kanalda Bağlayıcılar → Incoming Webhook.

Eğitim: Discord webhook'u

Bu en yaygın durumdur. «URL'yi alma» kısmı tamamen Discord içinde, yalnızca bir kez gerçekleşir.

Discord tarafında: URL'yi alma

  1. Discord'u açın ve sunucunuza gidin. Bildirimleri alacak metin kanalını seçin (veya oluşturun), örneğin #uversion.
  2. Kanal adının üzerine gelin ve dişli simgesine tıklayın («Kanalı Düzenle»).
  3. Soldaki menüde Entegrasyonlar sekmesini açın.
  4. Webhook'lar'a, ardından Yeni Webhook'a tıklayın. Discord bu kanala bağlı olarak otomatik bir tane oluşturur.
  5. Oluşturulan webhook'a tıklayarak açın. Ona bir ad verin (örneğin uVersion) ve hedef kanalın doğru olduğunu doğrulayın. Avatar görseli isteğe bağlıdır.
  6. Webhook URL'sini Kopyala'ya tıklayın. URL şuna benzer: https://discord.com/api/webhooks/123456789/AbCdEf....
Bu URL'yi gizli tutun URL'ye sahip olan herkes kanalınıza mesaj gönderebilir. Onu depoya commit'lemeyin ve herkese açık paylaşmayın. Sızarsa, webhook'u Discord tarafında silin ve yenisini oluşturun.

uVersion tarafında: URL'yi bağlama

  1. Masaüstü istemcisinde yönetim panelini açın, depoyu seçin, ardından Webhooks sekmesini açın.
  2. Add Webhook'a tıklayın.
  3. Name: kendiniz için bir etiket (ör. Discord équipe).
  4. URL: Discord'dan kopyaladığınız URL'yi yapıştırın.
  5. Type: discord seçin (mesajın Discord embed'i olarak biçimlendirilmesi için zorunlu).
  6. Events: istediğiniz olayları işaretleyin, örneğin checkin.
  7. Create'e tıklayın.
  8. Webhook satırında Send test'e tıklayın: birkaç saniye içinde Discord kanalında bir test mesajı görünmelidir.

Test bir HTTP 401 veya 404 koduyla başarısız olursa, URL yanlıştır ya da webhook Discord tarafında silinmiştir: URL'yi yeniden kopyalayın. Test yeşil olmasına rağmen hiçbir şey gelmiyorsa, doğru kanala baktığınızı ve webhook'un Discord'da devre dışı bırakılmadığını doğrulayın.

Türler ve biçimler

Type, uVersion'ın mesajı göndermeden önce nasıl biçimlendireceğini belirler. URL'nin işaret ettiği hizmete uygun olanı seçin, aksi hâlde mesaj bozuk biçimde ulaşır (veya hizmet tarafından reddedilir).

TypeGönderilen biçim
discordDiscord embed'i (başlık, renk, alanlar).
slackSlack yükü (mesaj blokları).
teamsMicrosoft Teams kartı (MessageCard).
customTamamen sizin tanımladığınız JSON gövdesi: Özel webhook'lar bölümüne bakın.

Olaylar

OlayTetiklenme koşulu…
checkinBir kullanıcı depoya bir commit gönderdiğinde.
checkoutBir kullanıcı bir veya birden çok dosyayı kilitlediğinde (check-out).
activity_summarySunucu zamanlayıcısı periyodik bir etkinlik özeti ürettiğinde (günlük / haftalık).

Yalnızca kanalınızın ihtiyaç duyduğunu işaretleyin. Büyük bir stüdyoda checkout gürültülü olabilir: birçok ekip yalnızca checkin ve activity_summary'yi tutar.

Özel webhook'lar

custom türüyle iki ek alan görünür: Custom Headers (JSON) ve Custom Template (JSON). Bunlar, JSON POST kabul eden herhangi bir hizmeti entegre etmenizi sağlar.

Template

Şablon, gönderilen JSON gövdesidir. uVersion, çift süslü parantez içindeki değişkenleri olayın değerleriyle değiştirir. Örnek:

{"text": "{{event_type}} par {{username}} dans {{repository}}"}

Kullanılabilir değişkenler:

Değişkenİçerik
{{event_type}}Olay türü (checkin, checkout, activity_summary).
{{repository}}Depo adı.
{{username}}Olayı başlatan kullanıcı.
{{message}}Commit mesajı (bir check-in için).
{{file_count}}İlgili dosya sayısı.
{{commit_hash}}Commit karması.
{{timestamp}}Olayın zaman damgası.

Headers

İsteğe eklenecek HTTP başlıklarından oluşan bir JSON nesnesi, örneğin bir kimlik doğrulama belirteci:

{"Authorization": "Bearer VOTRE_JETON"}

Varsayılan olarak {} (başlık yok). Taşımaya ayrılmış başlıklar (host, content-length, transfer-encoding, connection) otomatik olarak kaldırılır ve geçersiz kılınamaz.

Geçerli JSON zorunlu Headers ve Template alanları kaydederken doğrulanır. Geçersiz JSON, kaydetmeyi açık bir mesajla engeller («Invalid JSON in headers» / «… template»). Süslü parantezlerinizi ve tırnaklarınızı kontrol edin.

Test etme, etkinleştirme, silme

« Send test » düğmesine sahip bir webhook satırı ve ideal olarak Discord'da alınan test mesajı.

Listedeki her webhook aşağıdaki eylemleri sunar:

  • Send test (uçak simgesi): hizmete bir test bildirimi gönderir ve satır içinde bir sonuç gösterir (yeşil onay veya çarpı). Ona güvenmeden önce URL ve türü doğrulamak için yararlıdır.
  • Anahtar: webhook'u silmeden etkinleştirir / devre dışı bırakır.
  • Edit: herhangi bir alanı düzenler.
  • Delete: kalıcı silme (onay istenir).
Test, yanıt gövdesini döndürmez Başarısızlık durumunda uVersion yalnızca hizmetin döndürdüğü HTTP kodunu belirtir (ör. «Webhook returned HTTP 404»), yanıtın içeriğini asla döndürmez. Bu bilinçlidir (Güvenlik bölümüne bakın). Test başarısız olursa önce URL ve türü, ardından hizmet tarafındaki webhook izinlerini kontrol edin.

Güvenlik: SSRF koruması

Bir webhook, bir HTTP isteğinin sunucu tarafından gönderilmesini sağlar. Kötü niyetli bir URL'nin sunucunun iç ağını yoklamak (SSRF saldırısı) için kullanılmasını önlemek amacıyla, uVersion oluşturma, değiştirme ve test sırasında katı bir koruma uygular:

  • Şema http veya https olmalıdır. Diğer her şema reddedilir.
  • Ana bilgisayar adı DNS ile çözümlenir ve elde edilen her IP adresi denetlenir. Biri genel olmayan bir adrese işaret ediyorsa webhook reddedilir: loopback, özel ağlar (RFC1918), link-local, broadcast, CGNAT aralığı 100.64.0.0/10, bulut meta verisi 169.254.169.254, ULA / IPv6 link-local ve bunların IPv4-mapped-IPv6 karşılıkları.
  • HTTP yönlendirmeleri izlenmez (böylece bir iç ana bilgisayara yapılan 307 korumayı atlayamaz).
  • Yukarı akış yanıt gövdesi istemciye asla döndürülmez (SSRF oracle'ı yok).

Uygulamada: bir webhook URL'si genel bir hizmete işaret etmelidir (Discord, Slack, Teams veya İnternet'ten erişilebilen kendi uç noktanız). localhost, özel bir IP (10.x, 192.168.x, 172.16-31.x) veya dahili bir hizmete giden bir URL, «Webhook URL refused: …» mesajıyla reddedilir.

Sık karşılaşılan tuzaklar

Tür, hizmetle eşleşmiyor

Bir Discord biçimini bir Slack URL'sine (veya tersine) göndermek, bozuk biçimli bir mesaj veya hizmet tarafında bir ret üretir. Type alanı URL ile eşleşmelidir. Şüpheniz varsa bir Send test yapın.

Hiçbir olay işaretlenmemiş

Olayı olmayan bir webhook asla tetiklenmez. Hiçbir olay seçilmediği sürece istemci kaydetmeyi engeller («At least one event is required»).

Dahili URL reddedildi

Kendi makinenizdeki veya LAN'ınızdaki bir hizmete karşı test yaparsanız, SSRF koruması onu reddeder. Webhook hedefi olarak kullanmak için hizmeti genel bir URL'de (veya bir tünelde) yayınlayın.

Unutulmuş devre dışı webhook

Devre dışı bırakılmış bir webhook listede kalır ama hiçbir şey göndermez. Bildirimler sustuysa, URL'den şüphelenmeden önce etkinleştirme anahtarını kontrol edin.