Exploring Infinite Possibilities on FrontEnd 🚀
Burak Sağlık
Search...

Sat Aug 22 2026

Legacy Kod Analizi: AI Ajanları, Statik Analiz ve Refactoring Rehberi

Legacy Kod Analizi: AI Ajanları, Statik Analiz ve Refactoring Rehberi

🎯 Giriş: Legacy Kod ile Tanışma ve AI Ajanlarının Rolü

Hadi kabul edelim: legacy kod kelimesini duymak bile bazen kan basıncımızı yükseltir 😅. O "kim yazmış bu kodu?" anı, her geliştiricinin en az bir kez yaşadığı bir kabustur. Ben de geçen ay, 10 yıl önce yazılmış, dokümantasyonu yok, testleri hiç olmayan, ama kritik bir ödeme modülünü incelemek zorunda kaldım. Saatlerce grep ve find komutlarıyla boğuştum, yorum satırları bile Türkçe-İngilizce karışık yazılmıştı. Sonunda kafam karıştı, kahve molası verdim ve "Ya buna bir AI asistan olsaydı..." diye düşündüm.

İşte tam o noktada AI ajanları (AI agents) devreye giriyor. Onlar sihirli bir çözüm değil, ama çok güçlü bir asistan olabiliyorlar 🛠.

Neden Legacy Kod Bu Kadar Zor? 🤔

  • Bilgi kaybı: O kodu yazan kişi ayrılmış, notlar da giderken yanına almış.
  • Spagetti yapı: Her yerden her yere giden bağımlılıklar, bir şeyi değiştirdiğinde neyin bozulacağını kestirememeni sağlıyor.
  • Test eksikliği: "Çalışıyorsa dokunma" felsefesiyle yıllarca geliştirilmiş, ama regression riski her an kapıda.
  • Zaman kaybı: Manuel kod incelemesi günlerinizi, hatta haftalarınızı alıyor.

AI Ajanları Nasıl Yardımcı Oluyor? 🤖

AI ajanları, sadece kod önermekle kalmıyor; bağlamı anlıyor, dosyalar arası ilişkileri kuruyor ve hatta test senaryoları üretiyor. Düşünün ki:

  • Size "Bu fonksiyon ne yapıyor?" diye sorduğunuzda, sadece imzayı değil, tam veri akışını anlatıyor.
  • "Bu modülü refactor etmek istiyorum, riskler neler?" dediğinizde, bağımlılık grafiği çıkarıyor.
  • Eski pattern'leri tanıyıp, modern alternatifleri öneriyor (örneğin callback hell'den async/await'e).

Benim Küçük Anemdotim 📖

O ödeme modülünde, AI ajanına "Bu processPayment fonksiyonundaki hata yönetimini anlat" dedim. 3 saniyede bana şunu verdi:

  • Hangi exception'ların yakalandığını
  • Loglanmayan hata durumlarını
  • Test edilmemiş 3 edge case'i (biri de null kart numarasıydı 😱)

Sonuç? 2 saatte yapacağım incelemeyi 15 dakikada bitirdim. Ve evet, o null kart numarası bug'ı production'a gitmeden yakaladık ✅.

Siz de mi Yaşadınız? 🙋‍♂️

  • "Bu kod kim yazdı?" diyerek git blame çekip, o kişinin LinkedIn'ini aradınız mı?
  • Yorum satırı "// TODO: fix later" gördüğünüzde, "later"ın 5 yıl önce geldiğini fark ettiniz mi?
  • Ctrl+Shift+F ile arama yaparken, kimse kullanmamış bir utility fonksiyonu keşfettiniz mi?

Eğer "Evet" dedinyseniz, bu seride doğru yerdesiniz. Gelecek bölümlerde, AI ajanlarını nasıl kuracağımızı, hangi araçları kullanacağımızı ve legacy kod tabanını nasıl "anlayacak" hale getireceğimizi adım adım göreceğiz.

