Skip to main content

Publication et utilisation de packs CodeQL

Vous pouvez publier vos propres packs CodeQL et utiliser des packs publiĂ©s par d’autres personnes.

Qui peut utiliser cette fonctionnalité ?

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

Authentification auprĂšs des GitHub Container registries

Vous pouvez publier des packs et télécharger des packs privés en vous authentifiant auprÚs du GitHub Container registry approprié.

Vous pouvez vous authentifier auprĂšs de Container registry de deux maniĂšres :

  1. Passer l’option --github-auth-stdin Ă  CodeQL CLI, puis fournir un jeton GitHub Apps ou un personal access token via une entrĂ©e standard.
  2. DĂ©finir la variable d’environnement GITHUB_TOKEN sur un jeton GitHub Apps ou un personal access token.

Configuration du fichier qlpack.yml avant la publication

Vous pouvez vĂ©rifier et modifier les dĂ©tails de configuration de votre pack CodeQL avant la publication. Ouvrez le fichier qlpack.yml dans l’éditeur de texte de votre choix.

library: # set to true if the pack is a library. Set to false or omit for a query pack
name: <scope>/<pack>
version: <x.x.x>
description: <Description to publish with the package>
defaultSuite: # optional, one or more queries in the pack to run by default
    - query: <relative-path>/query-file>.ql
defaultSuiteFile: default-queries.qls # optional, a pointer to a query-suite in this pack
license: # optional, the license under which the pack is published
dependencies: # map from CodeQL pack name to version range
  • name: doit avoir le format <scope>/<pack>, oĂč <scope> est l’organisation GitHub dans laquelle vous allez publier et <pack> est le nom du pack.

  • Un maximum d’une defaultSuite ou d’un defaultSuiteFile est autorisĂ©. Il existe deux façons diffĂ©rentes de dĂ©finir une suite de requĂȘtes par dĂ©faut Ă  exĂ©cuter : la premiĂšre en spĂ©cifiant des requĂȘtes directement dans le fichier qlpack.yml et la seconde en spĂ©cifiant une suite de requĂȘtes dans le pack.

En cours d’exĂ©cution codeql pack publish

Quand vous ĂȘtes prĂȘt Ă  publier un pack dans GitHub Container registry, vous pouvez exĂ©cuter la commande suivante Ă  la racine du rĂ©pertoire du pack :

codeql pack publish

Le package publiĂ© s’affiche dans la section des packages de l’organisation GitHub spĂ©cifiĂ©e par l’étendue dans le fichier qlpack.yml.

Remarque

Si vous publiez des packs de modĂšles sur les GitHub Container registry afin d’étendre la couverture Ă  tous les rĂ©fĂ©rentiels d’une organisation dans le cadre d’une configuration d’installation par dĂ©faut, vous devez vous assurer que les rĂ©fĂ©rentiels exĂ©cutant l’analyse du code peuvent accĂ©der Ă  ces packs de modĂšles. Pour plus d’informations, consultez « Modification de la configuration d’installation par dĂ©faut Â» et « Configuration du contrĂŽle d’accĂšs et de la visibilitĂ© d’un package Â».

En cours d’exĂ©cution codeql pack download <scope>/<pack>

Pour exĂ©cuter un pack créé par quelqu’un d’autre, vous devez d’abord le tĂ©lĂ©charger en exĂ©cutant la commande suivante :

codeql pack download <scope>/<pack>@x.x.x
  • <scope> : nom de l’organisation GitHub Ă  partir de laquelle vous allez tĂ©lĂ©charger.
  • <pack> : nom du pack que vous voulez tĂ©lĂ©charger.
  • @x.x.x : numĂ©ro de version facultatif. S’il est omis, c’est la derniĂšre version qui est tĂ©lĂ©chargĂ©e.

Cette commande accepte des arguments pour plusieurs packs.

Si vous Ă©crivez des scripts qui spĂ©cifient un numĂ©ro de version particulier d’un pack de requĂȘtes Ă  tĂ©lĂ©charger, gardez Ă  l’esprit que quand vous mettez Ă  jour votre version de CodeQL vers une version plus rĂ©cente, il peut aussi ĂȘtre nĂ©cessaire de passer Ă  une version plus rĂ©cente du pack de requĂȘtes. Les versions plus rĂ©centes de CodeQL peuvent prĂ©senter des performances dĂ©gradĂ©es quand elles sont utilisĂ©es avec des packs de requĂȘtes qui ont Ă©tĂ© Ă©pinglĂ©s Ă  une version trĂšs ancienne. Pour plus d’informations, consultez « Ă€ propos de la compatibilitĂ© des packs CodeQL Â».

