Skip to main content

PrĂ©paration de votre code pour l’analyse CodeQL

Vous pouvez créer une base de données CodeQL contenant les données nécessaires pour analyser votre code.

Qui peut utiliser cette fonctionnalité ?

Utilisateurs disposant d’un accĂšs en lecture Ă  un rĂ©fĂ©rentiel

CodeQL est disponible pour les types de rĂ©fĂ©rentiels suivants :

À propos de la prĂ©paration du code pour l’analyse

Avant d’analyser votre code avec CodeQL, vous devez crĂ©er une base de donnĂ©es CodeQL contenant toutes les donnĂ©es nĂ©cessaires pour exĂ©cuter des requĂȘtes sur votre code. Vous pouvez crĂ©er vous-mĂȘme des bases de donnĂ©es CodeQL en utilisant CodeQL CLI.

L’analyse CodeQL repose sur l’extraction de donnĂ©es relationnelles de votre code et sur leur utilisation pour crĂ©er une base de donnĂ©es CodeQL. Les bases de donnĂ©es CodeQL contiennent toutes les informations importantes relatives Ă  un codebase, qui peuvent ĂȘtre analysĂ©es en exĂ©cutant des requĂȘtes CodeQL dessus.

Avant de gĂ©nĂ©rer une base de donnĂ©es CodeQL, vous devez :

  1. Installer et configurer CodeQL CLI Pour plus d’informations, consultez « Configuration de CodeQL CLI Â».
  2. Extrayez le code Ă  analyser :
    • Pour une branche, extrayez la tĂȘte (dĂ©but) de la branche Ă  analyser.
    • Pour une demande de tirage, extrayez son commit de tĂȘte ou un commit de fusion gĂ©nĂ©rĂ© par GitHub.
  3. Configurez l’environnement pour le codebase, en vĂ©rifiant que toutes les dĂ©pendances sont disponibles.
  4. Pour obtenir les meilleurs résultats avec des langages compilés, recherchez la commande de génération, le cas échéant, pour la codebase. En général, celle-ci est disponible dans un fichier de configuration dans le systÚme CI.

Une fois le codebase prĂȘt, vous pouvez exĂ©cuter codeql database create pour crĂ©er la base de donnĂ©es. Pour plus d’informations, consultez CrĂ©ation de bases de donnĂ©es pour les langages non compilĂ©s et CrĂ©ation de bases de donnĂ©es pour les langages compilĂ©s.

En cours d’exĂ©cution codeql database create

Les bases de donnĂ©es CodeQL sont créées en exĂ©cutant la commande suivante Ă  partir de la racine d’extraction de votre projet :

codeql database create <database> --language=<language-identifier>

Vous devez spĂ©cifier :

  • <database> : chemin de la nouvelle base de donnĂ©es Ă  crĂ©er. Ce rĂ©pertoire est créé lorsque vous exĂ©cutez la commande. Vous ne pouvez pas spĂ©cifier de rĂ©pertoire existant.

  • --language : identificateur du langage pour lequel crĂ©er une base de donnĂ©es. UtilisĂ©e avec --db-cluster, l’option accepte une liste sĂ©parĂ©e par des virgules ou peut ĂȘtre spĂ©cifiĂ©e plusieurs fois. CodeQL prend en charge la crĂ©ation de bases de donnĂ©es pour les langages suivants :

    LangueIdentificateurIdentificateurs alternatifs facultatifs (le cas échéant)
    C/C++c-cppc ou cpp
    C#csharp
    Gogo
    Java/Kotlinjava-kotlinjava ou kotlin
    JavaScript/TypeScriptjavascript-typescriptjavascript ou typescript
    Pythonpython
    Rubyruby
    Swiftswift
    Workflows GitHub Actionsactions

    Remarque

    Si vous spĂ©cifiez l'un des identificateurs alternatifs, cela Ă©quivaut Ă  l'utilisation de l'identificateur de langue standard. Par exemple, la spĂ©cification javascript au lieu de javascript-typescript n’exclut pas l’analyse du code TypeScript. Vous pouvez le faire dans un flux de travail d’installation avancĂ© avec l’option --paths-ignore. Pour plus d’informations, consultez « Personnalisation de votre configuration avancĂ©e pour l’analyse de code Â».

Si votre codebase dispose d'une commande ou d'un script de construction qui invoque le processus de construction, nous vous recommandons de le spĂ©cifier Ă©galement :

   codeql database create <database> --command <build> \
         --language=<language-identifier>