Hazırsan başlayalım 🚀


❗️ Sorun: Neden Sadece Prompt Yeterli Değil?

Hazırsan başlayalım 🎯

Sadece bir prompt yazıp “bunu yap” demek, günlük işlerde sık sık şu çileleri doğurur:

  • Bağlam eksikliği ❗️

    • Model, projenin mimarisini, kod stilini veya önceki kararları bilmez.
    • Sonuç: Yanlış dosya, yanlış isimlendirme, tekrar eden kod blokları.
  • Hallüsinasyon riski 🔁

    • Büyük dil modelleri “bilmiyorum” demez, uydurur.
    • Özellikle API imzaları, kütüphane sürümleri veya veritabanı şemalarında sahte detaylar üretir.
  • Dosya / token limitleri 🛠

    • Tek bir mesajda whole‑repo’yu gönderemezsin.
    • Kritik parçalar kesilir, model yarım bilgiye dayanarak cevap verir.
  • Tekrar eden iş akışı

    • Her yeni istekte aynı açıklamaları, aynı kısıtları tekrar etmek zorunda kalırsın.
    • Zaman kaybı ve hata şansı artar.
  • Test edilebilirlik yok

    • Prompt’tan gelen kodu doğrudan çalıştırırsan, hata ayıklama süreci “dene‑yanılma” döngüsüne girer.

Ne hissediyorsun?

  • “Her seferinde aynı şeyi anlatmak zorunda kalıyorum.”
  • “Kod üretiyor ama projemde derlenmiyor.”
  • “Büyük dosyaları gönderemiyorum, yarım kalıyor.”

Bu çileler gerçek ve herkesin yaşadığı bir durum.
İşte bu nedenle prompt’un ötesinde bir yapıya — bağlam yönetimi, dosya parçalama, doğrulama adımları — ihtiyacımız var.

Hadi bir sonraki bölümde bu yapıyı nasıl kuracağımızı birlikte keşfedelim 🚀


🔁 Süreç: Statik Analiz ile Kod Haritası Oluşturma

Statik analiz, kodu çalıştırmadan inceleyip yapısal bilgiler çıkarma sanatıdır 🎯. Derleyici hatalarını yakalamak için değil, büyük picture'ı görmek için kullanırız: hangi dosya nereye bağlı, fonksiyonlar nasıl çağrılıyor, sınıf hiyerarşisi nasıl?

Legacy projelerde dokümantasyon yoksa, statik analiz ilk haritanız olur 🗺️.

🛠 Hangi Araçlar İşimizi Görür?

Araç Ne İşe Yarar? Legacy'de Ne Zaman?
ctags Hızlı sembol (fonksiyon, sınıf, değişken) indeksi üretir İlk keşif, editörlerde "go to definition"
tree-sitter Artımlı, hata tolérant parse ağaçları verir Dil bağımsız AST çıkarmak, kendi scriptlerinizde
CodeQL Sorgu diliyle derin semantik analiz (güvenlik, bug pattern) Güvenlik auditleri, kod kalitesi kuralları
SonarQube Merkezi dashboard, teknik borç metrikleri, quality gate Süreç içi izleme, CI/CD entegrasyonu

Benim tavsiyem: Önce ctags ile 5 dakikada bir "fonksiyon envanteri" çıkarın. Sonra ihtiyaca göre CodeQL/tree-sitter'a geçin 🚀.


🎯 Pratik: Kendi Makinenizde "İlk Harita" Çıkarma

Hazırsanız terminali açın, proje kök dizinine gidin. Örnek bir Java/Python karışık repo olduğunu varsayalım.

1️⃣ Etiket dosyası oluşturun (tags)

find . -name '*.java' -o -name '*.py' | xargs ctags -R --fields=+n --extras=+f

