actions/setup-go Aracını Değiştirerek Golang CI Süreçlerini Ölçeklendirme
İçindekiler
CloudX Mühendislik ekibinden Lukas Schwab ve Peter Downs tarafından yayımlanan çalışma, Golang derleme önbelleğinden (build cache) yararlanarak paralel sürekli entegrasyon (CI) iş akışlarını hızlandırmanın etkili bir yöntemini ortaya koyuyor. GitHub'ın resmi actions/setup-go eylemini doğrudan yerine geçebilen açık kaynaklı cloudx-io/setup-go ile değiştirmek, test işlerinin çalışma sürelerini %69 oranında azalttı.
Resmi actions/setup-go adımı, paralel çalışan işlerin birbirlerinin performansını olumsuz etkilemesine ve sürekli olarak bayat (stale) önbellek değerlerinin yüklenmesine neden oluyor. Lint, test ve build gibi paralel adımları içeren monorepo mimarisinde yapılan analizler, varsayılan eylemin gerçekleştirdiği işlemlerin %86'sının tamamen gereksiz olduğunu gösteriyor.
Hızlı CI Süreçlerine Neden Önem Veriyoruz?
Yazılım teslimat hızını artırırken güvenilirlikten ödün vermemek, CI süreçlerine ve test altyapısına bilinçli yatırım yapmayı gerektirir. Modern bir yazılım üretim merkezinde test paketleri, yapılan kod değişikliklerinin canlı ortamı bozmayacağını güvence altına alan en kritik bileşendir. Testlerin her kod değişiminde hızlı ve kararlı çalışması, ekiplerin güvenle üretime çıkmasını sağlar.
CloudX ekibinin benimsediği temel standart, depoya gönderilen her kod için derleme, test ve linter sonuçlarının en geç 90 saniye içinde netleşmesidir. Hızlı donanımlar (örneğin Warp Build makineleri) maliyet ve süre açısından avantaj sağlasa da asıl sürdürülebilir kazanım algoritmik optimizasyonlardan gelir. Test kapsamı genişledikçe varsayılan kurulum adımlarının bu hedefe engel olduğu tespit edilmiştir.
actions/setup-go Paralel İşlerde Neden Yetersiz Kalıyor?
GitHub'ın resmi aracı, Go modül ve derleme önbellek dizinlerini saklamak ve geri yüklemek için arka planda actions/cache mekanizmasını çalıştırır. Prensipte indirilen kaynak kodların ve derleme çıktılarının sonraki işlerde tekrar kullanılması hedeflenir. Ancak varsayılan önbellek anahtarı yapısı şu şekildedir:
setup-go-${os}-${arch}-go-${goVersion}-${hashFiles('**/go.mod')}
Bu anahtar kurgusu paralel ve aktif geliştirme yapılan projelerde yetersiz kalır:
- Tipik bir geliştirme döngüsünde işletim sistemi, mimari, Go sürümü veya
go.moddosyaları nadiren değişir. - Anahtar ilk kez hesaplandığında kaydedilen durum, söz konusu parametreler değişene dek sonraki tüm CI koşularında tekrar yüklenir.
- Uygulama kodu değiştikçe ilk koşudan kalan derleme arşivleri etkisini kaybeder; her derleme sıfırdan daha fazla iş yapmak zorunda kalır.
- Test çıktıları bayatladığı için sonraki her iş daha fazla testi baştan çalıştırır ve CI performansı giderek geriler.
Yazılım Geliştirme Açısından Pratik Çıkarımlar
- Önbellek Granülaritesini Doğru Kurgulayın: Yalnızca
go.modbağımlılıklarına dayalı anahtarlar, kod değişikliklerinde derleme önbelleğinin bayatlamasına ve CI sürelerinin uzamasına neden olur. - Paralel İş Çakışmalarını Önleyin: Monorepo yapılarında lint, test ve build adımlarının birbirlerinin önbelleklerini ezmesini engelleyecek yalıtılmış anahtarlar kullanılmalıdır.
- Gereksiz İş Yükünü Ölçümleyin: CI sürelerini sadece daha pahalı donanımlarla değil, önbellek isabet oranlarını ve tekrarlanan adımları analiz eden algoritmik iyileştirmelerle optimize edin.
Orijinal kaynağa buradan ulaşabilirsiniz.
Bu konuyu derinlemesine öğrenmek isterseniz: Ölçeklendirme ve Optimizasyon modülüne göz atın.
Bu konuyu daha derinlemesine öğrenmek ister misin?
Edumints'teki ücretsiz kursları incele ve bugün başla.
Kurslara Göz At →