Options de création de bases de données

Vous pouvez spĂ©cifier des options supplĂ©mentaires en fonction de l’emplacement de votre fichier source, si le code doit ĂȘtre compilĂ© et si vous voulez crĂ©er des bases de donnĂ©es CodeQL pour plusieurs langages.

OptionObligatoireUsage
<database>SpĂ©cifiez le nom et l’emplacement d’un rĂ©pertoire Ă  crĂ©er pour la base de donnĂ©es CodeQL. La commande Ă©choue si vous essayez de remplacer un rĂ©pertoire existant. Si vous spĂ©cifiez aussi --db-cluster, il s’agit du rĂ©pertoire parent et un sous-rĂ©pertoire est créé pour chaque langage analysĂ©.
--languageSpĂ©cifiez l’identificateur de la langue pour laquelle vous souhaitez crĂ©er une base de donnĂ©es, l’une des suivantes : c-cpp, csharp, go, java-kotlin, javascript-typescript, python, ruby et swift. UtilisĂ©e avec --db-cluster, l’option accepte une liste sĂ©parĂ©e par des virgules ou peut ĂȘtre spĂ©cifiĂ©e plusieurs fois.
--commandRecommandé. Utilisez cette option pour spécifier la commande de génération ou le script qui appelle le processus de génération pour le codebase. Les commandes sont exécutées à partir du dossier actuel ou de --source-root si ce dernier est défini. Non nécessaire pour une analyse Python et JavaScript/TypeScript.
--build-modeRecommandĂ©. Utilisez pour C/C++, C# et Java quand vous ne fournissez pas de --command pour spĂ©cifier s’il faut crĂ©er une base de donnĂ©es CodeQL sans gĂ©nĂ©ration (none) ou en tentant de dĂ©tecter automatiquement une commande de gĂ©nĂ©ration (autobuild). Par dĂ©faut, la dĂ©tection de gĂ©nĂ©ration automatique est utilisĂ©e. Pour obtenir une comparaison des modes de build, consultez Modes de build CodeQL.
--db-clusterUtilisez cette option dans les codebases en plusieurs langages pour générer une seule base de données pour chaque langage spécifié par --language.
--no-run-unnecessary-buildsRecommandĂ©. Utilisez cette option pour supprimer la commande de gĂ©nĂ©ration pour les langages oĂč l’CodeQL CLI n’a pas besoin de superviser la gĂ©nĂ©ration (par exemple, Python et JavaScript/TypeScript).
--source-rootUtilisez cette option si vous exĂ©cutez l’interface CLI en dehors de la racine d’extraction du dĂ©pĂŽt. Par dĂ©faut, la commande database create suppose que le rĂ©pertoire actuel est le rĂ©pertoire racine des fichiers sources. Utilisez cette option pour spĂ©cifier un autre emplacement.
--codescanning-configAvancĂ©. À utiliser si vous avez un fichier de configuration qui spĂ©cifie comment crĂ©er les bases de donnĂ©es CodeQL et quelles requĂȘtes exĂ©cuter dans des Ă©tapes ultĂ©rieures. Pour plus d’informations, consultez « Personnalisation de votre configuration avancĂ©e pour l’analyse de code Â» et « database create Â».

Vous pouvez spĂ©cifier des options d’extracteur pour personnaliser le comportement des extracteurs qui crĂ©ent les bases de donnĂ©es CodeQL. Pour plus d’informations, consultez « Options d’extracteur Â».

Pour des détails complets sur toutes les options que vous pouvez utiliser lors de la création de bases de données, consultez database create.

Exemple avec un langage unique

Cet exemple crĂ©e une base de donnĂ©es CodeQL unique pour le rĂ©fĂ©rentiel extrait Ă  l'emplacement /checkouts/example-repo. Il utilise l’extracteur JavaScript pour crĂ©er une reprĂ©sentation hiĂ©rarchique du code JavaScript et TypeScript dans le dĂ©pĂŽt. La base de donnĂ©es obtenue est stockĂ©e dans /codeql-dbs/example-repo.

$ codeql database create /codeql-dbs/example-repo --language=javascript-typescript \
    --source-root /checkouts/example-repo

> Initializing database at /codeql-dbs/example-repo.
> Running command [/codeql-home/codeql/javascript/tools/autobuild.cmd]
    in /checkouts/example-repo.
