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 |
|--------|-------|--------|
| 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 |
| 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í.
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
Zatím žádné komentáře.