GitHub CLI ile Komut Satırından GitHub Yönetimi
Terminal ekranına baktığımda, GitHub web arayüzüne geçmeden doğrudan komut satırından PR açabildiğimi, issue yönetebildiğimi ve release oluşturabildiğimi gördüğüm an, workflow’umun nasıl değiştiğini hatırlıyorum. GitHub CLI (gh) benim için bir kolaylık aracı değil, gerçek anlamda üretkenlik çarpanı oldu. Bu yazıda, günlük iş akışımda gh komutunu nasıl kullandığımı ve takımımıza nasıl entegre ettiğimizi aktaracağım.
GitHub CLI Nedir ve Neden Önemlidir
GitHub CLI, GitHub’ın resmi olarak geliştirdiği ve GitHub’ın neredeyse tüm özelliklerine terminal üzerinden erişim sağlayan bir araçtır. hub aracını daha önce kullananlar bu konsepte yabancı değildir, ancak gh resmi destek, daha tutarlı API entegrasyonu ve çok daha zengin özellik setiyle ciddi bir seviye atlamıştır.
Özellikle CI/CD pipeline’larında, otomasyon scriptlerinde veya SSH üzerinden bağlandığınız sunucularda tarayıcı açmak mümkün değilse, gh tam anlamıyla hayat kurtarıcıdır. Pull request review süreçlerini, issue takibini ve release yönetimini tamamen terminal üzerinden yürütmek, context switching maliyetini ciddi ölçüde düşürür.
Kurulum ve İlk Yapılandırma
Farklı işletim sistemlerinde kurulum oldukça basittir.
Linux (Debian/Ubuntu) için:
curl -fsSL https://cli.github.com/packages/githubcli-archive-keyring.gpg | sudo dd of=/usr/share/keyrings/githubcli-archive-keyring.gpg
echo "deb [arch=$(dpkg --print-architecture) signed-by=/usr/share/keyrings/githubcli-archive-keyring.gpg] https://cli.github.com/packages stable main" | sudo tee /etc/apt/sources.list.d/github-cli.list > /dev/null
sudo apt update && sudo apt install gh
macOS için:
brew install gh
Windows için (Scoop veya Winget):
winget install --id GitHub.cli
Kurulumdan sonra kimlik doğrulama adımına geçmek gerekiyor. Bu adım, üzerinde en çok vakit harcanan kısımlardan biri çünkü özellikle kurumsal GitHub Enterprise ortamlarında dikkatli yapılandırılması gerekiyor.
# Standart GitHub.com için
gh auth login
# GitHub Enterprise için
gh auth login --hostname github.sirketiniz.com
gh auth login komutunu çalıştırdığınızda size birkaç soru soruyor: HTTPS mi SSH mi kullanmak istiyorsunuz, token ile mi tarayıcı üzerinden mi authenticate olmak istiyorsunuz gibi. Otomasyon senaryoları için personal access token (PAT) kullanımını tercih ediyorum, özellikle CI ortamlarında GITHUB_TOKEN environment variable’ı doğrudan beslenebilir:
echo $GITHUB_TOKEN | gh auth login --with-token
Kimlik doğrulamayı kontrol etmek için:
gh auth status
Repository Yönetimi
gh repo alt komutu, repository işlemlerinin tamamını kapsar. Yeni bir repo oluşturmak, clone’lamak veya mevcut bir repoyu fork’lamak artık tarayıcı gerektirmiyor.
# Yeni bir private repo oluştur ve hemen klonla
gh repo create my-new-service --private --clone --description "Backend microservice"
# Mevcut bir repoyu fork'la
gh repo fork organization/upstream-project --clone
# Repo detaylarını görüntüle
gh repo view --web # Tarayıcıda aç
gh repo view # Terminal'de özet göster
Takımımdaki bir senaryo: Bir müşteri projesinde 15’ten fazla mikroservis vardı ve her birini ayrı ayrı GitHub üzerinden oluşturmak yerine bir script yazdık:
#!/bin/bash
SERVICES=("auth-service" "payment-service" "notification-service" "user-service")
ORG="musteri-org"
for service in "${SERVICES[@]}"; do
gh repo create "$ORG/$service"
--private
--description "Mikroservis: $service"
--add-readme
echo "$service reposu oluşturuldu."
sleep 1 # API rate limiting için kısa bekleme
done
Bu script, elle yapıldığında yarım saati aşacak işi 30 saniyeye indirdi.
Pull Request Yönetimi
gh pr komutu, günlük kullanımda en çok başvurduğum alt komuttur. PR oluşturmak, review istemek, merge etmek veya mevcut PR’ları listelemek tek satır komutlarla halloluyor.
# Mevcut branch'ten PR oluştur
gh pr create --title "feat: ödeme modülü refactor"
--body "Stripe entegrasyonu güncellendi, eski API endpoint'leri kaldırıldı."
--reviewer ali-demir,ayse-yilmaz
--label "enhancement"
--assignee @me
# PR'ları listele
gh pr list
gh pr list --state closed --limit 20
gh pr list --author @me
# Belirli bir PR'ı kontrol et
gh pr view 42
gh pr view 42 --web
# PR'ı checkout yap (review için ideal)
gh pr checkout 42
# PR'ı merge et
gh pr merge 42 --squash --delete-branch
gh pr checkout komutu özellikle code review sürecinde büyük kolaylık sağlıyor. Bir PR’ı inceleyeceğiniz zaman branch adını hatırlamanıza gerek kalmıyor, PR numarasını bilmeniz yeterli. Sistem otomatik olarak doğru branch’i kuruyor ve uzak repoyu fetch ediyor.
Gerçek dünyada sık yaşanan bir durum: Review bekleyen PR’ları sabah ilk işe geldiğimde kontrol etmek için küçük bir alias kurdum:
# ~/.bashrc veya ~/.zshrc içine ekle
alias pr-bekleyenler='gh pr list --search "review-requested:@me" --state open'
alias benim-prlarim='gh pr list --author @me --state open'
Issue Yönetimi
GitHub Issue’ları takip etmek için gh issue alt komutu yeterince güçlü. Özellikle gh issue create ile şablonlara dayalı otomatik issue oluşturma, monitoring sistemlerimizle entegre ettiğimiz bir süreç haline geldi.
# Yeni issue oluştur
gh issue create --title "Auth servisi zaman aşımı hatası"
--body "Production'da 14:30-15:00 arası timeout hataları artışı görüldü."
--label "bug,production"
--assignee devops-team
# Issue listele
gh issue list
gh issue list --label "bug" --state open
gh issue list --assignee @me
# Issue kapat
gh issue close 123 --comment "Hotfix deploy edildi, izleme devam ediyor."
Monitoring entegrasyonu için yazdığımız script örneği (Prometheus alertmanager webhook’undan tetiklenen):
#!/bin/bash
# alert-to-github-issue.sh
ALERT_NAME=$1
ALERT_SEVERITY=$2
ALERT_MESSAGE=$3
gh issue create
--repo "sirketiniz/ops-issues"
--title "[$ALERT_SEVERITY] $ALERT_NAME"
--body "**Otomatik Alert**nn$ALERT_MESSAGEnnZaman: $(date)nOrnek: $(hostname)"
--label "alert,$ALERT_SEVERITY"
Bu sayede Prometheus’tan gelen kritik alertler anında GitHub Issue olarak açılıyor ve ilgili ekip üyesine assign ediliyor.
GitHub Actions ile Entegrasyon
gh aracının en güçlü yanlarından biri, GitHub Actions workflow’larıyla doğrudan etkileşim kurabilmesidir. Bir workflow’u elle tetiklemek, logları takip etmek veya başarısız job’ları incelemek artık web arayüzüne girmeyi gerektirmiyor.
# Workflow'ları listele
gh workflow list
# Belirli bir workflow'u tetikle
gh workflow run deploy.yml --field environment=staging
# Çalışan run'ları görüntüle
gh run list --workflow=deploy.yml
# Belirli bir run'ın loglarını izle
gh run watch 5678901234
# Başarısız run'ın loglarını al
gh run view 5678901234 --log-failed
Özellikle gh run watch komutu, bir deployment başlattığınızda terminalden çıkmadan sonucu beklemenizi sağlıyor. Pipeline süreçlerinde her seferinde tarayıcıya geçip sayfayı yenilemek yerine terminalde kalabiliyorsunuz.
Bir gerçek senaryo: Staging ortamına deploy sonrasında smoke test koşturmak ve sonucu Slack’e bildiren bir script:
#!/bin/bash
REPO="sirketiniz/backend-api"
echo "Deploy workflow tetikleniyor..."
gh workflow run deploy.yml
--repo $REPO
--field environment=staging
--field version=$1
# Run ID'yi al
sleep 5
RUN_ID=$(gh run list --repo $REPO --workflow=deploy.yml --limit 1 --json databaseId -q '.[0].databaseId')
echo "Run ID: $RUN_ID - Sonuç bekleniyor..."
gh run watch $RUN_ID --repo $REPO
# Sonucu kontrol et
STATUS=$(gh run view $RUN_ID --repo $REPO --json conclusion -q '.conclusion')
if [ "$STATUS" = "success" ]; then
echo "Deploy başarılı! Staging hazır."
# Slack notification eklenebilir
else
echo "Deploy başarısız! Logları kontrol edin."
gh run view $RUN_ID --repo $REPO --log-failed
exit 1
fi
Release Yönetimi
gh release alt komutu, semantic versioning ile düzgün release süreçleri kurmanızı sağlıyor. Changelog oluşturma, tag’leme ve asset yükleme işlemleri tek komutla halledilebilir.
# Yeni release oluştur
gh release create v1.4.2
--title "v1.4.2 - Güvenlik Güncellemeleri"
--notes "JWT doğrulama açığı kapatıldı, bağımlılıklar güncellendi."
--prerelease
# Otomatik changelog ile release
gh release create v1.5.0
--generate-notes
--title "v1.5.0 - Yeni Özellikler"
# Release'e dosya ekle (binary, artifact vb.)
gh release upload v1.4.2 ./dist/app-linux-amd64 ./dist/app-darwin-amd64
# Release listele
gh release list
# Son release'i görüntüle
gh release view --json tagName,publishedAt,assets
--generate-notes parametresi, son release’den bu yana merge edilen PR’ların listesini otomatik olarak changelog olarak oluşturuyor. Manuel changelog yazmak yerine bunu tercih ediyorum çünkü PR başlıklarınız iyi yazılmışsa changelog neredeyse kendiliğinden hazırlanıyor.
Gist Yönetimi
Gist’ler, kısa script’leri veya yapılandırma dosyalarını paylaşmak için kullandığım pratik bir GitHub özelliği. gh gist ile bunu da terminal üzerinden yönetmek mümkün.
# Yeni gist oluştur
gh gist create my-script.sh --desc "Backup scripti" --public
# Birden fazla dosyayla gist oluştur
gh gist create nginx.conf my-backup.sh --desc "Sunucu konfigürasyonları"
# Gistleri listele
gh gist list
# Gist düzenle
gh gist edit abc123def456
SSH Anahtarı ve GPG Yönetimi
Yeni bir geliştirici ortamı kurduğunuzda SSH anahtarlarını GitHub’a eklemek için web arayüzüne girme zorunluluğunu gh ortadan kaldırıyor:
# SSH anahtarı ekle
gh ssh-key add ~/.ssh/id_ed25519.pub --title "Yeni Laptop - $(date +%Y%m%d)"
# Mevcut SSH anahtarlarını listele
gh ssh-key list
# GPG anahtarı ekle
gh gpg-key add ~/.gnupg/mygpgkey.pub
Bu özellik, özellikle yeni takım üyeleri için onboarding süreçlerini hızlandırıyor. Bir komutla SSH anahtarı eklenip environment hazırlanabiliyor.
Alias ve Özelleştirme
gh aracının alias özelliği, sık kullandığınız karmaşık komutları kısaltmanızı sağlıyor:
# Alias ekle
gh alias set prl 'pr list --author @me --state open'
gh alias set isl 'issue list --assignee @me --state open'
gh alias set prm 'pr merge --squash --delete-branch'
# Alias listele
gh alias list
# Daha karmaşık alias (shell komutları da çalışır)
gh alias set günlük-kontrol '!gh pr list --author @me && echo "---" && gh issue list --assignee @me'
! ile başlayan alias’lar shell komutları olarak çalışıyor, bu da birden fazla gh komutunu birleştirmenize imkan veriyor.
API Doğrudan Kullanımı
gh api alt komutu, GitHub REST ve GraphQL API’sine doğrudan erişim sağlıyor. CLI komutlarının kapsamadığı durumlarda bu son derece kullanışlı oluyor:
# Bir reponun traffic verilerini çek
gh api repos/sirketiniz/proje/traffic/views
# GraphQL ile özel sorgu
gh api graphql -f query='
{
viewer {
repositories(first: 10, orderBy: {field: UPDATED_AT, direction: DESC}) {
nodes {
name
updatedAt
defaultBranchRef {
target {
... on Commit {
messageHeadline
}
}
}
}
}
}
}'
# REST endpoint'e POST isteği
gh api repos/sirketiniz/proje/issues
--method POST
--field title="API üzerinden açılan issue"
--field body="Bu issue gh api komutuyla oluşturuldu."
gh api komutu özellikle henüz gh CLI’ye eklenmemiş GitHub API özelliklerine erişmek istediğinizde kritik bir köprü görevi görüyor.
Gerçek Dünya: Haftalık Code Review Raporu
Takımımda her Pazartesi otomatik olarak çalışan ve geçen haftanın PR özetini Markdown formatında oluşturan bir script kullanıyoruz:
#!/bin/bash
# weekly-pr-report.sh
REPO="sirketiniz/ana-proje"
GECEN_HAFTA=$(date -d "7 days ago" --iso-8601)
echo "# Haftalık PR Raporu - $(date +%d.%m.%Y)"
echo ""
echo "## Merge Edilen PR'lar"
gh pr list
--repo $REPO
--state merged
--limit 50
--json title,author,mergedAt,number
--jq ".[] | select(.mergedAt >= "$GECEN_HAFTA") | "- #(.number) (.title) (@(.author.login))""
echo ""
echo "## Hala Açık PR'lar"
gh pr list
--repo $REPO
--state open
--json title,author,createdAt,number
--jq '.[] | "- #(.number) (.title) (@(.author.login))"'
echo ""
echo "## Açık Issue'lar (Bug)"
gh issue list
--repo $REPO
--label "bug"
--state open
--json title,number,assignees
--jq '.[] | "- #(.number) (.title)"'
Bu script cron job olarak çalışıp Confluence’a veya Slack’e aktarılıyor. Takım lideri haftalık toplantıya hazırlanmak için web arayüzünde dolaşmak yerine bu çıktıya bakıyor.
Sonuç
GitHub CLI, “güzel bir ek araç” kategorisinden çıkıp iş akışının ayrılmaz bir parçası haline gelebilecek kadar olgunlaşmış durumda. Özellikle şu senaryolarda fark yaratıyor:
- Otomasyon ve scripting: PR oluşturma, issue açma, release yönetimi gibi işlemleri CI/CD pipeline’larına dahil etmek
- Uzak sunucu yönetimi: Tarayıcı açamadığınız ortamlarda GitHub işlemlerini sürdürmek
- Context switching azaltma: Terminal’den hiç çıkmadan tüm GitHub iş akışını yürütmek
- Takım onboarding: Yeni üyelerin environment’larını hazırlamak için scriptler oluşturmak
gh aracına yatırım yapmak, yani komutlarını öğrenmek ve iş akışınıza entegre etmek, harcanan zamanı birkaç kat olarak geri veriyor. Özellikle --json ve --jq kombinasyonu sayesinde çıktıları kolayca işleyebilir, başka araçlarla entegre edebilirsiniz.
Başlamak için çok da uzak bir yolculuk değil. gh auth login ile başlayın, birkaç gh pr list ve gh issue list komutu çalıştırın. Sonrası kendiliğinden geliyor.