> [build-stdout] Single-threaded extraction.
> [build-stdout] Extracting
...
> Finalizing database at /codeql-dbs/example-repo.
> Successfully created database at /codeql-dbs/example-repo.

Exemple avec plusieurs langages

Cet exemple crĂ©e deux bases de donnĂ©es CodeQL pour le dĂ©pĂŽt extrait Ă  l’emplacement /checkouts/example-repo-multi. Il utilise :

  • --db-cluster pour demander l’analyse de plusieurs langages.
  • --language pour spĂ©cifier les langages pour lesquels crĂ©er des bases de donnĂ©es.
  • --command pour indiquer Ă  l’outil la commande de gĂ©nĂ©ration pour le codebase, ici make.
  • --no-run-unnecessary-builds pour indiquer Ă  l’outil d’ignorer la commande de gĂ©nĂ©ration pour les langages oĂč elle n’est pas nĂ©cessaire (comme Python).

Les bases de données obtenues sont stockées dans les sous-répertoires python et cpp de /codeql-dbs/example-repo-multi.

$ codeql database create /codeql-dbs/example-repo-multi \
    --db-cluster --language python,c-cpp \
    --command make --no-run-unnecessary-builds \
    --source-root /checkouts/example-repo-multi
Initializing databases at /codeql-dbs/example-repo-multi.
Running build command: [make]
[build-stdout] Calling python3 /codeql-bundle/codeql/python/tools/get_venv_lib.py
[build-stdout] Calling python3 -S /codeql-bundle/codeql/python/tools/python_tracer.py -v -z all -c /codeql-dbs/example-repo-multi/python/working/trap_cache -p ERROR: 'pip' not installed.
[build-stdout] /usr/local/lib/python3.6/dist-packages -R /checkouts/example-repo-multi
[build-stdout] [INFO] Python version 3.6.9
[build-stdout] [INFO] Python extractor version 5.16
[build-stdout] [INFO] [2] Extracted file /checkouts/example-repo-multi/hello.py in 5ms
[build-stdout] [INFO] Processed 1 modules in 0.15s
[build-stdout] <output from calling 'make' to build the C/C++ code>
Finalizing databases at /codeql-dbs/example-repo-multi.
Successfully created databases at /codeql-dbs/example-repo-multi.
$

Progression et résultats

Des erreurs sont signalĂ©es en cas de problĂšmes avec les options que vous avez spĂ©cifiĂ©es. Pour les langages interprĂ©tĂ©s et lorsque vous spĂ©cifiez --build-mode none pour C/C++, C# et Java, la progression de l’extraction s’affiche dans la console. Pour chaque fichier source, la console indique si l’extraction a rĂ©ussi ou si elle a Ă©chouĂ©. Lors de la gĂ©nĂ©ration d’un langage compilĂ©, la console affiche le produit du systĂšme de gĂ©nĂ©ration.

Une fois la base de donnĂ©es créée, vous trouverez un nouveau rĂ©pertoire dans le chemin spĂ©cifiĂ© dans la commande. Si vous avez utilisĂ© l’option --db-cluster pour crĂ©er plusieurs bases de donnĂ©es, un sous-rĂ©pertoire est créé pour chaque langage. Chaque rĂ©pertoire de base de donnĂ©es CodeQL contient un certain nombre de sous-rĂ©pertoires, notamment les donnĂ©es relationnelles (requises pour l’analyse) et une archive source (une copie des fichiers sources créée au moment de la crĂ©ation de la base de donnĂ©es) qui est utilisĂ©e pour afficher les rĂ©sultats de l’analyse.

Création de bases de données pour les langages non compilés

CodeQL CLI comprend des extracteurs pour crĂ©er des bases de donnĂ©es pour les langages non compilĂ©s, en particulier JavaScript (et TypeScript), Python et Ruby. Ces extracteurs sont appelĂ©s automatiquement lorsque vous spĂ©cifiez JavaScript, Python ou Ruby comme option --language lors de l’exĂ©cution de database create. Lorsque vous crĂ©ez des bases de donnĂ©es pour ces langages, vous devez vous assurer que toutes les dĂ©pendances supplĂ©mentaires sont disponibles.

Remarque

