Zpět na domů

Hybridní vyhledávání kódu v GitLabu napříč 100+ projekty

Hybridní skript zrychluje vyhledávání řetězců napříč 100+ GitLab projekty: API Search pro kód a dokumentaci, rekurzivní procházení pro konfigurace. Paralelní zpracování s ThreadPoolExecutor. Podrobný kód a reporty pro technické audity.

Rychlé vyhledávání napříč 100+ GitLab repozitáři: hybrid API+Deep
Advertisement 728x90

Hybridní vyhledávání v repozitářích GitLab: API a hloubkové skenování konfigurací

S rostoucím počtem projektů v GitLab se hledání konkrétních řetězců v kódu, YAML, JSON a .env souborech stává problémem. Standardní vyhledávání přes UI a API funguje rychle pro kód, ale přehlíží konfigurační soubory. Řešením je hybridní skript v Pythonu s knihovnou python-gitlab: API Search pro kód a rekurzivní procházení pro konfigurace. Doba vyhledávání ve více než 100 projektech se zkrátila na minuty.

Analýza alternativních přístupů

Před vývojem jsme vyhodnotili stávající metody. Žádná z nich plně nepokrývala úlohu bez kompromisů.

| Přístup | Výhody | Nevýhody |

Google AdInline article slot

|--------|-------|--------|

| GitLab UI | Rychlé spuštění | Manuální pro 100+ projektů, slabé pro konfigurace |

| Lokální grep/ripgrep | Úplná kontrola | Klonování všech repozitářů trvá hodiny |

Google AdInline article slot

| GitLab API Search | Dostupné vzdáleně | Přeskočí YAML/JSON/env |

| Sourcegraph | Výkonné indexování | Vyžaduje nasazení infrastruktury |

Hybridní prohledávač se ukázal jako optimální: využívá silné stránky API a přidává procházení pro slabá místa bez externích závislostí.

Google AdInline article slot

Rozdíly ve vyhledávání podle typů souborů

GitLab spolehlivě indexuje kód a dokumentaci, ale konfigurace často zůstávají mimo vyhledávání.

  • Kód (.py, .js, .go, .ts): API Search – indexace pokrývá úplně.
  • Dokumentace (.md, .txt): API Search – dostatečná rychlost a přesnost.
  • Konfigurace (.yml, .yaml, .json, .env): Deep Search – rekurzivní strom + načtení obsahu.
  • Binární soubory: Vyloučeny pro úsporu zdrojů.

Logika: delegovat úlohu nástroji podle silných typů, ručně dohledat slabé.

Architektura skriptu

Skript následuje pipeline:

  • Získání seznamu projektů skupiny s podskupinami.
  • Filtrace archivovaných a neaktivních.
  • Paralelní zpracování: API Search + Deep Search.
  • Agregace výsledků.
  • Generování reportů.
GitLab Group → projects.list() → filter active
↓
Parallel: API Search (code) + Deep Search (configs)
↓
Merge → Detailed report + Summary + Errors

Vyhledávání je omezeno na větev master pro aktuální konfigurace. Rozšíření na všechny větve je možné, ale prodlužuje čas.

Implementace klíčových komponent

Získání projektů

group = gl.groups.get(GROUP_ID)
all_projects = group.projects.list(include_subgroups=True, all=True)

Filtruje se podle stavu archived=false a last_activity.

API Search pro kód

def api_search(gl, project_id, search_terms):
    results = {term: [] for term in search_terms}
    for term in search_terms:
        blobs = gl.search('blobs', term, project_id=project_id)
        for blob in blobs:
            file_path = blob.get('path', '')
            file_ext = os.path.splitext(file_path)[1].lower()
            if file_ext in CODE_EXTENSIONS or file_ext == '':
                results[term].append({
                    'path': file_path,
                    'url': blob.get('web_url', '#'),
                    'found_by': 'API'
                })
    return results

Zpracovává bloby podle přípon kódu.

Deep Search pro konfigurace

def deep_search_configs(gl, project_id, search_terms):
    results = {term: [] for term in search_terms}
    project = gl.projects.get(project_id)
    files = project.repository_tree(recursive=True, ref='master')
    for file in files:
        if file['type'] != 'blob':
            continue
        ext = os.path.splitext(file['name'])[1].lower()
        if ext not in CONFIG_EXTENSIONS:
            continue
        content = project.files.get(file_path=file['path'], ref='master').decode()
        content_lower = content.lower()
        for term in search_terms:
            if term.lower() in content_lower:
                results[term].append({
                    'path': file['path'],
                    'found_by': 'Deep'
                })
    return results

Rekurzivní strom, načtení obsahu, řetězcové vyhledávání.

Paralelizace zpracování

ThreadPoolExecutor se 3 pracovníky urychluje pro 100+ projektů:

with ThreadPoolExecutor(max_workers=3) as executor:
    futures = {executor.submit(process_one_project, gl, p): p for p in active_projects}
    for future in as_completed(futures):
        result = future.result()
        results_list.append(result)

Snižuje čas z hodin na minuty bez problémů s GIL v IO-bound úloze.

Formáty reportů

Detailní: Projekt, cesta, termín, řádek, metoda vyhledávání.

Příklad:

PROJEKT: service-a
Cesta: backend/service-a
'SERVICE_EXAMPLE': 2 výskyty
  - deploy/prod/values.yml:42 [Deep]
    Řádek 42: SERVICE_EXAMPLE: "{{ .Values.secrets.apiKey }}"

Souhrnný: Počet projektů, výskytů, API vs Deep.

Faktory zrychlení

  • Vyloučení nepotřebných souborů/projektů.
  • API pro 80 % případů (kód).
  • Paralelismus.
  • Zaměření na master.

Omezení

  • Pouze master.
  • Žádné regulární výrazy.
  • Žádná deduplikace.
  • Konzolový výstup.

Co je důležité

  • Hybrid minimalizuje slabiny GitLab Search pro konfigurace.
  • Paralelismus se 3 vlákny je optimální pro API rate limity.
  • Filtrace projektů snižuje zátěž o 30–50 %.
  • Deep Search je přesný pro YAML/JSON/env.
  • Vhodné pro jednorázové kontroly bez infrastruktury.

— Editorial Team

Advertisement 728x90

Číst dál