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ı.