Utilisation d’un pack CodeQL pour analyser une base de donnĂ©es CodeQL

Pour analyser une base de donnĂ©es CodeQL avec un pack CodeQL, exĂ©cutez la commande suivante :

codeql database analyze <database> <scope>/<pack>@x.x.x:<path>
  • <database> : base de donnĂ©es CodeQL Ă  analyser.
  • <scope> : nom de l’organisation GitHub sur laquelle le pack est publiĂ©.
  • <pack> : nom du pack que vous utilisez.
  • @x.x.x : numĂ©ro de version facultatif. S’il est omis, c’est la derniĂšre version qui est utilisĂ©e.
  • :<path> : chemin facultatif d’une requĂȘte, d’un rĂ©pertoire ou d’une suite de requĂȘtes. S’il est omis, c’est la suite de requĂȘtes par dĂ©faut du pack qui est utilisĂ©e.

La commande analyze exĂ©cute la suite par dĂ©faut des packs CodeQL spĂ©cifiĂ©s. Vous pouvez spĂ©cifier plusieurs packs CodeQL Ă  utiliser pour analyser une base de donnĂ©es CodeQL. Par exemple :

codeql <database> analyze <scope>/<pack> <scope>/<other-pack>

Remarque

La commande codeql pack download stocke le pack qu’elle tĂ©lĂ©charge Ă  un emplacement interne qui n’est pas destinĂ© Ă  la modification locale. Un comportement inattendu (et difficile Ă  rĂ©soudre) peut se produire si le pack est modifiĂ© aprĂšs le tĂ©lĂ©chargement. Pour plus d’informations sur les packs de personnalisation, consultez CrĂ©ation et utilisation de packs CodeQL.

À propos de la compatibilitĂ© des packs CodeQL

Quand un pack de requĂȘtes est publiĂ©, il inclut des reprĂ©sentations prĂ©compilĂ©es de toutes les requĂȘtes qu’il contient. Ces requĂȘtes prĂ©compilĂ©es s’exĂ©cutent en gĂ©nĂ©ral beaucoup plus vite que le temps nĂ©cessaire pour compiler intĂ©gralement la source QL pendant l’analyse. Cependant, les requĂȘtes prĂ©compilĂ©es dĂ©pendent aussi de certains Ă©lĂ©ments internes de l’évaluateur QL : si la version de CodeQL qui effectue l’analyse est trop diffĂ©rente de la version qui a exĂ©cutĂ© codeql pack publish, il peut donc ĂȘtre nĂ©cessaire de compiler les requĂȘtes Ă  partir de la source au lieu de le faire pendant l’analyse. La recompilation se produit automatiquement et n’affecte pas les rĂ©sultats de l’analyse, mais elle peut nĂ©anmoins la ralentir considĂ©rablement.

On peut gĂ©nĂ©ralement supposer que si un pack est publiĂ© avec une version donnĂ©e de CodeQL, les requĂȘtes prĂ©compilĂ©es qu’il contient peuvent ĂȘtre utilisĂ©es directement par les versions ultĂ©rieures de CodeQL dĂšs lors qu’il n’y a pas plus de 6 mois entre les dates de publication. Nous ferons des efforts raisonnables pour maintenir la compatibilitĂ© des nouvelles versions plus longtemps, mais nous ne pouvons pas le garantir.

On peut Ă©galement supposer qu’un pack publiĂ© par la derniĂšre version publique de CodeQL sera utilisable par la version de CodeQL utilisĂ©e par le code scanning et GitHub Actions, mĂȘme s’il s’agit souvent d’une version lĂ©gĂšrement plus ancienne.

En tant qu’utilisateur d’un pack de requĂȘtes publiĂ©, vous pouvez vĂ©rifier que CodeQL utilise les requĂȘtes prĂ©compilĂ©es qu’il contient en inspectant la sortie du terminal provenant d’une analyse qui utilise le pack de requĂȘtes. S’il contient des lignes ressemblant Ă  ce qui suit, c’est que les requĂȘtes prĂ©compilĂ©es ont Ă©tĂ© utilisĂ©es avec succĂšs :

