Date de la publication : 23 juillet 2025
Lecture : 20 min
Découvrez comment trouver des correspondances exactes, utiliser des motifs regex et afficher des résultats contextuels dans des codes sources de plusieurs téraoctets.

Imaginez pouvoir cibler n'importe quelle ligne de code parmi 48 To de dépôts en quelques millisecondes. Ceci est désormais possible avec la fonctionnalité de recherche exacte de code de GitLab qui fournit une précision extrême, une prise en charge avancée des expressions régulières (regex) et des résultats contextuels sur plusieurs lignes. En présence de dépôts de code volumineux, cette fonctionnalité facilite considérablement le travail des équipes.
Toute personne travaillant avec du code connaît la frustration de devoir chercher du code dans plusieurs dépôts. Qu'il s'agisse de déboguer un problème, d'examiner des fichiers de configuration, de rechercher des vulnérabilités, de mettre à jour une documentation ou de vérifier la mise en œuvre d'un projet, vous savez exactement ce que vous cherchez, mais les outils de recherche traditionnels vous font régulièrement défaut. Ces outils renvoient trop souvent des dizaines de faux positifs, manquent cruellement de contexte pour comprendre les résultats obtenus et sont de plus en plus lents à mesure que le code source s’étoffe. Par conséquent, vous perdez un temps précieux à chercher une aiguille dans une botte de foin au lieu de compiler, de sécuriser ou d'améliorer votre logiciel. La fonctionnalité de recherche de code de GitLab était jusqu'ici prise en charge par Elasticsearch ou OpenSearch. Bien qu'excellents pour rechercher des tickets, des merge requests, des commentaires et d'autres données contenant du langage naturel, ces outils n'ont tout simplement pas été spécifiquement conçus pour le code. Après avoir évalué de nombreuses options, nous avons développé une meilleure solution.
La recherche exacte de code de GitLab est actuellement en phase de test bêta et optimisée par Zoekt (prononcé « zookt », qui signifie « recherche » en néerlandais). Zoekt est un moteur de recherche de code open source initialement développé par Google et aujourd'hui maintenu par Sourcegraph. Conçu spécifiquement pour une recherche de code à la fois rapide et précise à grande échelle, nous l'avons enrichi avec des intégrations propres à GitLab, des améliorations avancées et une intégration facilitée du système d'autorisations. Cette fonctionnalité révolutionne la manière dont vous recherchez et comprenez le code grâce aux trois éléments clés : 1. Un mode de recherche par correspondance exacte Lorsque vous basculez en mode de recherche par correspondance exacte, le moteur de recherche ne renvoie que les résultats qui correspondent exactement à votre requête, éliminant ainsi les faux positifs. Cette précision est inestimable dans les cas de figure suivants :
En plus de la ligne contenant le code recherché, vous avez accès au contexte environnant qui est indispensable pour bien comprendre le code. Vous n'avez donc plus besoin d'accéder aux fichiers dans le seul but d'obtenir un contexte plus clair, ce qui accélère considérablement votre workflow.Examinons maintenant comment ces nouvelles capacités se traduisent dans le quotidien des équipes de développement :
Voici un exemple de workflow tel qu'il pouvait être envisagé avant que la recherche exacte de code ne soit disponible : vous deviez copier un message d'erreur, lancer une recherche, parcourir une longue liste de correspondances partielles dans les commentaires, la documentation et les fragments de code, cliquer sur plusieurs fichiers... avant de trouver enfin la ligne de code que vous recherchiez. Avec la recherche exacte de code, le processus est le suivant :
Voici un exemple de workflow tel qu'il pouvait être envisagé avant que la recherche exacte de code ne soit disponible : vous deviez parcourir les répertoires, deviner l'emplacement probable des fichiers, ouvrir des dizaines de fichiers et élaborer peu à peu une compréhension globale du code source. Avec la recherche exacte de code, le processus est le suivant :
Voici un exemple de workflow tel qu'il pouvait être envisagé avant que la recherche exacte de code ne soit disponible : vous deviez localiser toutes les occurrences d'une méthode, mais certaines passaient inaperçues, et vous introduisiez des bogues en raison d'une refactorisation incomplète. Avec la recherche exacte de code, le processus est le suivant :
Vous utilisez le mode de recherche par correspondance exacte pour identifier toutes les occurrences de méthodes ou de variables.
Vous examinez le contexte pour comprendre les motifs d'utilisation.
Vous planifiez votre refactorisation avec des informations complètes sur son impact.
Impact : vous éliminez les bogues liés aux « occurrences manquées » qui entravent souvent les efforts de refactorisation, vous améliorez la qualité du code et vous réduisez les ajustements nécessaires.
Les équipes de sécurité peuvent :
Vos équipes peuvent effectuer une recherche dans l'ensemble de votre espace de nommage ou de votre instance pour :
Avant de détailler nos réalisations à grande échelle, explorons ce qui distingue Zoekt des moteurs de recherche traditionnels, et pourquoi il peut trouver des correspondances exactes aussi rapidement.
La rapidité de Zoekt provient de son utilisation de trigrammes positionnels, une technique qui indexe chaque séquence de trois caractères en conservant leur position exacte dans les fichiers. Cette approche résout l'un des plus grands défis que les équipes de développement rencontrent avec la recherche de code basée sur Elasticsearch : les faux positifs.
Voici le principe :
Les moteurs de recherche plein texte traditionnels comme Elasticsearch segmentent le code en mots isolés et perdent ainsi les informations de position. Par exemple, lorsque vous recherchez getUserId(), ils peuvent renvoyer des résultats contenant les fragments user, get et Id dispersés dans un même fichier, ce qui génère des faux positifs, source de frustration pour les utilisateurs de GitLab.
Les trigrammes positionnels de Zoekt, quant à eux, conservent les séquences de caractères exactes ainsi que leurs positions dans le code. Ainsi, lorsque vous recherchez getUserId(), Zoekt cible précisément les trigrammes exacts, comme get, etU, tUs, Use, ser, erI, rId, Id(", "d(), dans cette séquence précise et à ces positions exactes. Cette approche garantit que seules les correspondances exactes sont renvoyées.
Ainsi, des recherches qui renvoyaient auparavant des centaines de faux positifs ne renvoient désormais plus que les correspondances exactes souhaitées. Cette fonctionnalité était l'une des plus demandées pour une bonne raison : les équipes de développement perdaient beaucoup trop de temps à passer au crible les faux positifs.
Zoekt excelle dans la recherche de correspondances exactes, mais est également optimisé pour les recherches d'expressions régulières. Grâce à des algorithmes sophistiqués, il convertit les motifs regex en requêtes trigrammes efficaces lorsque cela est possible, garantissant ainsi une rapidité constante, même pour les recherches de motifs complexes portant sur plusieurs téraoctets de code.
La recherche exacte de code est puissante et conçue pour gérer de très grands volumes de code tout en offrant des temps de réponse remarquables. Il ne s'agit pas du simple ajout d'une nouvelle fonctionnalité à l'interface utilisateur, mais d'une architecture backend entièrement repensée.
Rien que sur GitLab.com, notre infrastructure de recherche exacte de code indexe et interroge plus de 48 To de données de code, tout en offrant des temps de réponse ultra-rapides. Cette volumétrie couvre des millions de dépôts répartis dans des milliers d'espaces de nommage, tous consultables en seulement quelques millisecondes, soit plus de code que l'ensemble des projets du noyau Linux, d'Android et de Chromium combinés. Et pourtant, la recherche exacte de code peut trouver une ligne spécifique dans l'ensemble du code source en quelques millisecondes seulement.
Parmi nos améliorations techniques, voici quelques innovations clés :
En arrière-plan, la recherche exacte de code repose sur un système distribué comprenant les composants clés suivants :
La recherche exacte de code s'intègre automatiquement au système d'autorisation de GitLab :
Bien que Zoekt soit très performant pour indexer et rechercher du code localement, son architecture de base était conçue à l'origine comme une bibliothèque minimale, destinée à la gestion des fichiers d'index .zoekt, et non comme une base de données distribuée ou un service capable de fonctionner à l'échelle d'une entreprise.
Voici les principaux défis techniques que nous avons dû surmonter pour l'adapter pleinement à l'écosystème GitLab.
Le problème : Zoekt a été conçu pour fonctionner avec des fichiers d'index locaux, et non pour être distribué sur plusieurs nœuds desservant de nombreux utilisateurs simultanés. Notre solution : nous avons développé une couche d'orchestration complète qui :
Le problème : comment gérer efficacement des téraoctets de données d'indexation répartis sur plusieurs nœuds tout en garantissant des mises à jour rapides ? Notre solution : nous avons déployé les fonctionnalités suivantes :
gitlab-zoekt peut fonctionner à la fois en mode indexeur et en mode serveur web.Le problème : Zoekt n'avait aucune notion du système d'autorisation complexe de GitLab. Les utilisateurs ne doivent voir que les résultats des projets auxquels ils ont accès. Notre solution : nous avons intégré un filtrage des autorisations natif directement dans le flux de recherche :
Le problème : gérer un système de recherche distribué ne devrait pas nécessiter une équipe dédiée. Notre solution :
Le déploiement d'un tout nouveau backend de recherche auprès de millions d'utilisateurs a nécessité une planification minutieuse. Voici comment nous avons limité l'impact sur les clients tout en garantissant la fiabilité :
Nous avons commencé par activer la recherche exacte de code uniquement pour le groupe gitlab-org, constitué de nos propres dépôts internes.
Cette étape nous a permis de :
Avant d'étendre la fonctionnalité, nous nous sommes assurés que le système pouvait gérer la charge à l'échelle de GitLab.com. Pour cela, nous avons dû :
Nous avons progressivement ouvert l'accès à la recherche exacte de code aux clients désireux de l'essayer, afin de :
gitlab-org/gitlab sont désormais indexés en environ 10 secondes)Aujourd'hui, plus de 99 % des groupes disposant des licences Premium et Ultimate sur GitLab.com ont accès à la recherche exacte de code. Les utilisateurs peuvent :
Vous souhaitez en savoir plus sur l'architecture et la mise en œuvre de la recherche exacte de code ? Consultez notre document de conception complet, qui offre une description technique détaillée de ce système de recherche distribué.
La prise en main de la recherche exacte de code est simple, car cette fonctionnalité est déjà activée par défaut pour les groupes Premium et Ultimate sur GitLab.com (accessibles aujourd'hui à plus de 99 % des groupes éligibles).
Que vous utilisiez le mode de recherche par correspondance exacte ou par expression régulière, vous pouvez affiner votre recherche avec divers modificateurs :
| Exemple de requête | Fonction | | ------------------ | ---------------------------------------------------------------------- | | file:js | Recherche uniquement dans les fichiers dont le nom contient « js » | | foo -bar | Recherche « foo », mais exclut les résultats contenant « bar » | | lang:ruby | Recherche uniquement dans les fichiers Ruby | | sym:process | Recherche « process » dans les symboles (méthodes, classes, variables) |
Conseil : pour optimiser votre recherche, commencez par une requête précise, puis élargissez-la si besoin. L'utilisation des filtres
file:etlang:augmente considérablement la pertinence des résultats.
Combinez plusieurs filtres pour gagner en précision :
is_expected file:rb -file:spec
Cette requête recherche « is_expected » dans les fichiers Ruby dont le nom ne contient pas « spec ». Tirez parti des expressions régulières pour obtenir des motifs puissants :
token.*=.*[\"']
Consultez cette recherche effectuée dans le dépôt GitLab Zoekt. Elle permet de trouver des mots de passe codés en dur qui, s'ils ne sont pas détectés, peuvent constituer un risque de sécurité. Pour approfondir la syntaxe, consultez la documentation dédiée à la recherche exacte de code.
La recherche exacte de code est actuellement disponible en version bêta pour les utilisateurs de GitLab.com disposant de licences Premium et Ultimate :
Pour les instances Self-Managed, nous proposons plusieurs méthodes de déploiement :
gitlab-zoekt.Bien que la recherche exacte de code soit déjà performante, nous l'améliorons continuellement avec :
Avec la recherche exacte de code, GitLab repense en profondeur la manière dont le code est exploré, en fournissant des correspondances exactes, une prise en charge avancée des expressions régulières et des résultats contextuels. Cette nouvelle fonctionnalité résout les aspects les plus frustrants de la recherche de code :