Ayda bin derleme çalıştırması ve hiçbiri bize para ödetmiyor ⚙️
Önce bir düzeltme. Bu yazının ilk sürümü, GitHub derleme dakikalarımızın tükendiği ve bunun bizi Pro hesaba geçmeye zorladığı iddiasındaydı. Bu yanlıştı, hem de belgelere tek bir bakışla aydınlanacak türden: herkese açık depolar için GitHub derleme dakikaları ücretsizdir. Artifact'lar ve önbellekler de. Deponuz mayıs sonundan beri herkese açık; yani tek bir dakika için bile hiç ödemedik ve asla ödemeyeceğiz. Metni sessizce düzeltmek yerine yeniden yazıp ölçümlerin gerçekte ne gösterdiğini anlatmayı tercih ettik. Bu, yanlış sürümden çok daha ilginç çıkıyor.
Önce tahmin, sonra bakış. Tetikleyici, bitmiş bir pull request'in tarayıcıda durduğu ve tek bir kontrolün bile çalışmadığı bir akşamdı. Yeşil onay işareti yok, sadece sessizlik. En bariz açıklamaya gittik: “kota doldu”, ve bir Pro hesap aldık. Sonrasında her şey yine çalıştı, bu da teoriyi doğrular gibi göründü. Doğrulamadı: sessizliğin başka bir nedeni vardı (GitHub'ın o anda ana dalla temiz birleştiremediği bir pull request hiçbir kontrol başlatmıyor). O zamandan beri her bir çalıştırmanın faturalama verisini sorguladık. Her çalıştırma ve her işletim sistemi için cevap: faturalanabilir süre = 0 milisaniye. Bir platformu abonelikle desteklemek gayet güzel, ama bu depo için bir açıklama olarak geçerli değil.
Doğru olan şu: makine büyüdü. Her pull request küçük bir fabrikayı harekete geçiriyor: tüm sunucu derleniyor ve test paketi çalıştırılıyor, linter ve kod analizi bakıyor, CodeQL güvenlik açıklarını arıyor ve oyun sunucusu, portal, WorldHost ve yapay zekâ arka ucu için Docker imajları üretiliyor. Bir sürüm ise istemcinin Windows, Linux ve macOS derlemelerini, bir de tarayıcı oyunu için WebGL sürümünü ekliyor. Mayıs sonundan beri bu 1.723 derleme çalıştırması ediyor, 1.092'si sadece temmuzda; dört haftada 131 birleştirilmiş pull request boyunca. Evet, son yükseliş gerçekten yapay zekâyla da ilgili 😉: proje %100 yapay zekâ desteğiyle geliştiriliyor ve daha büyük abonelikle paralelde sadece daha fazla şey oluyor. Sadece para birimi para değil; bekleme süresi.
Bekleme süresi nereye gidiyor. Sekiz gün boyunca ölçüldü: normal kontrol çalıştırması (CI) 379 dakika, CodeQL güvenlik analizi 230, sürüm derlemeleri 126, gerisi bozuk para. Tek bir sürüm yaklaşık 110 dakika işlem süresi tutuyor: WebGL (31,6), Docker imajı (19,4), macOS (13,7), Linux (13,7), büyük test kapısı (12,1), Windows (10,9) ve paketleme (7,2). Bu, “bitti” ile “sizin için kurulabilir” arasındaki süre.
Ve şimdi gerçekten kıt olan şey: önbellek. Bir derleme her seferinde sıfırdan başlamasın diye GitHub ara sonuçları saklıyor ve bunun için ne kadar herkese açık olursanız olun depo başına 10 GB alıyorsunuz. Bizimki şu an 63 girdide 5,3 GB tutuyor. Sorun dağılımda: yaklaşık üçte ikisi her çalıştırmada yeniden yüklenen Docker ara katmanları ve tam da en çok yardımı dokunacak şeyi dışarı itiyorlar. Gerçek darboğaz bu ve dünyadaki hiçbir abonelik buradan satın alarak çıkmanızı sağlamaz.
En güzel buluş gerçek bir hataydı. Derleme sırasında Unity, yeniden kullanımı dakikalar kazandıran devasa bir ara klasör (Library) oluşturuyor. Ölçüm şunu ortaya çıkardı: Windows, Linux ve macOS için bu klasör hiç kaydedilmiyordu; derlemeler onu geri yüklemeye özenle çalışıyor, ama onu hiç kimse yazmıyordu. Ve Windows derlemesi, platform işareti taşımayan bir önbellek anahtarına sahip tek derlemeydi. Sonuç: 1,7 GB WebGL ara durumu indiriyordu ve Unity her şeyi yeniden içe aktarmadan önce bunu özenle çöpe atıyordu. Günlük bunu siyah beyaz gösteriyor: sıcak durumda 85 yerine 257 saniyelik varlık içe aktarımı. Bu, sürüm başına neredeyse dokuz dakika boşa gitmesi demek, çünkü bir anahtardan tek bir sözcük eksikti.
Başka neler çıktı. Test paketimiz yayımlanan her commit için üç kez çalışıyor (pull request'te, birleştirdikten sonra ve sürümde yeniden). CodeQL, zorunlu bir kontrol bile olmadığı halde her pull request'te üç dili denetliyor. .NET paketleri için önbellek hiç yok. Yabancı işlemci mimarileri için bir emülatör kuruluyor, oysa biz sadece tek birine derliyoruz. Ve 7,4 GB eski derleme artifact'ı varsayılan 90 günlük saklama süresiyle duruyor. Hiçbiri dramatik değil; birlikte ise hatırı sayılır bir ömür parçası.
Ders, sunucumuzun bize öğrettiğiyle aynı. O zamanlar, kullanılan belleğin yarısının oyuna değil Docker'a ve izlemeye gittiğini ölçmüştük. Bu sefer daha da utanç vericiydi: hiç var olmamış bir faturayı varsaydık ve bakmadan önce ödedik. Tahmin etme, ölç; bu cümle belli ki gerçekten içselleştirene kadar geçerli. Temizlik çalışması planlandı ama henüz yapılmadı; çalıştığında bize neye mal olduğunu anlatacağız. 🚀
Yorumlar