Sparround

CI-də agent: headless rejim və avtomatlaşdırma

Claude Code interaktiv rejimdən başqa qeyri-interaktiv (headless) rejimdə də işləyir. Bu, skript və CI üçün nəzərdə tutulub:

  • -p "<prompt>" — qeyri-interaktiv icra.
  • --output-format json — strukturlaşdırılmış çıxış (nəticə, sessiya ID, istifadə statistikası, xərc təxmini).
  • --json-schema '<schema>' — çıxışın konkret JSON sxemasına uyğun olması.
  • --allowedTools "Read,Edit,Bash" — icazə verilən alətlər.
  • --permission-mode dontAsk — siyahıda olmayan hər şey rədd edilir.
  • --bare — hook-ların, skill-lərin, plugin-lərin, MCP serverlərinin avtomatik kəşfini atlayır.

Çıxış kodu uğurda 0, uğursuzluqda sıfırdan fərqli olur — skript buna görə budaqlana bilər.

`--bare` CI üçün tövsiyə olunan rejimdir. Səbəbi təhlükəsizlikdir: onsuz -p sessiyası layihənin .claude/settings.json-dakı hook-larını işə salır və .mcp.json-dakı serverlərə qoşulur — üstəlik heç bir təsdiq dialoqu göstərmədən. Yəni etibar etmədiyiniz bir fork-un PR-ı sizin CI-nizdə kod icra edə bilər. --bare bunların heç birini oxumur.

CI ssenarisiUyğunluqQeyd
PR-da avtomatik review şərhiYaxşıBloklayıcı olmasın — səs-küy komandanı yorur
Build xətasının izahıYaxşıLog-u pipe ilə ötür — Bash icazəsi lazım olmur
Issue triage və etiketləməYaxşıYazma icazəsi məhdud olsun
Release notes hazırlanmasıYaxşıNəşrdən əvvəl insan yoxlaması
Qırılan testin avtomatik düzəldilməsiRiskliAgent testi "keçirtmək" üçün dəyişə bilər
Avtomatik mergeXeyrİnsan qapısı ləğv edilməməlidir
yaml
# GitHub Actions — a non-blocking review comment on a PR
name: AI review
on: pull_request

jobs:
  review:
    runs-on: ubuntu-latest
    permissions:
      contents: read
      pull-requests: write
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Install Claude Code
        run: curl -fsSL https://claude.ai/install.sh | bash

      - name: Review diff
        env:
          CLAUDE_CODE_OAUTH_TOKEN: ${{ secrets.CLAUDE_CODE_OAUTH_TOKEN }}
        run: |
          git diff origin/${{ github.base_ref }}...HEAD -- '*.kt' > diff.txt
          # Pipe the diff in: the agent needs no Bash permission
          cat diff.txt | claude --bare -p \
            "Review this Android diff. Report ONLY blocking and medium
             severity problems: crash risk, resource leaks, forgotten
             error cases, broken Compose state hoisting.
             Do NOT write style notes. Format: [LEVEL] file:line - problem.
             If there are no problems, say so; do not invent findings." \
            --output-format json > review.json

      - name: Post comment
        env:
          GH_TOKEN: ${{ secrets.GITHUB_TOKEN }}
        run: |
          jq -r '.result' review.json > body.md
          gh pr comment ${{ github.event.pull_request.number }} --body-file body.md

Diqqət ediləcək üç nöqtə: `--bare` (təhlükəsizlik), diff-in pipe ilə ötürülməsi (Bash icazəsi lazım olmur) və nəticənin şərh kimi yazılması (bloklamır).

CI-də agent üçün təhlükəsizlik qaydaları:

  • `--bare` işlət — repo-dakı hook və MCP konfiqurasiyası işə düşməsin.
  • Minimum icazə--allowedTools ilə dar siyahı və ya --permission-mode dontAsk.
  • Token idarəsi — CI üçün uzunmüddətli token claude setup-token ilə yaradılır və CLAUDE_CODE_OAUTH_TOKEN kimi secret-də saxlanılır. --bare rejimi bu dəyişəni oxumur, ona görə orada ANTHROPIC_API_KEY işlədilir.
  • Fork PR-larına diqqət — xarici fork-dan gələn PR-ın məzmunu etibarsızdır (prompt injection). Belə PR-larda agenti işə salmamaq və ya yalnız oxuma icazəsi ilə işə salmaq lazımdır.
  • Xərcin izlənməsi--output-format json çıxışında sorğu üzrə xərc təxmini var; onu loglayın.

📚 Mənbələr və sənədlər