Skip to content

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 bir kurulum; üretim için güvenlik ve maliyet ayarları açıkça anlatılıyor.

Tek bir reviewer'ın darboğaza dönüştüğü küçük takımlarda PR'lar geç merge edilir ve gün sonunda yorgun bir gözle onaylanır. Sıkıcı hata sınıfı (eksik null kontrolü, yutulmuş bir hata, yanlış logger, eklenmiş ama hiç çalıştırılmamış bir test) dikkatli bir ilk okuyucunun otuz saniyede yakaladığı, yorgun bir insanın ise üzerinden geçtiği şeydir. Anthropic'in baktığı anthropics/claude-code-action, bugün bir PR pipeline'ına AI ilk-okuma reviewer'ı eklemenin doğru varsayılanı: en düşük sürtünmeyle çalışan kurulum, Anthropic'in auth ve prompt injection sıkılaştırmalarını miras alıyor, kendisi gerekli reviewer sayılmadan normal branch protection ile birlikte çalışıyor.

Bu yazı; GitHub Actions YAML zaten yazan, kopyalayıp yapıştırabileceği bir kurulumun yanında üretim repo'sunda güvenli kullanmak için gereken güvenlik ve maliyet ayarlarını arayan backend ve full-stack mühendisleri için.

Önerilen kurulum

Workflow'u .github/workflows/claude-review.yml dosyasına koyun. Aşağıdaki dosya gerçek bir repo'ya göndereceğim minimum şeklidir: 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ş.

yaml
name: Claude Code Reviewon:  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.

yaml
  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 ve bu property yalnızca PR thread'lerinde dolu geliyor; guard olmadan action sıradan issue içindeki @claude mention'larına da yanıt verir, 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.

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.

Sayıları kurumsal dokümana yazmadan önce Anthropic pricing sayfasından doğrulayın; fiyatlar değişiyor. Bu yazıldığı sırada:

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 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; pazartesi sabahı CI patlamaları en bariz tetikleyici.

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

Yazıyı haklı çıkaran bölüm bu. 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 bunu açıkça riskli olarak adlandırdığı allowed_non_write_users ile 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.

Açık bir allowed_bots listesi set edin, asla '*' değil. 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 App'in 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 gate insan. Yararlı bir ilk okuma ile otomatik bir lastik damga arasındaki fark bu.

Secret'ı sınırlayın. ANTHROPIC_API_KEY'i org düzeyi yerine repo veya environment düzeyinde set edin. Tek bir compromised repo tüm org'un kotasını yakmamalı.

Action'ı pinleyin. Casual repo'lar için @v1 yeterli. Üretim veya regüle repo'lar için commit SHA'ya pinleyin; böylece compromised bir tag action'ın davranışını altınızdan sessizce değiştiremez. Bu standart supply-chain hijyeni ve kullandığınız her üçüncü taraf action için geçerli.

Ne zaman base-action'a geçilir

Üst seviye action, GitHub'a özgü PR ve issue mantığını alttaki daha düşük seviyeli action ile 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 değil de merge'i geçit altına alacak (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

Yanlış gittiğini gördüğüm şeylerin kısa bir listesi:

  • 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 üzerinden geçit altına alın, ama paths: filtresi veya [skip-claude] muafiyetini 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 çoğu takım için yeterli: PR-tetiklemeli review, interaktif @claude döngüsü, Sonnet modeli, salt okunur tool allowlist'i, pull_request trigger'ı, merge'de sıkı insan geçidi. Output şekli artık uymadığında (status check, dosya artifact'ı, çok adımlı pipeline) claude-code-base-action'a inin. Atılacak tek somut adım: yukarıdaki workflow'u düşük riskli bir repo'ya git apply ile koyup karşısına küçük bir PR açmak ve geniş çapta yaymadan önce review'ın okunuşunu izlemek.

Kaynaklar

İlgili Yazılar