Ne oluyor burada?

  • find.java ve .py dosyalarını bulur (recursive)
  • xargs → bulduğu dosyaları ctags'e besler
  • -R → recursive (alt dizinler de)
  • --fields=+n → satır numarası ekler
  • --extras=+f → dosya adı bilgisini de koyar

Çıktı: kök dizinde tags dosyası oluşur. Bu, editörünüz (Vim, VS Code, IDEA) için navigasyon haritasıdır ✅.

2️⃣ Fonksiyon listesini terminalden alın

ctags -x --c-kinds=f

Çıktı örneği:

main            10  src/Main.java       public static void main(String[] args)
calculateTotal  42  src/OrderService.java  double calculateTotal(Order o)
processPayment  18  src/Payment.py      def process_payment(amount):

Ne kazandık?

  • Projedeki tüm fonksiyonları (Java method, Python def) tek seferde gördük
  • Hangi dosyada, hangi satırda olduğunu biliyoruz
  • Bu listeyi grep/awk ile filtreleyip "God class" adaylarını, çok uzun fonksiyonları, test edilmeyen modülleri tespit edebiliriz 🔍

💡 Küçük Bir İpucu

ctags varsayılan olarak C/C++ odaklıdır. Java/Python için Exuberant Ctags veya Universal Ctags kurulu olmalı:

# macOS
brew install universal-ctags

# Ubuntu/Debian
apt-get install universal-ctags

Eski exuberant-ctags paketleri Python 3 desteği zayıf olabilir ⚠️.


🔄 Sonraki Adım Ne?

Bu "ham harita"yı aldıktan sonra:

  1. CodeQL ile codeql database create → sorgular yazıp güvenlik açığı/anti-pattern ara
  2. tree-sitter CLI ile tree-sitter parse → AST JSON elde edip kendi analiz scriptinizi yazın
  3. SonarQube'a push edin → trend grafikleri, quality gate, PR decoration

Ama hepsi bu ilk tags dosyasından başlar. Şimdi siz deneyin, tags dosyasını açın, keşfetmeye başlayın 🧭.


🛠 Araç: Bağımlılık Grafiği Çıkarma

Statik analiz bitti, modül ve sınıf bağımlılıklarını görmek istiyorsun.
İşte hızlıca bir yönlü graf (directed graph) çıkarmak için kullanabileceğin iki popüler kütüphane: networkx + pydeps.

Neden bu kombinasyon? 🤔

  • pydeps Python kodunu tarayıp import ilişkilerini toplar.
  • networkx ise bu ilişkileri DiGraph nesnesine doldurur; sonra istediğin formatta (GraphML, GEXF, DOT…) kaydedebilirsin.
  • Görselleştirme için graphviz (DOT → PNG/SVG) veya matplotlib (hızlı bir bakış) yeterli.

Adım adım ne yapıyoruz? 🎯

  1. Proje kök dizinini pydeps’e ver.
  2. networkx.DiGraph() ile boş bir yönlü graf oluştur.
  3. pydeps.pydeps(..., graph=G) çağrısıyla grafı doldur.
  4. Sonucu GraphML (veya DOT) olarak kaydet → favorit görselleştiriciye at.

Kod parçacığı 🛠

import networkx as nx
import pydeps

# 1️⃣ Boş yönlü graf
G = nx.DiGraph()

# 2️⃣ Pydeps ile bağımlılıkları topla ve grafı doldur
pydeps.pydeps('my_project', show_deps=True, graph=G)

# 3️⃣ GraphML olarak kaydet (Graphviz, Gephi, Cytoscape… hepsi okur)
nx.write_graphml(G, 'dependency_graph.graphml')

Bu sayede ne oluyor? ✅

  • dependency_graph.graphml dosyası tüm modül/sınıf düğümleri ve import kenarlarını içerir.
  • Dosyayı graphviz ile render edersen (dot -Tpng dependency_graph.graphml -o deps.png) temiz bir PNG elde edersin.
  • matplotlib ile hızlıca nx.draw(G, with_labels=True) deyip plt.show() dersen interaktif bir pencere açarsın.

