İçeriğe atla
Ayhan Sipahi Ayhan Sipahi

Claude'u GitHub Action ile PR Reviewer Olarak Kurmak

Anthropic'in claude-code-action'ını bir GitHub repo'suna eklemek için sıkılaştırılmış, kopyalanmaya hazır kurulum; güvenlik ve maliyet ayarlarıyla.

Bir GitHub repo’suna AI destekli code review eklemek tek bir seçimle başlıyor: geçici bir LLM entegrasyonu mu, bakımı yapılan bir action mı. Bakımlı yol erişim kontrolünü ve prompt injection temizliğini zaten üstleniyor; geçici yolda ikisi de size kalıyor. anthropics/claude-code-action v1 başlanmaya değer varsayılan: pull_request trigger’ı, salt okunur bir tool allowlist’i, sabitlenmiş bir model ve insanda kalan bir merge geçidi.

Workflow dosyasının kendisi kısa. Karar gerektiren kısım etrafındakiler: onu hangi trigger tetikliyor, hangi izinleri alıyor, modelin hangi tool’ları çağırmasına izin var ve büyük bir PR’ın review maliyeti ne oluyor.

Önerilen kurulum

Workflow’u .github/workflows/claude-review.yml dosyasına koyun. Aşağıdaki dosya, gerçek bir repo’ya koyacağım en yalın kurulum: pull_request üzerinde tetikleniyor (pull_request_target değil), action’ın ihtiyaç duyduğu minimum izin seti veriliyor (contents: read, artı yorum atabilmek için pull-requests: write ve issues: write), claude_args dar tutuluyor, model ve turn limiti sabitlenmiş.

name: Claude Code Review
on:
  pull_request:
    types: [opened, synchronize, reopened]

permissions:
  contents: read
  pull-requests: write
  issues: write

jobs:
  review:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          prompt: |
            Review this pull request for correctness, missing error handling,
            and obvious security issues. Post findings as review comments.
            Skip style nits.
          claude_args: "--max-turns 5 --model claude-sonnet-4-6 --allowedTools Read,Grep,Glob"

Burada belirtmeye değer iki seçim var. İlki, checkout adımındaki fetch-depth: 0 action’a tüm diff geçmişine erişim veriyor; bu olmadan büyük PR’ların bağlamı kırpılır. İkincisi, claude_args v1’de altta çalışan Claude Code runtime’ına CLI flag geçirmenin yolu. v0.x’te bunlar üst seviye input’tu (model, max_turns, allowed_tools); bir v0.x örneğini v1 workflow’una yapıştırdığınızda çalışıyor gibi görünür çünkü GitHub Actions tanımadığı input’ta hata vermiyor, ama değerler sessizce hiçbir şey yapmaz. v1 GA’dan eski bir tutorial’dan kopyalıyorsanız her seferinde action’ın migration guide’ına bakın.

Secret’ı editörden çıkmadan kurmak için yerel bir Claude Code oturumunda claude /install-github-app komutunu çalıştırın. Komut, https://github.com/apps/claude adresindeki resmi GitHub App’i kurmanızda size eşlik eder ve ANTHROPIC_API_KEY’i repo secret’larına yazar. Bunun için repo admin yetkisi gerekiyor; yoksa secret’ı manuel olarak set edecek birine ulaşın ve GitHub App adımını atlayın.

İnteraktif @claude döngüsü

İlk job otomasyonu yönetir: her PR açılışı ve push’u bir review alır. İkinci job interaktif soruları yönetir. Bir takım arkadaşı Claude’a @claude lütfen son commit'imden sonra auth akışını tekrar kontrol et diye yanıt verdiğinde, action mention’ı yakalar ve aynı thread içinde yanıtlar.

Mod geçişi v1’de otomatik. Action pull_request ile tetiklendiğinde ve bir prompt set edildiğinde otomasyon modunda çalışır. issue_comment veya pull_request_review_comment ile tetiklendiğinde ve prompt yoksa @claude mention’larını dinler ve interaktif modda çalışır.

  mention:
    if: |
      (github.event_name == 'issue_comment' && github.event.issue.pull_request && contains(github.event.comment.body, '@claude')) ||
      (github.event_name == 'pull_request_review_comment' && contains(github.event.comment.body, '@claude'))
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0
      - uses: anthropics/claude-code-action@v1
        with:
          anthropic_api_key: ${{ secrets.ANTHROPIC_API_KEY }}
          claude_args: "--max-turns 8 --model claude-sonnet-4-6 --allowedTools Read,Grep,Glob"