Lorsque vous exĂ©cutez database create pour JavaScript, TypeScript, Python et Ruby, vous ne devez pas spĂ©cifier d’option--command. Sinon, cela remplace l’appel de l’extracteur normal, ce qui crĂ©e une base de donnĂ©es vide. Si vous crĂ©ez des bases de donnĂ©es pour plusieurs langages et que l’un d’eux est un langage compilĂ©, utilisez l’option --no-run-unnecessary-builds pour ignorer la commande pour les langages qui n’ont pas besoin d’ĂȘtre compilĂ©s.

JavaScript et TypeScript

La crĂ©ation de bases de donnĂ©es pour JavaScript ne nĂ©cessite aucune dĂ©pendance supplĂ©mentaire. Toutefois, si le projet inclut des fichiers TypeScript, Node.js 14 ou une version plus rĂ©cente doit ĂȘtre installĂ© et disponible sur le serveur PATH comme node. Dans la ligne de commande, vous pouvez spĂ©cifier --language=javascript-typescript pour extraire les fichiers JavaScript et TypeScript :

codeql database create --language=javascript-typescript --source-root <folder-to-extract> <output-folder>/javascript-database

Ici, nous avons spĂ©cifiĂ© un chemin --source-root, qui est l’emplacement oĂč la crĂ©ation de la base de donnĂ©es est exĂ©cutĂ©e, mais qui n’est pas nĂ©cessairement la racine d’extraction du codebase.

Par défaut, les fichiers dans les répertoires node_modules et bower_components ne sont pas extraits.

Python

Lorsque vous crĂ©ez des bases de donnĂ©es pour Python, vous devez vous assurer que :

  • Python 3 est installĂ© et disponible pour l’extracteur CodeQL.
  • La version de Python utilisĂ©e par votre code est installĂ©e.

Dans la ligne de commande, vous devez spĂ©cifier --language=python. Par exemple :

codeql database create --language=python <output-folder>/python-database

Cette opĂ©ration exĂ©cute la sous-commande database create Ă  partir de la racine d’extraction du code, gĂ©nĂ©rant une nouvelle base de donnĂ©es Python dans <output-folder>/python-database.

Ruby

La crĂ©ation de bases de donnĂ©es pour Ruby ne demande aucune dĂ©pendance supplĂ©mentaire. Dans la ligne de commande, vous devez spĂ©cifier --language=ruby. Par exemple :

codeql database create --language=ruby --source-root <folder-to-extract> <output-folder>/ruby-database

Ici, nous avons spĂ©cifiĂ© un chemin --source-root, qui est l’emplacement oĂč la crĂ©ation de la base de donnĂ©es est exĂ©cutĂ©e, mais qui n’est pas nĂ©cessairement la racine d’extraction du codebase.

Création de bases de données pour les langages compilés

Pour la plupart des langages compilĂ©s, CodeQL doit appeler le systĂšme de build requis pour gĂ©nĂ©rer une base de donnĂ©es. Par consĂ©quent, la mĂ©thode de build doit ĂȘtre disponible pour l’interface CLI. Cette approche crĂ©e des bases de donnĂ©es qui incluent du code gĂ©nĂ©rĂ©. CodeQL dispose de deux mĂ©thodes pour gĂ©nĂ©rer des codebases :

En outre, pour C/C++, C# et Java, il existe une option permettant de gĂ©nĂ©rer une base de donnĂ©es sans gĂ©nĂ©rer le code. Cela est particuliĂšrement utile lorsque vous souhaitez activer code scanning pour de nombreux rĂ©fĂ©rentiels. Pour plus d’informations, consultez Modes de gĂ©nĂ©ration CodeQL.

Détection automatique du systÚme de génération

L’CodeQL CLI comprend des gĂ©nĂ©rateurs automatiques pour le code C/C++, C#, Go, Java, Kotlin, Rust (prĂ©version publique), et Swift. Les gĂ©nĂ©rateurs automatiques CodeQL vous permettent de gĂ©nĂ©rer des projets pour les langages compilĂ©s sans spĂ©cifier de commandes de build. Quand un gĂ©nĂ©rateur automatique est appelĂ©, CodeQL examine la source pour confirmer la prĂ©sence d’un systĂšme de build et tente d’exĂ©cuter le jeu optimal de commandes requises pour extraire une base de donnĂ©es. Pour plus d’informations, consultez « Analyse du code CodeQL pour les langages compilĂ©s Â».