İpucu 💡

  • Büyük projelerde graf çok yoğun olabilir. pydeps parametreleri (--max-bacon, --show-deps vb.) ile filtreleme yap, sonra networkx’te nx.subgraph alarak sadece ilgilendiğin paketi çiz.
  • GraphML yerine nx.write_dot(G, 'deps.dot') dersen Graphviz doğrudan işler.

Hazırsan bir sonraki adımda bu grafı CI/CD içine entegre edip her commit’te otomatik grafik çıkartabilirsin 🚀


🔁 Süreç: Çalışma Zamanı İzleme (Tracing) ile Dinamik Davranış

Statik analiz kodunuzu derleme zamanında tarar, ama çalışma anında ne olduğunu görmez.
Özellikle mikro servisler, async mesaj kuyrukları ya da legacy monolitlerde hangi servis ne kadar bekliyor, hata nerede patlıyor gibi sorulara cevap vermek için runtime tracing şart 🎯.

Neden OpenTelemetry / Jaeger / Zipkin?

Araç Ne Sağlar? Neden Tercih Edilir?
OpenTelemetry Vendor‑agnostic API & SDK, otomatik enstrümantasyon Tek kod bazında birden fazla backend (Jaeger, Zipkin, Tempo…) destekler
Jaeger Dağıtık trace UI, servis haritası, root‑cause analizi Kubernetes entegrasyonu güçlü, CNCF graduated
Zipkin Basit kurulum, düşük kaynak tüketimi Hızlı PoC’ler için ideal

Kısaca: Kodunuza bir kez OpenTelemetry ekleyin, sonradan backend’i değiştirmek sadece config meselesi ✅.


1️⃣ Legacy Monolit’e Enstrümantasyon Ekleme – Adım Adım

Java (Spring / Plain) – Java Agent Yöntemi

  1. Agent indir (en son sürüm):
    wget https://github.com/open-telemetry/opentelemetry-java-instrumentation/releases/latest/download/opentelemetry-javaagent.jar
  2. JVM argümanı olarak başlat – log exporter ile hızlı test:
java -javaagent:opentelemetry-javaagent.jar \
     -Dotel.traces.exporter=logging \
     -Dotel.service.name=legacy-monolit \
     -jar legacy-app.jar
  • -Dotel.traces.exporter=logging → trace’leri stdout’a basar (geliştirme için yeterli).
  • Prod’da -Dotel.traces.exporter=otlp + collector adresi verip Jaeger/Zipkin’e yönlendirirsiniz.

Python – opentelemetry-instrument Wrapper

  1. Kütüphaneleri kur (bir kez):
pip install opentelemetry-distro opentelemetry-exporter-otlp
opentelemetry-bootstrap -a install
  1. Uygulamanızı wrapper ile çalıştırın – console exporter ile anında görün:
opentelemetry-instrument \
  --traces_exporter console \
  --metrics_exporter console \
  --service_name python-monolit \
  python app.py

Ne oluyor? Wrapper, requests, flask, sqlalchemy gibi popüler kütüphaneleri kod değiştirmeden otomatik sarar (auto‑instrumentation) 🔁.


2️⃣ Basit Bir Trace Örneği – Ne Yakalanır?

Aşağıda tek bir HTTP isteği için üretilen span hiyerarşisi görüyorsunuz (console exporter çıktısı kısaltılmış):

Span(name="GET /orders", trace_id=abc123, span_id=def456, parent=None)
  ├─ Span(name="DB SELECT orders", span_id=ghi789, latency=12ms, status=OK)
  ├─ Span(name="HTTP CALL payment-service", span_id=jkl012, latency=45ms, status=OK)
  │    └─ Span(name="payment-service /charge", span_id=mno345, latency=30ms, status=OK)
  └─ Span(name="Cache GET user:42", span_id=pqr678, latency=3ms, status=OK)