Bu job’ın tetiklenmesi için dosyanın üstündeki on: bloğuna issue_comment ve pull_request_review_comment eklemeniz de gerekiyor. issue_comment dalındaki github.event.issue.pull_request guard’ı kritik. GitHub bu event’i hem issue’lar hem de PR thread’leri için tetikliyor; bu property ise yalnızca PR thread’lerinde dolu geliyor. Guard olmadan action, sıradan issue içindeki @claude mention’larına da yanıt verir ve alakasız tartışmalarda token yakar. Action, normal bir GitHub yorumu olarak yazar; track_progress: true ile devreye aldığınızda işin ilerleyişini canlı güncelleyen progress checkbox’lı bir yorum atar. Prompt isterse satır içi review yorumu ve suggestion bloğu da bırakabilir.

PR açıldı veya push'landı

Otomasyon modu

@claude içeren yorum

İnteraktif mod

claude-code-action@v1

Anthropic API

GitHub PR yorumu

Maliyet

Faydalı bir tahmin: input token sayısı kabaca diff’in satır sayısı çarpı dört, artı modelin Read ve Grep ile bağlam için içeri çektiği şeyler. Output ise üretilen yorumların uzunluğu. 200 satırlık, 5 dosyalık bir PR genelde birkaç bin input token ve birkaç yüz output ile biter. 1500 satırlık, 30 dosyalık bir PR titiz bir review’da rahatlıkla 50K input’u geçer. Aynı repo’lar tekrar tekrar review edildiğinde prompt caching işe yarar; action önbelleğe alınmış repo bağlamını yeniden kullanabiliyor.

Fiyatlar değişiyor; bu sayıların üstüne bütçe kurmadan önce Anthropic pricing sayfasına bakın. Yayımlanan token başına ücretler:

ModelInput (MTok başına)Output (MTok başına)
Haiku 4.5USD 1USD 5
Sonnet 4.6USD 3USD 15
Opus 4.7USD 5USD 25

Sonnet genel review için doğru varsayılan: gerçek sorunları yakalayacak kadar derin, Opus vergisi olmadan. PR hacminin yüksek olduğu ve hızlı geri bildirimin derin analizden daha değerli olduğu monorepo’larda Haiku mantıklı. Atlanmış bir hatanın pahalıya patladığı güvenlik kritik kodlarda Opus ödenmeye değer. İlk günden itibaren set etmeye değer maliyet kontrol kolları:

  • --max-turns 5 agent döngüsünü sınırlıyor; karışık bir PR sonsuza kadar iterasyon yapamıyor.
  • Workflow trigger’ında bir paths: filtresi sadece doküman değişen PR’larda review’ı atlar.
  • Bir if: guard üzerinden [skip-claude] commit-mesaj kuralı, yazara önemsiz bir değişiklikte muafiyet hakkı verir.
  • claude_args içindeki --fallback-model birincil model rate-limit yediğinde daha ucuz bir modele düşer; takımın aynı anda merge etmesi en bariz tetikleyici.

Güvenlik sıkılaştırması

Yukarıdaki varsayılanlar güvenli, ama her birinin neden o şekilde set edildiğini bilmek değerli; çünkü yanlış değerler eski tutorial’lardan kolayca kopyalanabiliyor.

pull_request kullanın, pull_request_target değil. İkincisi base branch bağlamında secret’lara erişimle çalışır; bu da fork’tan gelen bir PR’ın ANTHROPIC_API_KEY’e erişerek güvensiz kod çalıştırabilmesi anlamına gelir. GitHub Security Lab’ın uzun uzun belgelediği klasik “pwn request” exfiltration sınıfı bu. Action’ın yerleşik erişim kontrolü (yalnızca repo’da write yetkisi olan kullanıcılar için tetikleniyor) pull_request event’lerinde sizi koruyor; dokümanın açıkça riskli olarak nitelediği allowed_non_write_users ile bunu ezmeyin.

contents: write vermeyin. Varsayılan review job’ı yorum atmak için contents: read artı pull-requests: write ve issues: write istiyor. contents: write eklemek modele branch’inize push etme yetkisi verir; Claude’dan düzeltme commit’lemesini açıkça isteyen kasıtlı bir workflow’unuz yoksa istediğiniz şey değil. AWS Bedrock veya Google Vertex’e OIDC ile erişiyorsanız id-token: write’ı yalnızca o zaman ekleyin.

Botları adıyla allowlist’e alın. GitHub App’ler ve botlar action’ı varsayılan olarak tetikleyemez. Claude’un Dependabot veya release botundan sonra çalışmasını istiyorsanız bot hesaplarını açıkça listeleyin. Doküman uyarıyor: public repo’da allowed_bots: '*', herhangi bir GitHub App’in kendi kontrol ettiği bir prompt ile action’ı çağırmasına izin verir; bu da pull_request_target ile aynı exfiltration şekli.

Dış içerikten gelen prompt injection’ı azaltın. Action input’tan HTML yorumlarını, görünmez karakterleri, image alt text’i ve gizli HTML attribute’larını sanitize ediyor. Doküman yeni bypass tekniklerinin ortaya çıkabileceği konusunda açık; bu yüzden public repo’larda iki ek ayar değerli: include_comments_by_actor Claude’a hangi kullanıcıların yorumunun ulaşacağını allowlist’e alır, exclude_comments_by_actor ise dependabot[bot] ve renovate[bot] gibi gürültülü bot yorumlarını eler. Bir actor her ikisinde birden eşleşirse exclusion önceliklidir.