[42/108] Loaded /long/path/to/query/Filename.qlx.

Cependant, si elles ressemblent plutĂŽt Ă  ce qui suit, c’est que l’utilisation des requĂȘtes prĂ©compilĂ©es a Ă©chouĂ© :

Compiling query plan for /long/path/to/query/Filename.ql.
[42/108 comp 25s] Compiled /long/path/to/query/Filename.ql.

Les rĂ©sultats de l’analyse seront nĂ©anmoins corrects dans ce cas, mais pour obtenir des performances optimales, vous devrez peut-ĂȘtre effectuer une mise Ă  niveau vers une version plus rĂ©cente de CodeQL CLI CLI et/ou du pack de requĂȘtes.

Si vous publiez des packs de requĂȘtes sur le Container registry sur GitHub.com pour que d’autres utilisateurs les utilisent, nous vous recommandons d’utiliser une version rĂ©cente de CodeQL pour exĂ©cuter codeql pack publish, et de publier une nouvelle version de votre pack avec une version mise Ă  jour de CodeQL avant que la version que vous avez utilisĂ©e ne soit plus ancienne de 6 mois. De cette façon, vous pouvez garantir que les utilisateurs de votre pack qui conservent leur CodeQL Ă  jour bĂ©nĂ©ficieront des requĂȘtes prĂ©compilĂ©es dans votre pack.

Si vous publiez des packs de requĂȘtes avec l’intention de les utiliser sur une installation de GitHub Enterprise Server qui utilise ses fichiers binaires CodeQL en bundle, utilisez la mĂȘme version de CodeQL pour exĂ©cuter codeql pack publish. Les versions plus rĂ©centes peuvent produire des requĂȘtes prĂ©compilĂ©es que la version de GitHub Enterprise Server peut ne pas reconnaĂźtre. Votre administrateur GitHub Enterprise Server peut choisir de mettre Ă  niveau pĂ©riodiquement vers une version plus rĂ©cente de CodeQL. Si c’est le cas, suivez leur exemple.

À propos des fichiers qlpack.yml

Durant l’exĂ©cution de commandes liĂ©es aux requĂȘtes, CodeQL recherche d’abord les fichiers qlpack.yml dans les rĂ©pertoires frĂšres du rĂ©pertoire d’installation (et leurs sous-rĂ©pertoires). Ensuite, il recherche dans le cache de package les packs CodeQL qui ont Ă©tĂ© tĂ©lĂ©chargĂ©s. Cela signifie que quand vous dĂ©veloppez des requĂȘtes localement, les packages locaux dans le rĂ©pertoire d’installation remplacent les packages du mĂȘme nom dans le cache de package pour que vous puissiez tester vos modifications locales.

Les mĂ©tadonnĂ©es de chaque fichier qlpack.yml indiquent Ă  CodeQL comment compiler les requĂȘtes dans le pack, les bibliothĂšques dont dĂ©pend le pack et oĂč trouver les dĂ©finitions des suites de requĂȘtes.

Le contenu du pack CodeQL (requĂȘtes ou bibliothĂšques utilisĂ©es dans l’analyse CodeQL) est inclus dans le mĂȘme rĂ©pertoire que qlpack.yml ou dans ses sous-rĂ©pertoires.

Le rĂ©pertoire contenant le fichier qlpack.yml sert de rĂ©pertoire racine pour le contenu du pack CodeQL. Autrement dit, pour tous les fichiers .ql et .qll du pack, CodeQL rĂ©sout toutes les instructions d’importation relatives au rĂ©pertoire contenant le fichier qlpack.yml Ă  la racine du pack.

Propriétés qlpack.yml

Les propriétés suivantes sont prises en charge dans les fichiers qlpack.yml.

name

  • NĂ©cessaire pour tous les packs.

  • DĂ©finit l’étendue du pack, oĂč le pack CodeQL est publiĂ© et le nom du pack dĂ©fini avec des caractĂšres alphanumĂ©riques et des traits d’union. Elle doit ĂȘtre unique, car CodeQL ne peut pas faire la diffĂ©rence entre des packs CodeQL ayant des noms identiques. Utilisez le nom du pack pour spĂ©cifier les requĂȘtes Ă  exĂ©cuter Ă  l’aide de database analyze et pour dĂ©finir des dĂ©pendances entre les packs CodeQL (consultez les exemples ci-dessous). Par exemple :

    name: octo-org/security-queries
    