Yakalanan temel veriler 📦:

Alan Açıklama
trace_id Tüm servisleri bağlayan benzersiz kimlik
span_id Her iş birimi (DB call, HTTP call, cache) için unique id
parent_span_id Hangi span’ın child olduğunu gösterir → servis haritası oluşur
latency İşlem süresi (ms) – bottleneck tespiti için kritik
status / error OK / ERROR + exception stack trace (varsa)
attributes http.method, db.statement, messaging.destination gibi semantik etiketler

Bu veriler sayesinde:

  • Latency heatmap çizip hangi hop yavaş? diye sorarsınız 🔥
  • Error rate per servis / endpoint anında görünür ❗️
  • Root‑cause: hata içeren span’ın parent’ını takip edip kaynağa inersiniz 🕵️‍♂️

3️⃣ Prod’a Geçerken Dikkat Edilecekler (Kısa Checklist)

  • Sampling: %100 trace prod’da maliyetli → TraceIdRatioBased(0.1) gibi oranlı sampling ayarlayın.
  • Resource attributes: service.name, deployment.environment, k8s.pod.name ekleyin → Jaeger’de filtreleme kolaylaşır.
  • Exporter: otlp + OpenTelemetry Collector → tek noktadan çoklu backend (Jaeger, Tempo, Prometheus) besleyin.
  • Security: Trace verisinde PII (kullanıcı e‑posta, kredi kartı) olmaması için attribute scrubbing yapın.

🎉 Özet

  1. Statik analiz yetmez → çalışma zamanı davranışını görmek için distributed tracing şart.
  2. OpenTelemetry ile tek entegrasyon, birden fazla backend (Jaeger, Zipkin, Tempo).
  3. Legacy monolitlerde Java agent / Python opentelemetry-instrument wrapper kod değiştirmeden başlarsınız.
  4. Her span: trace_id, span_id, latency, status, attributesbottleneck ve hata kök nedeni anında görünür.

Hazırsanız bir sonraki adımda trace verilerini nasıl görselleştirip alarm kuracağımızı (Jaeger UI, Grafana Tempo, alerting) anlatabiliriz 🚀.


🛠 Pratik: AI Ajanı ile Mimari Keşif Otomasyonu

Hazırsan başlayalım 🎯

Önceki adımlarda elde ettiğimiz statik analiz çıktılarını (tag dosyası, bağımlılık grafiği) ve tracing verilerini bir AI ajanı üzerinden sorgulamak, mimari keşfi dakikalar içinde özetlemek için harika bir yöntem.
LangChain + LLM kombinasyonu ile bunu bir prompt şablonu ve birkaç satır Python koduyla halledebiliriz.

Ne yapmak istiyoruz?

  • Modül sorumluluklarını özetle 📦
  • Kritik yol (critical path) tespit et
  • Geliştiriciye eylem planı sun

Prompt şablonu

Sen bir yazılım mimarisin. Aşağıdaki verilerle:
1. Bağımlılık grafiği özeti: {graph_summary}
2. İzleme (trace) özeti: {trace_summary}

Görevlerin:
- Her modülün sorumluluklarını madde madde yaz.
- En kritik yolu (en uzun gecikme zinciri) belirle ve neden kritik olduğunu açıkla.
- İyileştirme önerileri sun.
Cevabı Türkçe, kısa ve net tut.

Python scripti

from langchain.llms import OpenAI
from langchain.chains import LLMChain
from langchain.prompts import PromptTemplate

