İçeriğe Atla
BLOG_INDEX
20 Ocak 2025·ai·11 min read

AI Destekli DevOps — LLM'leri Pipeline'larınıza Entegre Etmek

AI Destekli DevOps — LLM'leri Pipeline'larınıza Entegre Etmek

DevOps + AI: Neden Şimdi?

2024 sonunda bir gerçekle yüzleştim: CI loglarını okumaya harcadığım zamanın büyük kısmını bir LLM çok daha hızlı yapabilirdi. Sadece "hata nerede?" sorusunu değil, "neden oldu ve ne yapmalıyım?" sorusunu da yanıtlayabilirdi.

Bu yazı somut implementasyonlar içeriyor — kavramsal değil, çalışan kod.


Use Case 1: Otomatik PR Özeti

Her pull request için LLM'e diff gönderip anlamlı bir özet ürettiriyoruz.

# .github/workflows/pr-summary.yml
name: AI PR Summary
on:
  pull_request:
    types: [opened, synchronize]

jobs:
  summarize:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v4
        with:
          fetch-depth: 0

      - name: Get diff
        id: diff
        run: |
          DIFF=$(git diff origin/${{ github.base_ref }}...HEAD --stat)
          echo "diff<<EOF" >> $GITHUB_OUTPUT
          echo "$DIFF" >> $GITHUB_OUTPUT
          echo "EOF" >> $GITHUB_OUTPUT

      - name: Generate summary
        env:
          ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
        run: |
          python3 - <<'EOF'
          import anthropic, os, json

          client = anthropic.Anthropic()
          diff = """${{ steps.diff.outputs.diff }}"""

          message = client.messages.create(
              model="claude-opus-4-6",
              max_tokens=500,
              messages=[{
                  "role": "user",
                  "content": f"Bu PR diff'ini Türkçe özetle, teknik ve kısa tut:\n\n{diff}"
              }]
          )
          print(message.content[0].text)
          EOF

Use Case 2: Akıllı Hata Analizi

Test veya build başarısız olduğunda LLM log'u analiz edip GitHub PR yorumu olarak yayıyor.

# scripts/analyze_failure.py
import anthropic
import sys

def analyze_log(log: str) -> str:
    client = anthropic.Anthropic()

    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=800,
        system="""Sen bir senior DevOps mühendisisin.
        CI/CD hata loglarını analiz edip şu formatta yanıt ver:

        **🔴 Hata:** (tek satır özet)
        **📍 Konum:** (dosya/satır varsa)
        **🔧 Çözüm:** (3 adım maksimum)
        **⚡ Önleyici:** (gelecekte nasıl önlenir)""",
        messages=[{
            "role": "user",
            "content": f"Bu CI logunu analiz et:\n\n```\n{log[:4000]}\n```"
        }]
    )
    return response.content[0].text

if __name__ == "__main__":
    log = sys.stdin.read()
    print(analyze_log(log))

Workflow entegrasyonu:

- name: Analyze failure
  if: failure()
  env:
    ANTHROPIC_API_KEY: ${{ secrets.ANTHROPIC_API_KEY }}
  run: |
    cat build.log | python3 scripts/analyze_failure.py > analysis.txt
    gh pr comment ${{ github.event.number }} --body "$(cat analysis.txt)"

Use Case 3: Deployment Karar Asistanı

Production deploy öncesi LLM'e metrik snapshot'ı gösterip "deploy et mi?" sorusunu soruyoruz.

# scripts/deployment_advisor.py
import anthropic
import json
import requests

def get_metrics_snapshot() -> dict:
    # Prometheus'tan son 15dk metrikleri çek
    metrics = {
        "error_rate_15m": query_prometheus("rate(http_requests_total{status=~'5..'}[15m])"),
        "p99_latency_ms": query_prometheus("histogram_quantile(0.99, http_request_duration_ms_bucket[15m])"),
        "cpu_usage_pct": query_prometheus("avg(rate(container_cpu_usage_seconds_total[5m])) * 100"),
        "memory_usage_pct": query_prometheus("avg(container_memory_usage_bytes / container_spec_memory_limit_bytes) * 100"),
    }
    return metrics

def advise_deployment(version: str, changelog: str) -> dict:
    client = anthropic.Anthropic()
    metrics = get_metrics_snapshot()

    response = client.messages.create(
        model="claude-opus-4-6",
        max_tokens=600,
        messages=[{
            "role": "user",
            "content": f"""
            Deployment kararı ver:

            **Versiyon:** {version}
            **Değişiklikler:** {changelog}

            **Mevcut sistem metrikleri:**
            {json.dumps(metrics, indent=2)}

            JSON formatında yanıt ver:
            {{"decision": "DEPLOY|HOLD|ROLLBACK", "confidence": 0-100, "reason": "...", "risks": []}}
            """
        }]
    )

    return json.loads(response.content[0].text)

Dikkat Edilmesi Gerekenler

1. LLM'e kritik kararlar bırakmayın

LLM bir asistan, karar verici değil. Production'a dokunacak her aksiyonda insan onayı şart.

# Otomatik deploy değil, onaylı deploy
- name: Request human approval
  uses: trstringer/manual-approval@v1
  with:
    approvers: bariscanatakli
    minimum-approvals: 1
    issue-title: "AI Analysis: Deploy ${{ env.VERSION }}?"
    issue-body: "${{ steps.advisor.outputs.analysis }}"

2. Token maliyetini izleyin

Diff'ler büyüyebilir. Limit koyun:

MAX_DIFF_TOKENS = 3000
diff_truncated = diff[:MAX_DIFF_TOKENS * 4]  # ~4 char per token

3. Prompt injection'a dikkat

CI ortamına dışarıdan giren veriler (branch adı, commit message) prompt'a direkt eklenmemeli:

# KÖTÜ
prompt = f"Analiz et: {user_input}"

# İYİ — sanitize et veya sandbox prompt kullan
prompt = f"Kod değişikliklerini analiz et. Değişiklik sayısı: {len(changes)}"

Sonuç

AI + DevOps entegrasyonu olgunlaştı. Hata analizi ve PR özetleri için production-ready çözümler var. Deployment kararları için ise AI'ı bir danışman olarak kullanmak — nihai kararı insana bırakmak — doğru denge.

Bu pipeline'ları kurduktan sonra CI hatası debug süresi yaklaşık %60 azaldı.

#AI#DevOps#LLM#GitHub Actions#Automation
SHARE