version

  • NĂ©cessaire pour tous les packs publiĂ©s.

  • DĂ©finit une version sĂ©mantique pour ce pack CodeQL, qui doit respecter la spĂ©cification SemVer v2.0.0. Par exemple :

    version: 0.0.0
    

dataExtensions

  • NĂ©cessaire pour les packs de modĂšles.
  • Prend une liste de modĂšles Glob qui spĂ©cifie l'emplacement des fichiers d'extension de donnĂ©es par rapport Ă  la racine du pack de requĂȘtes ou du pack de bibliothĂšques.

dependencies

  • NĂ©cessaire pour les packs de requĂȘtes et de bibliothĂšques qui dĂ©finissent des dĂ©pendances de package CodeQL sur d’autres packs. Les packs de modĂšles ne peuvent pas dĂ©finir de dĂ©pendances et utilisent extensionTargets Ă  la place.

  • DĂ©finit un mappage entre les rĂ©fĂ©rences de pack et la plage de versions sĂ©mantiques compatible avec ce pack. Prise en charge pour les versions v2.6.0 et ultĂ©rieures de CodeQL CLI. Par exemple :

    dependencies:
      codeql/cpp-all: ^0.0.2
    

    Si vous n’ĂȘtes pas sĂ»r ou que n’importe quelle version peut ĂȘtre utilisĂ©e, vous pouvez utiliser "*", ce qui indique que toute version de cette dĂ©pendance sont compatibles avec ce pack. Dans la pratique, cela se rĂ©sout gĂ©nĂ©ralement en la version publiĂ©e la plus Ă©levĂ©e de la dĂ©pendance.

    Il existe un espace rĂ©servĂ© de version spĂ©cial, ${workspace}, qui indique que ce pack CodeQL dĂ©pend de la version de la dĂ©pendance qui est dans le mĂȘme espace de travail. Pour plus d’informations, consultez « Ă€ propos des espaces de travail CodeQL Â».

defaultSuiteFile

  • NĂ©cessaire pour les packs qui exportent un ensemble de requĂȘtes par dĂ©faut Ă  exĂ©cuter.

  • DĂ©finit le chemin d’accĂšs Ă  un fichier de suites de requĂȘtes par rapport Ă  la racine du package, contenant toutes les requĂȘtes exĂ©cutĂ©es par dĂ©faut lorsque ce pack est passĂ© Ă  la commande codeql database analyze. Prise en charge Ă  partir de la version v2.6.0 de l’interface CLI. Un seul defaultSuiteFile ou defaultSuite peut ĂȘtre dĂ©fini. Par exemple :

    defaultSuiteFile: cpp-code-scanning.qls
    

defaultSuite

  • NĂ©cessaire pour les packs qui exportent un ensemble de requĂȘtes par dĂ©faut Ă  exĂ©cuter.

  • DĂ©finit une suite de requĂȘtes inlined contenant toutes les requĂȘtes exĂ©cutĂ©es par dĂ©faut quand ce pack est transfĂ©rĂ© Ă  la commande codeql database analyze. Prise en charge Ă  partir de la version v2.6.0 de l’interface CLI. Un seul defaultSuiteFile ou defaultSuite peut ĂȘtre dĂ©fini. Par exemple :

    defaultSuite:
      queries: .
      exclude:
        precision: medium
    

extensionTargets

  • NĂ©cessaire pour les packs de modĂšles.
  • DĂ©clare Ă  quels packs de requĂȘtes s'appliquent les extensions du pack de modĂšles. Le pack d'extension injectera ses extensions de donnĂ©es dans chaque pack nommĂ© dans l’ensemble de clĂ©s extensionTargets, si le pack se situe dans la plage de versions spĂ©cifiĂ©e et s'il est utilisĂ© dans l'Ă©valuation.

groups

  • facultatif.

  • DĂ©finit des regroupements logiques de packs dans un espace de travail CodeQL. L’utilisation de groupes est un moyen d’appliquer des opĂ©rations de pack Ă  des sous-ensembles de packs dans un espace de travail. Par exemple, le pack suivant est dĂ©fini comme faisant partie des groupes java et experimental :

    groups:
      - java
      - experimental
    

    L’exĂ©cution de codeql pack publish --groups java,-experimental publie tous les packs dans le groupe java, Ă  l’exception des packs experimental. Vous pouvez exĂ©cuter la commande codeql pack ls --groups [-]<group>[,[-]<group>...] pour rĂ©pertorier les packs dans un espace de travail qui correspondent Ă  l’ensemble spĂ©cifiĂ© de groupes.

    Un pack CodeQL dans l’espace de travail donnĂ© est inclus dans la liste si :

    • Il se trouve dans au moins un des groupes citĂ©s sans signe moins (cette condition est automatiquement remplie en l’absence de groupe sans signe moins).
    • Il ne se trouve dans aucun groupe listĂ© avec un signe moins.