Un gĂ©nĂ©rateur automatique est appelĂ© automatiquement lorsque vous exĂ©cutez codeql database create pour un langage compilĂ© si vous n'incluez pas une option --command ni ne dĂ©finissez --build-mode none. Par exemple, pour une codebase Swift, vous pouvez simplement exĂ©cuter :

codeql database create --language=swift <output-folder>/swift-database

Si un codebase utilise un systĂšme de build standard, s’appuyer sur un gĂ©nĂ©rateur automatique est souvent le moyen le plus simple de crĂ©er une base de donnĂ©es. Pour les sources qui demandent des Ă©tapes de gĂ©nĂ©ration non standard, vous devrez peut-ĂȘtre dĂ©finir explicitement chaque Ă©tape dans la ligne de commande.

Remarque

  • Si vous crĂ©ez une base de donnĂ©es Go, installez la chaĂźne d’outils Go (version 1.11 ou ultĂ©rieure) et, s’il existe des dĂ©pendances, le gestionnaire de dĂ©pendances appropriĂ© (par exemple dep).
  • Le gĂ©nĂ©rateur automatique Go tente de dĂ©tecter automatiquement le code Ă©crit en Go dans un dĂ©pĂŽt et exĂ©cute uniquement les scripts de build dans une tentative de rĂ©cupĂ©ration des dĂ©pendances. Pour forcer CodeQL Ă  limiter l’extraction aux fichiers compilĂ©s par votre script de build, dĂ©finissez la variable d’environnement CODEQL_EXTRACTOR_GO_BUILD_TRACING=on ou utilisez l’option --command pour spĂ©cifier une commande de build.

Spécification des commandes de build

Les exemples suivants sont conçus pour vous donner une idée de quelques commandes de build que vous pouvez spécifier pour les langages compilés.

Remarque

L’option --command accepte un seul argument. Si vous devez utiliser plusieurs commandes, spĂ©cifiez --command plusieurs fois. Si vous devez passer des sous-commandes et des options, l’argument entier doit ĂȘtre entre guillemets pour ĂȘtre interprĂ©tĂ© correctement.

  • Projet C/C++ gĂ©nĂ©rĂ© avec make :

    # Disable parallel execution via `-j1` or other techniques: https://www.gnu.org/software/make/manual/make.html#Parallel-Execution
    codeql database create cpp-database --language=c-cpp --command=make
    
  • Projet C# gĂ©nĂ©rĂ© avec dotnet build :

    Il est judicieux d’ajouter /t:rebuild pour vous assurer que tout le code sera gĂ©nĂ©rĂ© ou d’effectuer un dotnet clean avant (le code qui n’est pas gĂ©nĂ©rĂ© ne sera pas inclus dans la base de donnĂ©es CodeQL) :

    codeql database create csharp-database --language=csharp --command='dotnet build /t:rebuild'
    
  • Projet Go gĂ©nĂ©rĂ© avec la variable d’environnement CODEQL_EXTRACTOR_GO_BUILD_TRACING=on :

    CODEQL_EXTRACTOR_GO_BUILD_TRACING=on codeql database create go-database --language=go
    
  • Projet Go gĂ©nĂ©rĂ© avec un script de build personnalisĂ© :

    codeql database create go-database --language=go --command='./scripts/build.sh'
    
  • Projet Java gĂ©nĂ©rĂ© avec Gradle :

    # Use `--no-daemon` because a build delegated to an existing daemon cannot be detected by CodeQL.
    # To ensure isolated builds without caching, add `--no-build-cache` on persistent machines.
    codeql database create java-database --language=java-kotlin --command='gradle --no-daemon clean test'
    
  • Projet Java gĂ©nĂ©rĂ© avec Maven :

    codeql database create java-database --language=java-kotlin --command='mvn clean install'
    
  • Projet Java gĂ©nĂ©rĂ© avec Ant :

    codeql database create java-database --language=java-kotlin --command='ant -f build.xml'
    
  • Projet Swift créé Ă  partir d’un projet ou d’un espace de travail Xcode. Par dĂ©faut, la plus grande cible Swift est gĂ©nĂ©rĂ©e :

    Il est conseillé de s'assurer que le projet est dans un état propre et qu'il n'y a pas d'artefacts de génération disponibles.

    xcodebuild clean -all
    codeql database create -l swift swift-database
    
  • Projet Swift gĂ©nĂ©rĂ© avec swift build :

    codeql database create -l swift -c "swift build" swift-database
    
  • Projet Swift gĂ©nĂ©rĂ© avec xcodebuild :

    codeql database create -l swift -c "xcodebuild build -target your-target" swift-database
    

    Vous pouvez passer les options archive et test Ă  xcodebuild. Toutefois, la commande standard xcodebuild est recommandĂ©e, car elle doit ĂȘtre la plus rapide et doit ĂȘtre tout ce que CodeQL nĂ©cessite pour une analyse rĂ©ussie.

  • Projet Swift gĂ©nĂ©rĂ© avec un script de build personnalisĂ© :

    codeql database create -l swift -c "./scripts/build.sh" swift-database
    
  • Projet gĂ©nĂ©rĂ© avec Bazel :

    # Navigate to the Bazel workspace.
    
    # Before building, remove cached objects
    # and stop all running Bazel server processes.
    bazel clean --expunge
    
    # Build using the following Bazel flags, to help CodeQL detect the build:
    # `--spawn_strategy=local`: build locally, instead of using a distributed build
    # `--nouse_action_cache`: turn off build caching, which might prevent recompilation of source code
    # `--noremote_accept_cached`, `--noremote_upload_local_results`: avoid using a remote cache
    # `--disk_cache=`: avoid using a disk cache. Note that a disk cache is no longer considered a remote cache as of Bazel 6.
    codeql database create new-database --language=<language> \
    --command='bazel build --spawn_strategy=local --nouse_action_cache --noremote_accept_cached --noremote_upload_local_results --disk_cache= //path/to/package:target'
    
    # After building, stop all running Bazel server processes.
    # This ensures future build commands start in a clean Bazel server process
    # without CodeQL attached.
    bazel shutdown
    
  • Projet gĂ©nĂ©rĂ© avec un script de build personnalisĂ© :

    codeql database create new-database --language=<language> --command='./scripts/build.sh'
    