# Prompt şablonunu tanımla
prompt = PromptTemplate(
    input_variables=["graph_summary", "trace_summary"],
    template="""
Sen bir yazılım mimarisin. Aşağıdaki verilerle:
1. Bağımlılık grafiği özeti: {graph_summary}
2. İzleme (trace) özeti: {trace_summary}

Görevlerin:
- Her modülün sorumluluklarını madde madde yaz.
- En kritik yolu (en uzun gecikme zinciri) belirle ve neden kritik olduğunu açıkla.
- İyileştirme önerileri sun.
Cevabı Türkçe, kısa ve net tut.
"""
)

# LLM zincirini kur
chain = LLMChain(
    llm=OpenAI(temperature=0),   # deterministik cevap için sıfır sıcaklık
    prompt=prompt
)

# Örnek girdiler (gerçek verilerle değiştirilecek)
graph_txt = "Modül A -> Modül B -> Modül C; Modül D bağımsız."
trace_txt = "Request: A(12ms) → B(45ms) → C(30ms); Toplam 87ms."

# Ajanı çalıştır
result = chain.run(graph_summary=graph_txt, trace_summary=trace_txt)
print(result)

Bu sayede ne oluyor? 🤔

  1. Verileri tek seferde LLM’e veriyoruz – hem statik (grafik) hem dinamik (trace) bağlamı aynı anda anlıyor.
  2. Prompt içinde görevleri netleştiriyoruz – modül özeti, kritik yol, iyileştirme önerileri.
  3. temperature=0 ile tutarlı, tekrarlanabilir cevaplar alıyoruz.
  4. Çıktıyı doğrudan rapor, ticket veya chat aracına aktarabilirsin.

Küçük ipuçları 🛠

  • Graph özeti için networkx veya pydeps çıktısını metne dönüştür.
  • Trace özeti için OpenTelemetry span’larını toplayıp “servis → süre” formatında bir string üret.
  • Geliştirme ortamında prompt’u version kontrol altına al, zamanla ince ayar yap.

Artık elinizde otomasyonlu bir mimari asistan var. Bir sonraki adımda bu çıktıyı nasıl bir dashboard veya CI/CD adımına entegre edebileceğimize bakalım 🚀


🎯 Sonuç: Elde Edilen Bilgiyi Refactoring Planına Dönüştürme

AI ajanı bize üç değerli arteakt verdi:

  • 📐 Mimari özet – sistemin genel yapısı ve modül sınırları
  • 🔗 Bağımlılık grafiği – hangi servis/kütüphane kime bağlı
  • 🕵️ Tracing içgörüleri – gerçek çağrı akışları, gecikmeler ve hata noktaları

Bu verileri refactoring yol haritasına (roadmap) nasıl çeviririz? Hadi adım adım bakalım 👇

1️⃣ Önceliklendirme Kriterleri (Risk • Etki • Çaba)

Kriter Ne anlama gelir? Nasıl skorlanır?
Risk 🚨 Değişiklik bozulursa ne kadar zarar verir? Yüksek (kritik iş akışı), Orta, Düşük
Etki 🎯 Kullanıcı/performans/maliyet üzerindeki etki Büyük, Orta, Küçük
Çaba 🛠 Geliştirme + test süresi Büyük (>2 hafta), Orta (1‑2 hafta), Küçük (<1 hafta)

Basit formül: Öncelik = (Risk × Etki) / Çaba
Yüksek skorlu öğeler ilk sprinte girer 🚀

2️⃣ Küçük Adımlarla İlerleme – Strangler Fig Pattern 🌱

  1. Yeni servis/ modül yaz → feature flag ile canlıya al
  2. Eski kod çağrılarını yeni versiyona yönlendir (proxy/adapter)
  3. Canary trafiği %5‑10 → metrikleri izle (latency, error rate)
  4. Geçiş tamamlandığında eski kodu sil

Bu sayede büyük bang riski ortadan kalkar, her adım geri alınabilir olur ⛔️➡️✅