library

  • NĂ©cessaire pour les packs de bibliothĂšques.

  • DĂ©finit une valeur boolĂ©enne qui indique si ce pack est un pack de bibliothĂšques. Les packs de bibliothĂšques ne contiennent pas de requĂȘte et ne sont pas compilĂ©s. Les packs de requĂȘtes peuvent ignorer ce champ ou le dĂ©finir explicitement sur false. Par exemple :

    library: true
    

suites

  • Facultative pour les packs qui dĂ©finissent des suites de requĂȘtes. Cela permet aux utilisateurs d’exĂ©cuter des suites de requĂȘtes stockĂ©es dans le rĂ©pertoire spĂ©cifiĂ© en spĂ©cifiant le nom du pack, sans fournir le chemin complet.
  • Actuellement pris en charge uniquement pour les packs de requĂȘtes standard inclus dans le pack CLI CodeQL.
  • Cette option n’est pas prise en charge pour les packs CodeQL tĂ©lĂ©chargĂ©s Ă  partir du registre de conteneurs GitHub.

tests

  • Facultative pour les packs contenant des tests CodeQL. IgnorĂ©e pour les packs sans tests.

  • DĂ©finit le chemin d’un rĂ©pertoire dans le pack, contenant les tests (chemin relatif par rapport au rĂ©pertoire du pack). Utilisez . pour spĂ©cifier l’ensemble du pack. Toutes les requĂȘtes de ce rĂ©pertoire sont exĂ©cutĂ©es comme tests quand test run est exĂ©cutĂ© avec l’option --strict-test-discovery. Ces requĂȘtes sont ignorĂ©es par les dĂ©finitions de suite de requĂȘtes qui utilisent des instructions queries ou qlpack pour demander toutes les requĂȘtes dans un pack particulier. Si cette propriĂ©tĂ© est manquante, . est utilisĂ©. Par exemple :

    tests: .
    

extractor

  • NĂ©cessaire pour tous les packs contenant des tests CodeQL.

  • DĂ©finit l’extracteur de langage CodeQL Ă  utiliser pour l’exĂ©cution des tests CodeQL dans le pack. Pour plus d’informations sur les tests de requĂȘtes, consultez Test de requĂȘtes personnalisĂ©es. Par exemple :

    extractor: javascript-typescript
    

authors

  • Optionnel.

  • DĂ©finit les mĂ©tadonnĂ©es qui seront affichĂ©es sur la page de recherche relative Ă  l’empaquetage dans la section des packages du compte dans lequel le pack CodeQL est publiĂ©. Par exemple :

    authors: author1@github.com,author2@github.com
    

license

  • Optionnel.

  • DĂ©finit les mĂ©tadonnĂ©es qui seront affichĂ©es sur la page de recherche relative Ă  l’empaquetage dans la section des packages du compte dans lequel le pack CodeQL est publiĂ©. Pour obtenir la liste des licences autorisĂ©es, consultez la liste des licences SPDX dans la spĂ©cification SPDX. Par exemple :

    license: MIT
    

description

  • Optionnel.

  • DĂ©finit les mĂ©tadonnĂ©es qui seront affichĂ©es sur la page de recherche relative Ă  l’empaquetage dans la section des packages du compte dans lequel le pack CodeQL est publiĂ©. Par exemple :

    description: Human-readable description of the contents of the CodeQL pack.
    

libraryPathDependencies

  • Facultative, dĂ©prĂ©ciĂ©e. Utilisez plutĂŽt la propriĂ©tĂ© dependencies.

  • PrĂ©cĂ©demment utilisĂ©e pour dĂ©finir les noms des packs CodeQL dont ce pack CodeQL dĂ©pend, sous forme de tableau. Elle permet au pack d’accĂ©der Ă  toutes les bibliothĂšques, Ă  tout schĂ©ma de base de donnĂ©es et Ă  toutes les suites de requĂȘtes dĂ©finis dans la dĂ©pendance. Par exemple :

    libraryPathDependencies: codeql/javascript-all
    