Cette commande exécute un script personnalisé qui contient toutes les commandes requises pour générer le projet.

Utilisation du traçage de build indirect

Si les gĂ©nĂ©rateurs automatiques CodeQL CLI pour les langages compilĂ©s ne fonctionnent pas avec votre workflow CI et que vous ne pouvez pas wrapper les appels de commandes de build avec codeql database trace-command, vous pouvez utiliser le traçage de build indirect pour crĂ©er une base de donnĂ©es CodeQL. Pour utiliser le traçage de build indirect, votre systĂšme CI doit ĂȘtre en mesure de dĂ©finir des variables d’environnement personnalisĂ©es pour chaque action de gĂ©nĂ©ration.

Pour crĂ©er une base de donnĂ©es CodeQL avec le traçage de build indirect, exĂ©cutez la commande suivante Ă  partir de la racine d’extraction de votre projet :

codeql database init ... --begin-tracing <database>

Vous devez spĂ©cifier :

  • <database> : chemin de la nouvelle base de donnĂ©es Ă  crĂ©er. Ce rĂ©pertoire est créé lorsque vous exĂ©cutez la commande. Vous ne pouvez pas spĂ©cifier de rĂ©pertoire existant.
  • --begin-tracing : crĂ©e des scripts qui peuvent ĂȘtre utilisĂ©s pour configurer un environnement dans lequel les commandes de build seront tracĂ©es.

Vous pouvez spĂ©cifier d’autres options pour la commande codeql database init comme d’habitude.

Remarque

Si la compilation s'effectue sous Windows, vous devez définir l'option --trace-process-level <number> ou --trace-process-name <parent process name> de maniÚre à ce qu'elle pointe vers un processus CI parent qui observera toutes les étapes de la compilation pour le code analysé.

La commande codeql database init gĂ©nĂšre un message :

Created skeleton <database>. This in-progress database is ready to be populated by an extractor. In order to initialise tracing, some environment variables need to be set in the shell your build will run in. A number of scripts to do this have been created in <database>/temp/tracingEnvironment. Please run one of these scripts before invoking your build command.

Based on your operating system, we recommend you run: ...

