Yerelde geçip CI'da patlayan test: aradaki fark nerede saklanıyor

Xaron'da tek bir kapı var ve aynı komut hem makinemde hem CI'da çalışıyor. Bunu kurmanın zor kısmı komutu yazmak değildi — iki ortamın neden farklı olduğunu tek tek bulmaktı.

"Bende çalışıyordu" cümlesi bir şaka değil, bir teşhis. Yerelde geçen bir testin CI'da patlaması, iki ortam arasında yazılı olmayan bir fark olduğunu söylüyor. Ve o fark bulunana kadar CI'a güvenmiyorsun — güvenmediğin CI da kırmızı yandığında "yine mi" deyip geçtiğin bir gürültü kaynağına dönüşüyor.

Xaron'da kural şu: tek bir kapı var. Biçimlendirme, uyarıların hata sayıldığı linter, çalışma alanı testleri, WASM derlemesi, entegrasyon testleri, bağımlılık denetimi. Hepsi tek komut, ve o komut yerelde ne yapıyorsa CI'da da onu yapıyor.

Kurarken zor olan kısım komutu yazmak değildi. İki ortamın farklarını tek tek bulmaktı.

Fark nerede saklanıyor

Dört yerde bulduk.

Araç sürümleri. Derleyici sürümü, linter sürümü, biçimlendirici sürümü. Yerelde bir sürüm ilerideyse, o sürümün yeni uyarısı sende çıkıyor CI'da çıkmıyor — ya da tersi. Çözüm, sürümü depoya yazmak ve iki tarafın da oradan okuması.

Kirli çalışma dizini. Yereldeki makinede önceki derlemenin çıktısı duruyor, CI temiz başlıyor. Bir dosyayı silmeyi unuttuysan, senin makinende hâlâ derleniyor. Bu, en sinsi fark — çünkü CI haklı, sen haksızsın.

Ortam değişkenleri. Yerelde bir değişken kabuğunda tanımlı olduğu için test geçiyor. CI'da tanımlı değil. Ya da tersi: CI'da bir sır tanımlı, yerelde değil, ve o testi hiç çalıştırmamışsın.

Servis bağımlılıkları. Veritabanı, önbellek, arama motoru. Yerelde elle ayağa kaldırdığın, günlerdir açık duran, içinde eski veri olan bir örnekle test ediyorsun. CI her seferinde sıfırdan başlatıyor. Bir test önceki testin bıraktığı veriye bağımlıysa, yerelde geçiyor CI'da patlıyor.

CI'ın işi hatayı bulmak değil. Yerel makinenin yalan söylediği yeri bulmak.

Konteyner farkı kapatıyor ama tembelleştiriyor

Bu farkların çoğunu kapatmanın açık yolu her şeyi konteynerde çalıştırmak. Servisler konteynerde, testler konteynerde, derleme konteynerde.

Bu çalışıyor. Ama bir yan etkisi var: konteyner içinde çalıştırmak yerel döngüyü yavaşlatıyor, ve yavaş döngü insanı testi atlamaya itiyor.

Bizde denge şöyle oturdu — servisler her zaman konteynerde ve her koşuda sıfırdan. Derleme ve test ise doğrudan makinede, ama araç sürümleri depoya sabitlenmiş. Yani farkın en çok saklandığı yer izole edildi, en çok zaman alan yer hızlı bırakıldı.

Sırayı maliyete göre diz

Tek kapı demek her şeyin aynı anda çalışması demek değil.

Biçimlendirme saniyeler sürüyor, linter biraz daha, birim testleri dakikalar, entegrasyon testleri ve WASM derlemesi daha uzun. Bu sırayla çalıştırdığında, basit bir biçim hatası on beş dakika beklemeden ilk saniyede geri dönüyor.

Buradaki fayda sadece hız değil — geri bildirimin ne kadar erken geldiği, o geri bildirimin ne kadar işe yaradığını belirliyor. On dakika sonra gelen uyarı, artık başka bir şeyle uğraşan birine geliyor.

Denetim de kapının parçası

Son olarak bağımlılık denetimi. Bunu ayrı bir haftalık iş olarak çalıştırmak yaygın ama bizde kapının içinde.

Sebebi basit: haftalık çalışan bir denetim, bulduğu şeyi kimsenin bakmadığı bir rapora yazıyor. Kapının içinde olan denetim, zafiyeti getiren PR'ı durduruyor — ve o anda düzeltmesi en kolay hâlinde yakalıyor, çünkü değişikliği yapan kişi hâlâ konuya bakıyor.

Bu yaklaşımın bedeli, üçüncü parti bir kütüphanede çıkan bir uyarının seni bloke etmesi. Rahatsız edici. Ama alternatifi, o uyarıyı üç ay sonra fark etmek.