dbscheme

  • NĂ©cessaire pour les packs de langages de base uniquement.

  • DĂ©finit le chemin du schĂ©ma de base de donnĂ©es pour toutes les bibliothĂšques et requĂȘtes Ă©crites pour ce langage CodeQL (consultez l’exemple ci-dessous). Par exemple :

    dbscheme: semmlecode.python.dbscheme
    

upgrades

  • NĂ©cessaire pour les packs de langages de base uniquement.

  • DĂ©finit le chemin d’un rĂ©pertoire dans le pack, contenant les scripts de mise Ă  niveau de base de donnĂ©es (chemin relatif par rapport au rĂ©pertoire du pack). Les mises Ă  niveau de base de donnĂ©es sont utilisĂ©es en interne pour garantir qu’une base de donnĂ©es créée avec une version diffĂ©rente de CodeQL CLI est compatible avec la version actuelle de l’interface CLI. Par exemple :

    upgrades: .
    

warnOnImplicitThis

  • facultatif. La valeur par dĂ©faut est false si la propriĂ©tĂ© warnOnImplicitThis n’est pas dĂ©finie.

  • DĂ©finit une valeur boolĂ©enne qui spĂ©cifie si le compilateur doit Ă©mettre des avertissements sur les appels de prĂ©dicat membres avec des rĂ©cepteurs d’appels implicites this, c’est-Ă -dire sans rĂ©cepteur explicite. Disponible Ă  partir de CodeQL CLI v2.13.2. Par exemple :

    warnOnImplicitThis: true
    

À propos des fichiers codeql-pack.lock.yml

Les fichiers codeql-pack.lock.yml stockent les versions des dĂ©pendances transitives rĂ©solues d’un pack CodeQL. Ce fichier est créé par la commande codeql pack install s’il n’existe pas dĂ©jĂ  et doit ĂȘtre ajoutĂ© Ă  votre systĂšme de gestion de versions. La section dependencies du fichier qlpack.yml contient des plages de versions compatibles avec le pack. Le fichier codeql-pack.lock.yml verrouille les dĂ©pendances sur des versions prĂ©cises. Ceci garantit que quand codeql pack install est exĂ©cutĂ© sur ce pack, les mĂȘmes versions des dĂ©pendances sont systĂ©matiquement rĂ©cupĂ©rĂ©es, mĂȘme si des versions compatibles plus rĂ©centes existent.

Par exemple, si un fichier qlpack.yml contient les dĂ©pendances suivantes :

dependencies:
  codeql/cpp-all: ^0.1.2
  my-user/my-lib: ^0.2.3
  other-dependency/from-source: "*"

Le contenu du fichier codeql-pack.lock.yml ressemblera Ă  ceci :

dependencies:
  codeql/cpp-all:
    version: 0.1.4
  my-user/my-lib:
    version: 0.2.4
  my-user/transitive-dependency:
    version: 1.2.4

La dĂ©pendance codeql/cpp-all est verrouillĂ©e sur la version 0.1.4. La dĂ©pendance my-user/my-lib est verrouillĂ©e sur la version 0.2.4. La dĂ©pendance my-user/transitive-dependency, qui est une dĂ©pendance transitive et qui n’est pas spĂ©cifiĂ©e dans le fichier qlpack.yml, est verrouillĂ©e sur la version 1.2.4. La dĂ©pendance other-dependency/from-source est absente du fichier de verrouillage, car elle est rĂ©solue Ă  partir de la source. Cette dĂ©pendance doit ĂȘtre disponible dans le mĂȘme espace de travail CodeQL que le pack. Pour plus d’informations sur les espaces de travail CodeQL et la rĂ©solution des dĂ©pendances Ă  partir de la source, consultez À propos des espaces de travail CodeQL.

Dans la plupart des cas, le fichier codeql-pack.lock.yml est adaptĂ© aux packs de requĂȘtes uniquement, car les packs de bibliothĂšques ne sont pas exĂ©cutables et n’ont gĂ©nĂ©ralement pas besoin que leurs dĂ©pendances transitives soient corrigĂ©es. Les packs de bibliothĂšques contenant des tests font cependant exception. Dans ce cas, le fichier codeql-pack.lock.yml est utilisĂ© afin de garantir que les tests sont toujours exĂ©cutĂ©s avec les mĂȘmes versions de dĂ©pendances pour Ă©viter les faux Ă©checs en cas de disparitĂ© des dĂ©pendances.

