Post

GitHub Workflow Geçmişini Temizlemek: Asenkron ve Hızlı Yöntem

🇹🇷 Binlerce GitHub Action geçmişini tek satırda ve asenkron olarak nasıl temizlersiniz? gh CLI ve xargs ile turbo modda temizlik.

GitHub Workflow Geçmişini Temizlemek: Asenkron ve Hızlı Yöntem

Bir açık kaynak proje geliştirirken - örneğin benim şu sıralar üzerinde çalıştığım Her Yönüyle Curl gibi - CI/CD süreçleri çok yoğun geçer. Her commit, her pull request arkasında onlarca “workflow run” bırakır.

Zamanla GitHub Actions sekmesi, başarısız denemeler ve eski loglarla dolu bir çöplüğe dönüşür. Hem görsel kirlilik yaratır hem de aradığınızı bulmanızı zorlaştırır.

Bugün, GitHub CLI (gh) kullanarak bu geçmişi nasıl temizleyeceğimize ve işi asenkron hale getirerek nasıl 10 kat hızlandırabileceğimize bakacağız.

� Ön Hazırlık: Giriş Yapın

Bu komutları çalıştırmadan önce GitHub CLI ile hesabınıza giriş yapmış olmanız gerekir:

1
gh auth login

�🐧 Linux ve 🍎 macOS (Bash/Zsh)

Unix tabanlı sistemlerde (Linux, macOS, WSL) gh, jq ve xargs muhteşem üçlüsünü kullanarak bu işlemi gerçekleştireceğiz.

🛠️ Komut

Aşağıdaki komut, repodaki son 1000 çalışmayı çeker ve aynı anda 10 farklı kanaldan silme işlemi başlatır:

1
gh run list --repo fr0stb1rd/her-yonuyle-curl --limit 1000 --json databaseId --jq '.[].databaseId' | xargs -P 10 -I{} gh run delete {} --repo fr0stb1rd/her-yonuyle-curl

(Eğer zaten repo klasörünün içindeyseniz --repo ... kısıımlarını yazmanıza gerek yok.)

🔬 Komutun Anatomisi

Bu satırın ne yaptığını adım adım inceleyelim:

  1. gh run list --limit 1000: Son 1000 workflow çalışmasını listeler.
  2. --json databaseId --jq '.[].databaseId': Bize tarih, isim veya durum lazım değil. Sadece “ID” numaralarını saf bir liste olarak (JSON query ile) çeker.
  3. | (Pipe): Çıkan ID listesini bir sonraki komuta aktarır.
  4. xargs: İşte asıl kahramanımız. Gelen listeyi argüman olarak alıp başka bir komuta verir.
    • -P 10: En kritik nokta burası. “Parallel” modunu açar. İşlemleri sırayla değil, aynı anda 10 adet delete komutu çalıştıracak şekilde yapar.
    • -I{}: Her bir ID’yi {} yer tutucusu ile temsil eder.
  5. gh run delete {}: Nihai silme eylemi.

🪟 Windows (PowerShell Core)

Windows kullanıcıları genellikle bu tür “pipe” işlemlerinde geride kaldıklarını hissederler ama PowerShell 7 (Core) ile durum değişti. ForEach-Object komutunun -Parallel parametresi ile aynı hızı yakalayabilirsiniz.

🛠️ Komut

1
gh run list --limit 1000 --json databaseId --jq '.[].databaseId' | ForEach-Object -Parallel { gh run delete $_ } -ThrottleLimit 10

🔬 Komutun Anatomisi

  1. gh run list ...: Linux tarafındaki ile aynı. ID listesini JSON olarak döker.
  2. | (Pipe): Çıktıyı ForEach-Object komutuna iletir.
  3. ForEach-Object -Parallel { ... }:
    • -Parallel: Gelen her nesne için süslü parantez içindeki kod bloğunu ayrı bir thread üzerinde çalıştırır.
    • gh run delete $_: $_ mevcut pipeline nesnesini (yani o anki run ID’sini) temsil eder ve silme komutunu çalıştırır.
  4. -ThrottleLimit 10: Aynı anda en fazla kaç işlemin (thread) çalışacağını belirler. Linux’taki -P 10 ile aynı işlevi görür.

Bu komut PowerShell 7 ve üzeri gerektirir. Windows ile yüklü gelen eski PowerShell 5.1 -Parallel parametresini desteklemez. Eğer eski sürüm kullanıyorsanız -Parallel ve -ThrottleLimit kısımlarını silerek (yavaş da olsa) çalıştırabilirsiniz.

⚡ Neden Asenkron? (Hız Faktörü)

Eğer -P (Linux/macOS) veya -Parallel (Windows) parametresini kullanmazsanız, işlemler sıralı (sequential) olarak yapılır. 1000 kayıt için 1000 ayrı API isteği yapılır ve her birinin bitmesi beklenir.

Asenkron modda ise, bilgisayarınız GitHub’a “Hey, şu 10 tanesini sil” der, onlar silinirken diğer 10 taneyi hazırlar. Bu da işlemi teorik olarak 10 katına kadar hızlandırır.

Sayıyı çok abartıp 50 veya 100 yapmayın. GitHub API’nin “Rate Limit” (istek sınırı) engeline takılabilirsiniz. 10-20 arası güvenli bir limittir.

🎉 Sonuç

“Her Yönüyle Curl” projesinde dokümantasyon ve araçları geliştirirken temiz bir çalışma alanı tutmak önemli. Bu tek satırlık komut (one-liner), dakikalar sürecek bir temizliği saniyelere indiriyor.

Bir sonraki git push‘ta görüşmek üzere!

This post is licensed under CC BY 4.0 by the author.