Toparlandık: GitHub önbelleğini sonunda doğru kullanıyoruz 🧹
Son teknoloji yazımızda derleme ve kontrol hattımızın gerçekte neye mal olduğunu ölçmüştük ve şunu bulmuştuk: para değil, bekleme süresi ve depolama. O yazı “temizlik işi planlandı ama henüz yapılmadı” diye bitiyordu. Beklenenden hızlı oldu: bugün öğlenden itibaren ana dalda. İşte rakamlar.
Önce sonuç. Deposunun önbellek kullanımı 63 kayıtta 5,32 GB'tan 13 kayıtta 2,46 GB'a düştü. Eskiden her çekme isteğinde çalışan C# güvenlik analizi artık orada 4,5 dakika yerine 4 saniye sürüyor; yine de yayına giden her şeyi kontrol ediyor. İkisi de sizi koruyan tek bir kontrolden vazgeçmeden.
Kısaca: önbellek ne işe yarar? Her derleme yeni kurulmuş, boş bir makinede başlar. Her seferinde sıfırdan başlamasın diye ara sonuçları saklayabilir; sonraki sefer onları yeniden üretmek yerine indirir. Bunun için her depoya 10 GB veriliyor. Dolunca GitHub en uzun süredir kullanılmayanı siliyor. Bizim sorunumuz da tam buydu: yer doluydu ama yanlış şeylerle.
Hata 1: platformsuz bir anahtar. Unity derlerken devasa bir ara klasör oluşturur. Dört derleme bunu kullanıyor: Windows, Linux, macOS, WebGL; her birinin kendine ait olması gerekir. Önbellek anahtarında platform işareti olmayan tek derleme Windows'tu. Bu yüzden ilk bulduğu kayıtla eşleşti, o da WebGL'inkiydi: 1,7 GB indirildi, Unity bunun “buraya ait değil” olduğunu doğru biçimde fark edip sıfırdan yeniden içe aktardı. Günlükte: 85 yerine 257 saniye içe aktarma. Anahtar artık Library-Windows- ve hayalet kovuldu.
Hata 2: kimse hiç kaydetmemişti. Daha utandırıcı olan bulgu. Dört derlemenin hepsi ara klasörü özenle geri yüklemeye çalışıyordu, ama hiçbir iş akışı onu hiç yazmıyordu. Var olan tek kayıt elle başlattığımız bir araçtan gelmişti. Yani projenin en önemli önbelleği tesadüfen bakılıyordu. 🙈 Şimdi bilerek yazılıyor.
Yer kazandıran karar: sadece kritik yol sayılır. Akla gelen ilk hamle dört platformu da önbelleğe almak olurdu. Gerçek bir sürümün zamanlamasına bakınca bunun neden saçma olacağı görülüyor: dört derleme aynı anda başlıyor, Windows on bir dakika sonra, Linux ve macOS 13,7 dakika sonra, WebGL ise 31,6 dakika sonra bitiyor. WebGL çalıştığı sürece diğerleri zaten bekliyor. Yani bekleyişi sadece onun önbelleği kısaltıyor; diğer üçü 10 GB bütçemizden yaklaşık 4,5 GB tutacak ve tam olarak sıfır dakika kazandıracaktı. Biz de tam olarak bir tanesini önbelleğe alıyoruz.
Hata 3: Docker geri kalanı yedi. Sunucu imajlarımızı derlerken her ara katman önbellek olarak saklanıyordu: her gönderimde yenilenen, 24 kayıtta yaklaşık 3,27 GB, yani tüm bütçenin %64'ü. Bu sel, önemli olan tek Unity önbelleğini düzenli olarak silip atıyordu. Artık sadece son aşama saklanıyor ve dört imajın her biri kendi ad alanına sahip; eskiden hepsi tek bir ad alanını paylaşıp birbirini atıp duruyordu. 3,27 GB yaklaşık 150 MB oldu.
Güvenlik analizi: önemli olan yerde kontrol et. GitHub'ın güvenlik açıklarını bulma aracı CodeQL, ikinci büyük zaman yutucumuzdu: sekiz günde 230 dakika, neredeyse hepsi C# kısmı; analiz için tüm projeyi yeniden derliyor, üstelik her çekme isteğinde. Şimdi bu, ana dala birleştirirken ve haftada bir tam çalışıyor; çekme istekleri hızlı kontrolleri koruyor. Değişiklikten sonra ölçüldü: çekme isteğinde 4 saniye, ana dalda değişmeyen iyi bir 4 dakika. Yani size gerçekten ulaşan her satır hâlâ kontrol ediliyor; sadece üç kez değil.
Birikince büyüyen küçük şeyler. .NET paketleri artık önbellekte, ama sadece bir insanın beklediği yolda. Yabancı işlemci mimarileri için bir emülatör, sadece gerçekten böyle bir derleme yaptığımızda kuruluyor. Yeni açılmış bir makinede yapacak işi olmayan, ama derleme başına 1,4 dakikaya kadar süren bir temizlik komutu kalktı. Ve bir sürüm derlemesinin ara dosyaları artık 90 yerine 7 gün sonra temizleniyor; toplam 7,4 GB tutan 703 tanesi birikmişti.
Bilerek yapmadığımız şeyler. Kendi analizimizden iki öneriyi, değişiklik günlüğünde güzel satırlar olarak satmak yerine ölçtükten sonra bıraktık. Testleri iki paralel işe bölmek tam dört saniye kazandıracaktı (bir parça 2:54, öbürü 4 saniye); üstelik zorunlu bir kontrolün adını değiştirip her çekme isteğini sonsuza dek “bekliyor” durumunda bırakacaktı. Bir sürümden önce büyük test kapısını atlamak da hiçbir şey kazandırmayacaktı, çünkü WebGL hâlâ derlenirken o çoktan bitmiş oluyor. Hiçbir şey kazandırmayıp bir güvenlik ağını kaldıran bir iyileştirme, iyileştirme değildir.
Ve sonra içinden gerçek bir hata çıktı. Bu temizliğin ortasında bir anda her çekme isteği bir süre sınırında başarısız oldu: tek bir test, 120 saniyeye izin verilen yerde 212 saniye sürdü. Aynı çalışmadaki ikinci en yavaş test: 10,5 saniye. Neden, sunucumuzdaki bir hata yolunun bozuk bir HTTP isteğini düzgünce kapatmak yerine öylece koparmasıydı. Linux'ta sistem bu tür bağlantıları ancak iki dakikada bir çalışan bir süpürmeyle geri alıyor; kapanış da bunu sabırla bekliyordu. Windows'ta hiç görünmedi, bu yüzden sadece derleme sunucusunda ısırıyordu. Artık sunucu böyle bir durumda dürüst bir hata koduyla cevap veriyor ve bağlantıyı kendisi kapatıyor: test iyi bir 20 saniyede bitiyor; böyle bir aksaklığa denk gelen gerçek oyuncular da kopmuş bir bağlantı yerine anlaşılır bir hata görecek. Üretimdeki bir hatayı bulan bir CI temizlik günü iyi bir gündür. 🐛
Bunların hiçbiri sizi doğrudan etkilemiyor; yeni blok yok, yeni hayvan yok. Sadece “kodlama bitti” ile “sizin için kurulabilir” arasındaki yolu kısaltıyor. Ve geçen seferki cümleyi yine kanıtlıyor: önce ölç, sonra dokun. 🚀
Yorumlar