Exemples de packs CodeQL personnalisés

Quand vous Ă©crivez des requĂȘtes ou des tests personnalisĂ©s, vous devez les enregistrer dans des packs CodeQL personnalisĂ©s. Par souci de simplicitĂ©, essayez d’organiser chaque pack logiquement. Pour plus d’informations, consultez « CrĂ©ation et utilisation de packs CodeQL Â». Enregistrez les fichiers relatifs aux requĂȘtes et aux tests dans des packs distincts et, si possible, organisez les packs personnalisĂ©s dans des dossiers spĂ©cifiques pour chaque langage cible. Cette approche est particuliĂšrement utile si vous envisagez de publier vos packs CodeQL pour qu’ils puissent ĂȘtre partagĂ©s avec d’autres utilisateurs ou utilisĂ©s pour l’analyse du code. Pour plus d’informations, consultez « Ă€ propos de l’analyse du code avec CodeQL Â».

Packs CodeQL pour les bibliothÚques personnalisées

Un pack CodeQL personnalisĂ© contenant des bibliothĂšques C++ personnalisĂ©es sans requĂȘte ni test peut avoir un fichier qlpack.yml contenant :

name: my-github-user/my-custom-libraries
version: 1.2.3
library: true
dependencies:
  codeql/cpp-all: ^0.1.2

oĂč codeql/cpp-all est le nom du pack CodeQL pour l’analyse C/C++, inclus dans le dĂ©pĂŽt CodeQL. La plage de versions ^0.1.2 indique que ce pack est compatible avec la version 0.1.2 de codeql/cpp-all et toutes les versions supĂ©rieures ou toutes les versions infĂ©rieures Ă  0.2.0. Tout fichier de bibliothĂšque CodeQL (fichier avec extension .qll) dĂ©fini dans ce pack sera disponible pour les requĂȘtes dĂ©finies dans n’importe quel pack de requĂȘtes incluant ce pack dans son bloc de dĂ©pendances.

La propriĂ©tĂ© library indique que ce pack est un pack de bibliothĂšques et qu’il ne contient aucune requĂȘte.

Packs CodeQL pour les requĂȘtes personnalisĂ©es

Un pack CodeQL personnalisĂ© contenant des requĂȘtes et des bibliothĂšques C++ personnalisĂ©es peut avoir un fichier qlpack.yml contenant :

name: my-github-user/my-custom-queries
version: 1.2.3
dependencies:
  codeql/cpp-all: ^0.1.2
  my-github-user/my-custom-libraries: ^1.2.3

oĂč codeql/cpp-all est le nom du pack CodeQL pour l’analyse C/C++, inclus dans le dĂ©pĂŽt CodeQL. La plage de versions ^0.1.2 indique que ce pack est compatible avec la version 0.1.2 de codeql/cpp-all et toutes les versions supĂ©rieures ou toutes les versions infĂ©rieures Ă  0.2.0. my-github-user/my-custom-libraries est le nom d’un pack CodeQL contenant des bibliothĂšques CodeQL personnalisĂ©es pour C++. Tout fichier de bibliothĂšque CodeQL (fichier avec extension .qll) dĂ©fini dans ce pack sera disponible pour les requĂȘtes dans le pack my-github-user/my-custom-queries.

Packs CodeQL pour les tests personnalisés

Pour les packs CodeQL personnalisés contenant des fichiers de test, vous devez également inclure une propriété extractor pour que la commande test run sache comment créer les bases de données de test. Vous pouvez également spécifier la propriété tests.

Le fichier qlpack.yml suivant indique que my-github-user/my-query-tests dĂ©pend de my-github-user/my-custom-queries dont la version est ultĂ©rieure ou Ă©gale Ă  1.2.3 et antĂ©rieure Ă  2.0.0. Il dĂ©clare Ă©galement que l’interface CLI doit utiliser l’extracteur (extractor) Java lors de la crĂ©ation de bases de donnĂ©es de test. La ligne tests: . dĂ©clare que tous les fichiers .ql du pack doivent ĂȘtre exĂ©cutĂ©s en tant que tests quand codeql test run est exĂ©cutĂ© avec l’option --strict-test-discovery. En gĂ©nĂ©ral, les packs de test ne contiennent pas de propriĂ©tĂ© version. Cela vous empĂȘche de les publier accidentellement.