La commande codeql database init crĂ©e <database>/temp/tracingEnvironment avec des fichiers qui contiennent des variables d’environnement et des valeurs qui permettent Ă  CodeQL de tracer une sĂ©quence d’étapes de gĂ©nĂ©ration. Ces fichiers sont appelĂ©s start-tracing.{json,sh,bat,ps1}. Utilisez l’un de ces fichiers avec le mĂ©canisme de votre systĂšme CI afin de dĂ©finir les variables d’environnement pour les Ă©tapes futures. Vous pouvez :

  • Lisez le fichier JSON, traitez-le et affichez les variables d’environnement au format attendu par votre systĂšme CI. Par exemple, Azure DevOps attend echo "##vso[task.setvariable variable=NAME]VALUE".
  • Ou, si votre systĂšme CI conserve l’environnement, sourcez le script start-tracing appropriĂ© pour dĂ©finir les variables CodeQL dans l’environnement shell du systĂšme CI.

GĂ©nĂ©rez votre code, et annulez si vous voulez les variables d’environnement Ă  l’aide d’un script end-tracing.{json,sh,bat,ps1} du rĂ©pertoire oĂč les scripts start-tracing sont stockĂ©s, puis exĂ©cutez la commande codeql database finalize <database>.

Une fois que vous avez créé une base de donnĂ©es CodeQL Ă  l’aide du traçage de build indirect, vous pouvez l’utiliser comme n’importe quelle autre base de donnĂ©es CodeQL. Par exemple, analysez la base de donnĂ©es et chargez les rĂ©sultats dans GitHub si vous utilisez l’analyse du code.

Exemple de crĂ©ation d’une base de donnĂ©es CodeQL Ă  l’aide du traçage de build indirect

Remarque

Si vous utilisez des pipelines Azure DevOps, le moyen le plus simple de créer une base de données CodeQL consiste à utiliser GitHub Advanced Security for Azure DevOps. Pour obtenir de la documentation, consultez Configurer GitHub Advanced Security for Azure DevOps dans Microsoft Learn.

L’exemple suivant montre comment vous pourriez utiliser le traçage de build indirect dans un pipeline Azure DevOps pour crĂ©er une base de donnĂ©es CodeQL :

steps:
    # Download the CodeQL CLI and query packs...
    # Check out the repository ...

    # Run any pre-build tasks, for example, restore NuGet dependencies...

    # Initialize the CodeQL database.
    # In this example, the CodeQL CLI has been downloaded and placed on the PATH.
    - task: CmdLine@1
       displayName: Initialize CodeQL database
      inputs:
          # Assumes the source code is checked out to the current working directory.
          # Creates a database at `<current working directory>/db`.
          # Running on Windows, so specifies a trace process level.
          script: "codeql database init --language csharp --trace-process-name Agent.Worker.exe --source-root . --begin-tracing db"

    # Read the generated environment variables and values,
    # and set them so they are available for subsequent commands
    # in the build pipeline. This is done in PowerShell in this example.
    - task: PowerShell@1
       displayName: Set CodeQL environment variables
       inputs:
          targetType: inline
          script: >
             $json = Get-Content $(System.DefaultWorkingDirectory)/db/temp/tracingEnvironment/start-tracing.json | ConvertFrom-Json
             $json.PSObject.Properties | ForEach-Object {
                 $template = "##vso[task.setvariable variable="
                 $template += $_.Name
                 $template += "]"
                 $template += $_.Value
                 echo "$template"
             }

    # Execute the pre-defined build step. Note the `msbuildArgs` variable.
    - task: VSBuild@1
        inputs:
          solution: '**/*.sln'
          msbuildArgs: /p:OutDir=$(Build.ArtifactStagingDirectory)
          platform: Any CPU
          configuration: Release
          # Execute a clean build, in order to remove any existing build artifacts prior to the build.
          clean: True
       displayName: Visual Studio Build

    # Read and set the generated environment variables to end build tracing. This is done in PowerShell in this example.
    - task: PowerShell@1
       displayName: Clear CodeQL environment variables
       inputs:
          targetType: inline
          script: >
             $json = Get-Content $(System.DefaultWorkingDirectory)/db/temp/tracingEnvironment/end-tracing.json | ConvertFrom-Json
             $json.PSObject.Properties | ForEach-Object {
                 $template = "##vso[task.setvariable variable="
                 $template += $_.Name
                 $template += "]"
                 $template += $_.Value
                 echo "$template"
             }

    - task: CmdLine@2
       displayName: Finalize CodeQL database
       inputs:
          script: 'codeql database finalize db'

    # Other tasks go here, for example:
    # `codeql database analyze`
    # then `codeql github upload-results` ...

Étapes suivantes