3️⃣ Sürekli Doğrulama Stratejileri

  • Unit / Integration testleri her PR’da zorunlu
  • Contract testing (Pact, Spring Cloud Contract) → servis arası sözleşme bozulmaz 🔒
  • Automated tracing (OpenTelemetry) → yeni yol haritasındaki her değişiklikte trace karşılaştırması yap
  • Performance budget (p95 latency < 200 ms) → CI pipeline’da fail ederse merge engellenir ❌

4️⃣ Yol Haritasını Canlı Tutma 📅

Sprint Odak Teslim Edilecek
1 Yüksek riskli, yüksek etki, düşük çaba Auth servisini yeni token yapısına taşı
2 Orta risk, büyük etki Order‑service → async messaging (Kafka)
3 Düşük risk, küçük çaba Logging formatını merkezi log’a uyarlama

Her sprint sonunda:

  • Retro → metrikleri gözden geçir
  • Backlog’u yeniden skorla
  • Stakeholder’la demo yap → onay al 🤝

Özetle: AI’nın verdiği haritaları sayısal öncelik matrisine dök, Strangler Fig ile ince ince geçiş yap, test + contract + tracing üçlüsüyle her adımı doğrula. Böylece refactoring kontrollü, geri alınabilir ve ölçülebilir bir sürece dönüşür 🎉


🎁 Bonus Tavsiye: Sürekli Entegrasyon ve İzleme Stratejileri

Legacy kod üzerinde her değişiklik bir risk taşır.
Bu riski minimize etmek için CI/CD pipeline’ımıza üç basit ama güçlü adım ekleyebiliriz 🚀

Neden bu adımlar? 🤔

  • Statik analiz → Kod kalitesini ve güvenlik açıklarını erken yakalar.
  • Bağımlılık grafiği → Hangi modüller birbiriyle nasıl ilişkili, bir gözde görürsün.
  • Tracing uyarıları → Çalışma zamanında performans darboğazlarını anında fark edersin.

GitHub Actions örneği 🛠

Aşağıdaki workflow dosyası her push/pull‑request’te otomatik çalışır.
Kod bloğunu kopyala, .github/workflows/ci.yml içine yapıştır ve run_static_analysis.sh ile generate_graph.py scriptlerini repo’nuna ekle.

name: CI – Legacy Guard

on:
  push:
    branches: [ main, develop ]
  pull_request:

jobs:
  legacy-checks:
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v3

      - name: Static Analysis
        run: ./run_static_analysis.sh

      - name: Dependency Graph
        run: python generate_graph.py

      - name: Upload Graph Artifact
        uses: actions/upload-artifact@v3
        with:
          name: dependency-graph
          path: graph_output/

Ne yaptık?

  1. actions/checkout@v3 → Repo’yu runner’a çeker.
  2. Static Analysis → Özel scriptin (ör. SonarQube, ESLint, bandit) çalıştırır.
  3. Dependency Graph → Python scripti bağımlılık grafiğini üretir (Graphviz, Mermaid vb.).
  4. Upload Graph → Oluşan grafiği artifact olarak kaydeder; PR incelemesinde görselleştirme için hazır olur.

GitLab CI için hızlı bir bakış 🔁

GitLab’de de aynı mantık geçerli. .gitlab-ci.yml içine script: blokları ekleyip artifacts: ile grafiği yükleyebilirsin. Temel yapı aynı: checkout → analyze → graph → artifact.

Alışkanlıkları ekibe yay 🌱

  • Her PR’de statik analiz zorunlu kıl.
  • Bağımlılık grafiğini code review sırasında paylaş.
  • Tracing uyarılarını Slack/Teams kanallarına bağla; anında bildirim al.

Küçük bir yatırım, büyük bir rahatlık.
Bu alışkanlıkları ekibe yay, gelecekteki kendine minnettar olacak ✅


Bu içerik tamamen yapay zeka destekli otomasyon sistemi ile üretilmiştir.

Burak Sağlık

Burak Saglik

©2024 Desing and Developed by @Burak Sağlık

All rights reserved