name: my-github-user/my-query-tests
dependencies:
  my-github-user/my-custom-queries: ^1.2.3
extractor: java-kotlin
tests: .

Pour plus d’informations sur l’exĂ©cution des tests, consultez Test de requĂȘtes personnalisĂ©es.

Exemples de packs CodeQL dans le dépÎt CodeQL

Il existe quatre packs CodeQL principaux pour chacun des langages dans le dĂ©pĂŽt CodeQL :

  • Pack de bibliothĂšques de base pour le langage avec le schĂ©ma de base de donnĂ©es utilisĂ© par le langage, les bibliothĂšques CodeQL et les requĂȘtes sous <language>/ql/lib

  • Pack de requĂȘtes de base pour le langage, qui inclut les requĂȘtes par dĂ©faut pour le langage avec leurs suites de requĂȘtes sous <language>/ql/src

  • Tests pour les bibliothĂšques de langages de base et les requĂȘtes sous <language>/ql/test

  • Exemples de requĂȘtes pour le langage sous <language>/ql/examples

Pack de bibliothĂšques de base

Voici un exemple de fichier qlpack.yml pour le pack de langages de base des bibliothĂšques d’analyse C/C++ :

name: codeql/cpp-all
version: x.y.z-dev
dbscheme: semmlecode.cpp.dbscheme
library: true
upgrades: upgrades

Quelques remarques supplĂ©mentaires sur les propriĂ©tĂ©s suivantes :

  • library : Indique qu’il s’agit d’un pack de bibliothĂšques sans requĂȘtes exĂ©cutables. Il est uniquement destinĂ© Ă  ĂȘtre utilisĂ© comme dĂ©pendance pour d’autres packs.

  • dbscheme et upgrades : Ces propriĂ©tĂ©s sont internes Ă  CodeQL CLI et doivent ĂȘtre dĂ©finies uniquement dans le pack de requĂȘtes CodeQL de base pour un langage.

Pack de requĂȘtes de base

Voici un exemple de fichier qlpack.yml pour le pack de requĂȘtes de base des requĂȘtes d’analyse C/C++ :

name: codeql/cpp-queries
version: x.y.z-dev
dependencies:
    codeql/cpp-all: "*"
    codeql/suite-helpers: "*"
suites: codeql-suites
defaultSuiteFile: codeql-suites/cpp-code-scanning.qls

Quelques remarques supplĂ©mentaires sur les propriĂ©tĂ©s suivantes :

  • dependencies : Ce pack de requĂȘtes dĂ©pend de codeql/cpp-all et codeql/suite-helpers. Étant donnĂ© que ces dĂ©pendances sont rĂ©solues Ă  partir de la source, la version du pack CodeQL avec laquelle elles sont compatibles n’a pas d’importance. Pour plus d’informations sur la rĂ©solution des dĂ©pendances Ă  partir de la source, consultez DĂ©pendances sources.

  • suites : Indique le rĂ©pertoire contenant des suites de requĂȘtes connues.

  • defaultSuiteFile : Nom du fichier de suite de requĂȘtes par dĂ©faut utilisĂ© quand aucune suite de requĂȘtes n’est spĂ©cifiĂ©e.

Tests pour le pack CodeQL de base

Voici un exemple de fichier qlpack.yml pour le pack de tests de base des tests d’analyse C/C++ :

name: codeql/cpp-tests
dependencies:
  codeql/cpp-all: "*"
  codeql/cpp-queries: "*"
extractor: cpp
tests: .

Quelques remarques supplĂ©mentaires sur les propriĂ©tĂ©s suivantes :

  • dependencies : Ce pack dĂ©pend des packs de bibliothĂšques et de requĂȘtes CodeQL de base pour C++.

  • extractor : SpĂ©cifie que tous les tests utiliseront le mĂȘme extracteur C++ pour crĂ©er la base de donnĂ©es pour les tests.

  • tests : SpĂ©cifie l’emplacement des tests. Dans ce cas, les tests se trouvent dans le dossier racine (et tous les sous-dossiers) du pack.

  • version : Il n’existe aucune propriĂ©tĂ© version pour le pack de tests. Ceci empĂȘche la publication accidentelle de packs de tests.