--allowedTools’u sınırlayın. Halka açık bir AI workflow’unda en büyük hata tool allowlist’ini açık bırakıp serbest Bash vermek. Salt okunur bir review allowlist’i Read,Grep,Glob. Git’e ihtiyacınız varsa daraltın: Bash yerine Bash(git diff:*). PR-tetiklemeli çalışmalarda asla sınırsız Bash vermeyin; model kandırılırsa secret’larınızı runner’dan curl ile dışarı çıkarabilir.

claude[bot]’un gerekli reviewer sayılmasına izin vermeyin. Branch protection kurallarında required reviewer’ları yalnızca insan olarak yapılandırın. AI review tavsiye niteliğinde; merge geçidi insanda kalıyor. Yararlı bir ilk okuma ile göstermelik bir onay arasındaki fark bu.

Secret’ı sınırlayın. ANTHROPIC_API_KEY’i org düzeyi yerine repo veya environment düzeyinde set edin. Ele geçirilen tek bir repo tüm org’un kotasını yakmamalı.

Action’ı pinleyin. Kişisel, düşük riskli repo’lar için @v1 yeterli. Üretim veya regüle repo’lar için commit SHA’ya pinleyin; böylece ele geçirilmiş bir tag, action’ın davranışını siz fark etmeden değiştiremez. Bu standart supply-chain hijyeni ve kullandığınız her üçüncü taraf action için geçerli.

Base-action’a geçiş

Üst seviye action, daha düşük seviyeli bir action’ı GitHub’a özgü PR ve issue mantığıyla sarmalıyor. Çoğu takımın üst seviye sarmalayıcının dışına çıkmaya hiç ihtiyacı olmaz. Şunlardan biri doğruysa base action’a uzanın:

  • PR yorumu yerine merge’i koşula bağlayan (pass/fail) bir GitHub status check istiyorsunuz. Base action success veya failure olan bir conclusion output’u sunuyor; bunu downstream if: ile veya actions/github-script ile kullanabilirsiniz.
  • Çok adımlı bir pipeline istiyorsunuz: lint, sonra claude review, sonra integration test; review’ın yapılandırılmış output’u sonraki adımı besliyor.
  • Yorum dışı bir artifact istiyorsunuz: bulguları JSON dosya olarak çıkarmak, workflow artifact olarak yüklemek veya SIEM’e beslemek.
  • Modelin bir branch’e düzeltme yazıp size geri PR açmasını, üstelik özel commit-mesaj kurallarıyla, istiyorsunuz.
  • Birden çok Claude çağrısını (biri güvenlik için, biri performans için) tekilleştirilmiş tek bir review pass’ine zincirliyorsunuz.

Base action ayrıca üst seviye action’ın claude_args arkasında sakladığı input’ları da açıyor: system_prompt, append_system_prompt, disallowed_tools, settings, ve claude_env. System prompt’u jailbreak girişimlerine karşı sıkılaştırmak veya MCP server’lara dar kapsamlı env vars geçirmek istediğinizde işe yarıyor.

Sık yapılan hatalar

  • Eski bir tutorial kullandığı için pull_request_target kullanmak ve ANTHROPIC_API_KEY’i fork’tan gelen koda açmak.
  • “Her ihtimale karşı” contents: write vermek ve modele varsayılan branch’e push yetkisi tanımak.
  • allowedTools’u set etmemek ve public repo’da serbest Bash ile sonuçlanmak.
  • Action’ın bot push’unun branch protection’da gerekli reviewer sayılmasına izin vermek.
  • Uzun süre açık duran bir PR branch’inde her push’ta action’ı tekrar çalıştırıp token yakmak. Mecbursanız synchronize ile sınırlayın, ama paths: filtresini veya [skip-claude] muafiyetini de düşünün.
  • actions/checkout üzerinde fetch-depth: 0’ı unutup kırpılmış diff almak.
  • 5000 satırlık PR’lı bir monorepo’da fiyat sürprizi. --max-turns ile sınırlayın veya büyük diff’lerde workflow’u atlayın.

Kapanış

Yukarıdaki varsayılan workflow, output şekli uymayana kadar çoğu takım için yeterli: merge’i koşula bağlayan bir status check, dosya artifact’ı veya çok adımlı bir pipeline gerektiğinde sınıra gelirsiniz. claude-code-base-action’a o noktada inin, öncesinde değil. Atılacak tek somut adım: yukarıdaki workflow’u düşük riskli bir repo’ya kopyalayıp karşısına küçük bir PR açmak ve geniş çapta yaymadan önce review’ın okunuşunu izlemek.

Kaynaklar

İlgili yazılar