Observação: este artigo foi migrado do site de documentação do CodeQL em janeiro de 2023.
Observação: a funcionalidade de gerenciamento de pacote do CodeQL, incluindo pacotes do CodeQL, está em versão beta no momento e sujeita a alterações. Durante a versão beta, os pacotes CodeQL estão disponíveis apenas usando pacotes GitHub – o Container registry. Para usar essa funcionalidade beta, instale a versão mais recente do pacote da CodeQL CLI de: https://github.com/github/codeql-action/releases.
Como configurar o arquivo qlpack.yml
antes da publicação
Observação: este artigo descreve os recursos disponíveis com o pacote CodeQL CLI 2.12.7 incluído na versão inicial de GitHub Enterprise Server 3.7.
Se o administrador do site atualizou a versão do CodeQL CLI para uma mais recente, confira a versão GitHub Enterprise Cloud deste artigo para obter informações sobre os recursos mais recentes.
Você pode verificar e modificar os detalhes de configuração do pacote do CodeQL antes da publicação. Abra o arquivo qlpack.yml
em seu editor de texto preferido.
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>
default-suite: # optional, one or more queries in the pack to run by default
- query: <relative-path>/query-file>.ql
default-suite-file: 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:
precisa seguir o formato<scope>/<pack>
, em que<scope>
é a organização do GitHub de destino da publicação eé o nome do pacote. -
É permitido no máximo um
default-suite
ou umdefault-suite-file
. Essas são duas maneiras diferentes de definir um conjunto de consultas padrão a ser executado, a primeira especificando consultas diretamente no arquivo qlpack.yml e a segunda especificando um conjunto de consultas no pacote.
Em execuçãocodeql pack publish
Quando estiver pronto para publicar um pacote no Container registry do GitHub, você poderá executar o seguinte comando na raiz do diretório do pacote:
codeql pack publish
O pacote publicado será exibido na seção de pacotes da organização do GitHub especificada pelo escopo no arquivo qlpack.yml
.
Em execuçãocodeql pack download <scope>/<pack>
Para executar um pacote que outra pessoa criou, primeiro você precisa baixá-lo executando o seguinte comando:
codeql pack download <scope>/<pack>@x.x.x
<scope>
: o nome da organização do GitHub de origem do download.<pack>
: o nome do pacote que você quer baixar.@x.x.x
: um número de versão opcional. Se omitido, a versão mais recente será baixada.
Esse comando aceita argumentos para vários pacotes.
Como usar um pacote do CodeQL para analisar um banco de dados do CodeQL
Para analisar um banco de dados do CodeQL com um pacote do CodeQL, execute o seguinte comando:
codeql database analyze <database> <scope>/<pack>@x.x.x:<path>
<database>
: o banco de dados do CodeQL a ser analisado.<scope>
: o nome da organização do GitHub na qual o pacote foi publicado.<pack>
: o nome do pacote que você está usando.@x.x.x
: um número de versão opcional. Se omitido, a versão mais recente será usada.:<path>
: um caminho opcional para uma consulta, um diretório ou um pacote de consultas. Se omitido, o conjunto de consultas padrão do pacote será usado.
O comando analyze
executará o conjunto padrão de todos os pacotes do CodeQL especificados. Você pode especificar vários pacotes do CodeQL a serem usados para analisar um banco de dados do CodeQL. Por exemplo:
codeql <database> analyze <scope>/<pack> <scope>/<other-pack>
Como trabalhar cm pacotes do CodeQL no GitHub Enterprise Server
Por padrão, o CodeQL CLI espera baixar pacotes do CodeQL e publicá-los no Container registry no GitHub.com. No entanto, você também pode trabalhar com pacotes do CodeQL em um Container registry no GitHub Enterprise Server criando um arquivo qlconfig.yml
para informar à CLI qual Container registry usar para cada pacote.
Crie um arquivo ~/.codeql/qlconfig.yml
usando seu editor de texto preferido e adicione entradas para especificar qual registro usar para um ou mais padrões de nome de pacote.
Por exemplo, o arquivo qlconfig.yml
a seguir associa todos os pacotes ao Container registry para o GitHub Enterprise Server em GHE_HOSTNAME
, exceto os pacotes correspondentes a codeql/\*
, que estão associados ao Container registry no GitHub.com:
registries:
- packages:
- 'codeql/*'
- 'other-org/*'
url: https://ghcr.io/v2/
- packages: '*'
url: https://containers.GHE_HOSTNAME/v2/
A CodeQL CLI determinará qual registro usar para um determinado nome de pacote localizando o primeiro item na lista registries
com uma propriedade packages
que corresponda a esse nome de pacote.
Isso significa que é melhor definir os padrões de nome de pacote mais específicos primeiro. A propriedade packages
pode ser um só nome de pacote, um padrão glob ou uma lista YAML de nomes de pacote e padrões glob.
A lista registries
também pode ser colocada dentro de um arquivo codeql-workspace.yml
. Isso permitirá que você defina os registros a serem usados em um workspace específico, para que eles possam ser compartilhados entre outros usuários do CodeQL do workspace. A lista registries
no codeql-workspace.yml
será mesclada e terá precedência sobre a lista no qlconfig.yml
global. Para obter mais informações sobre codeql-workspace.yml
, confira "Sobre os workspaces do CodeQL".
Agora você pode usar codeql pack publish
, codeql pack download
e codeql database analyze
para gerenciar pacotes no GitHub Enterprise Server.
Autenticação no GitHub Container registries
Você pode publicar pacotes e baixar pacotes privados se autenticando no Container registry do GitHub.
Você pode se autenticar no Container registry no GitHub.com de duas maneiras:
- Passe a opção
--github-auth-stdin
para a CodeQL CLI e forneça um token do GitHub Apps ou um personal access token por meio de entrada padrão. - Defina a variável de ambiente
GITHUB_TOKEN
como um token do GitHub Apps ou um personal access token.
Da mesma forma, você pode se autenticar em um Container registry do GitHub Enterprise Server ou em vários registros simultaneamente (por exemplo, para baixar ou executar pacotes privados de vários registros) de duas maneiras:
- Passe a opção
--registries-auth-stdin
para a CodeQL CLI e forneça uma cadeia de caracteres de autenticação do registro por meio de entrada padrão. - Defina a variável de ambiente
CODEQL_REGISTRIES_AUTH
como uma cadeia de caracteres de autenticação do registro.
Uma cadeia de caracteres de autenticação de registro é uma lista de pares de <registry-url>=<token>
separados por vírgulas, em que registry-url
é uma URL de Container registry, como https://containers.GHE_HOSTNAME/v2/
, e token
é um token do GitHub Apps ou um personal access token desse Container registry do GitHub.
Isso garante que cada token seja passado apenas para o Container registry que você especifica.
Por exemplo, a cadeia de caracteres de autenticação do registro a seguir especifica que a CodeQL CLI deve se autenticar no Container registry no GitHub.com usando o token <token1>
e no Container registry da instância do GHES em GHE_HOSTNAME
usando o token <token2>
:
https://ghcr.io/v2/=<token1>,https://containers.GHE_HOSTNAME/v2/=<token2>
Sobre os arquivos qlpack.yml
Ao executar comandos relacionados à consulta, o CodeQL primeiro procura arquivos qlpack.yml
em irmãos do diretório de instalação (e nos subdiretórios).
Depois, ele verifica o cache de pacotes do CodeQL em busca daqueles que foram baixados. Isso significa que, quando você está desenvolvendo consultas localmente, os pacotes locais no diretório de instalação substituem os pacotes com o mesmo nome no cache de pacotes, para que você possa testar as alterações locais.
Os metadados em cada arquivo qlpack.yml
informam ao CodeQL como compilar consultas no pacote, de quais bibliotecas o pacote depende e onde encontrar as definições do conjunto de consultas.
O conteúdo do pacote do CodeQL (consultas ou bibliotecas usadas na análise do CodeQL) está incluído no mesmo diretório que o qlpack.yml
ou em nos subdiretórios.
O diretório que contém o arquivo qlpack.yml
funciona como o diretório raiz do conteúdo do pacote do CodeQL. Ou seja, para todos os arquivos .ql
e .qll
no pacote, o CodeQL resolverá todas as instruções de importação relativas ao diretório que contém o arquivo qlpack.yml
na raiz do pacote.
Propriedades qlpack.yml
As propriedades a seguir são compatíveis com arquivos qlpack.yml
.
name
- Exigido por todos os pacotes.
- Define o escopo do pacote, em que o pacote do CodeQL é publicado e o nome do pacote é definido usando caracteres alfanuméricos e hifens. Esse campo precisa ser exclusivo, pois o CodeQL não pode diferenciar pacotes do CodeQL com nomes idênticos. Use o nome do pacote para especificar as consultas a serem executadas usando
database analyze
e para definir dependências entre pacotes do CodeQL (veja os exemplos abaixo). Por exemplo:name: octo-org/security-queries
version
- Exigido por todos os pacotes publicados.
- Define uma versão semântica desse pacote do CodeQL que precisa seguir à especificação SemVer v2.0.0. Por exemplo:
version: 0.0.0
dependencies
- Exigido por pacotes que definem as dependências de pacote do CodeQL em outros pacotes.
- Define um mapa de referências de pacote para o intervalo de versão semântica compatível com esse pacote. Compatível com a CodeQL CLI versões v2.6.0 e posteriores. Por exemplo:
dependencies: codeql/cpp-all: ^0.0.2
defaultSuiteFile
- Exigido por pacotes que exportam um conjunto de consultas padrão para execução.
- Define o caminho para um arquivo de pacote de consultas em relação à raiz do pacote, contendo todas as consultas que são executadas por padrão quando esse pacote é passado para o comando
codeql database analyze
. Compatível com a CLI versão v2.6.0 e posteriores. Só é possível definirdefaultSuiteFile
oudefaultSuite
. Por exemplo:defaultSuiteFile: cpp-code-scanning.qls
defaultSuite
- Exigido por pacotes que exportam um conjunto de consultas padrão para execução.
- Define um conjunto de consultas embutidas que contém todas as consultas que são executadas por padrão quando esse pacote é passado para o comando
codeql database analyze
. Compatível com a CLI versão v2.6.0 e posteriores. Só é possível definirdefaultSuiteFile
oudefaultSuite
. Por exemplo:defaultSuite: queries: . exclude: precision: medium
groups
-
Opcional.
-
Define agrupamentos lógicos de pacotes em um espaço de trabalho do CodeQL. Usar grupos é uma maneira de aplicar operações de pacote a subconjuntos de pacotes em um espaço de trabalho. Por exemplo, o pacote a seguir é definido para fazer parte dos grupos
java
eexperimental
:groups: - java - experimental
A execução de
codeql pack publish --groups java,-experimental
publicará todos os pacotes no grupojava
, exceto os pacotesexperimental
. Você pode executar o comandocodeql pack ls --groups [-]<group>[,[-]<group>...]
para listar os pacotes em um espaço de trabalho que correspondem ao conjunto especificado de grupos.Um pacote do CodeQL no espaço de trabalho fornecido será incluído na lista se:
- Ele estiver em, pelo menos, um dos grupos listados sem um sinal de subtração (essa condição será atendida automaticamente se não houver grupos listados sem um sinal de subtração) e se
- Ele não estiver em nenhum grupo listado com um sinal de subtração.
library
- Exigido por pacotes de biblioteca.
- Define um valor booliano que indica se esse pacote é ou não um pacote de biblioteca. Os pacotes de biblioteca não contêm consultas e não são compilados. Os pacotes de consultas podem ignorar esse campo ou defini-lo explicitamente como
false
. Por exemplo:library: true
suites
- Opcional para pacotes que definem conjuntos de consultas.
- Define o caminho para um diretório no pacote que contém os conjuntos de consultas que a CodeQL CLI precisa reconhecer, em relação ao diretório do pacote. Os usuários de pacote do CodeQL podem executar pacotes "conhecidos" armazenados nesse diretório especificando o nome do pacote, sem fornecer o caminho completo. Sem suporte para pacotes do CodeQL baixados do registro de contêiner. Para obter mais informações sobre os pacotes de consulta, confira "Como criar conjuntos de consultas do CodeQL". Por exemplo:
suites: octo-org-query-suites
tests
- Opcional para pacotes que contêm testes do CodeQL. Ignorado para pacotes sem testes.
- Define o caminho para um diretório dentro do pacote que contém testes, definido em relação ao diretório do pacote. Use
.
para especificar o pacote inteiro. Todas as consultas nesse diretório são executadas como testes quandotest run
é executado com a opção--strict-test-discovery
. Essas consultas são ignoradas por definições de conjunto de consultas que usam instruçõesqueries
ouqlpack
para solicitar todas as consultas em um pacote específico. Se essa propriedade estiver ausente,.
será assumido. Por exemplo:tests: .
extractor
- Exigido por todos os pacotes que contêm testes do CodeQL.
- Define o extrator de linguagem do CodeQL a ser usado ao executar os testes do CodeQL no pacote. Para obter mais informações sobre como testar as consultas, confira "Testar consultas personalizadas". Por exemplo:
extractor: javascript
authors
- Opcional.
- Define os metadados que serão exibidos na página de pesquisa de empacotamento na seção de pacotes da conta em que o pacote do CodeQL foi publicado. Por exemplo:
authors: author1@github.com,author2@github.com
license
- Opcional.
- Define os metadados que serão exibidos na página de pesquisa de empacotamento na seção de pacotes da conta em que o pacote do CodeQL foi publicado. Para obter uma lista de licenças permitidas, confira Lista de licenças SPDX na Especificação SPDX. Por exemplo:
license: MIT
description
- Opcional.
- Define os metadados que serão exibidos na página de pesquisa de empacotamento na seção de pacotes da conta em que o pacote do CodeQL foi publicado. Por exemplo:
description: Human-readable description of the contents of the CodeQL pack.
libraryPathDependencies
- Opcional, preterido. Use a propriedade
dependencies
. - Usado anteriormente para definir os nomes de qualquer pacote do CodeQL dos quais esse pacote do CodeQL depende, como uma matriz. Fornece ao pacote acesso a todas as bibliotecas, esquemas de banco de dados e conjuntos de consultas definidos na dependência. Por exemplo:
libraryPathDependencies: codeql/javascript-all
dbscheme
- Exigido apenas por pacotes de linguagens principais.
- Define o caminho para o esquema de banco de dados para todas as bibliotecas e consultas escritas para essa linguagem do CodeQL (veja o exemplo abaixo). Por exemplo:
dbscheme: semmlecode.python.dbscheme
upgrades
- Exigido apenas por pacotes de linguagens principais.
- Define o caminho para um diretório dentro do pacote que contém scripts de atualização de banco de dados, definidos em relação ao diretório do pacote. As atualizações de banco de dados são usadas internamente para garantir que um banco de dados criado com uma versão diferente da CodeQL CLI seja compatível com a versão atual da CLI. Por exemplo:
upgrades: .
warnOnImplicitThis
- Opcional. O padrão será definido como
false
se a propriedadewarnOnImplicitThis
não for definida. - Define um booliano que especifica se o compilador deve ou não emitir avisos sobre chamadas de predicado de membro com receptores de chamada
this
implícitos, ou seja, sem um receptor explícito. Compatível com a CodeQL CLI versão 2.13.2 e versões posteriores. Por exemplo:warnOnImplicitThis: true
Sobre os arquivos codeql-pack.lock.yml
Os arquivos codeql-pack.lock.yml
armazenam as versões das dependências transitivas resolvidas de um pacote do CodeQL. Esse arquivo será criado pelo comando codeql pack install
se ele ainda não existir e deverá ser adicionado ao sistema de controle de versão. A seção dependencies
do arquivo qlpack.yml
contém intervalos de versão compatíveis com o pacote. O arquivo codeql-pack.lock.yml
bloqueia as versões para dependências precisas. Isso garante que a execução de codeql pack install
nesse pacote sempre recupere as mesmas versões de dependências, mesmo que existam versões compatíveis mais recentes.
Por exemplo, se um arquivo qlpack.yml
contiver as seguintes dependências:
dependencies:
codeql/cpp-all: ^0.1.2
my-user/my-lib: ^0.2.3
other-dependency/from-source: "*"
O arquivo codeql-pack.lock.yml
conterá algo semelhante ao seguinte:
dependencies:
codeql/cpp-all:
version: 0.1.4
my-user/my-lib:
version: 0.2.4
my-user/transitive-dependency:
version: 1.2.4
A dependência codeql/cpp-all
está bloqueada para a versão 0.1.4. A dependência my-user/my-lib
está bloqueada para a versão 0.2.4. O my-user/transitive-dependency
, que é uma dependência transitiva e não é especificado no arquivo qlpack.yml
, está bloqueado para a versão 1.2.4. O other-dependency/from-source
está ausente do arquivo de bloqueio, pois é resolvido da origem. Essa dependência precisa estar disponível no mesmo workspace do CodeQL que o pacote. Para obter mais informações sobre os workspaces do CodeQL e resolver dependências por meio da origem, confira "Sobre os workspaces do CodeQL".
Na maioria dos casos, o arquivo codeql-pack.lock.yml
só é relevante para pacotes de consulta, pois os pacotes de biblioteca não são executáveis e geralmente não precisam que as dependências transitivas sejam corrigidas. A exceção a isso é para pacotes de biblioteca que contêm testes. Nesse caso, o arquivo codeql-pack.lock.yml
é usado para garantir que os testes sejam sempre executados com as mesmas versões de dependências para evitar falhas falsas quando houver dependências incompatíveis.
Exemplos de pacotes personalizados do CodeQL
Ao escrever consultas ou testes personalizados, você deve salvá-los em pacotes personalizados do CodeQL. Para simplificar, tente organizar cada pacote logicamente. Para obter mais informações, confira "Sobre a estrutura de pacotes do CodeQL". Salve arquivos para consultas e testes em pacotes separados e, sempre que possível, organize pacotes personalizados em pastas específicas para cada linguagem de destino. Isso é muito útil quando você pretende publicar os pacotes do CodeQL para que eles possam ser compartilhados com outras pessoas ou usados na verificação de código. Para obter mais informações, confira "Sobre a varredura de código com CodeQL".
Pacotes do CodeQL para bibliotecas personalizadas
Um pacote personalizado do CodeQL que contém bibliotecas C++ personalizadas, sem consultas ou testes, pode ter um arquivo qlpack.yml
contendo:
name: my-github-user/my-custom-libraries
version: 1.2.3
library: true
dependencies:
codeql/cpp-all: ^0.1.2
em que codeql/cpp-all
é o nome do pacote do CodeQL para análise do C/C++ incluído no repositório do CodeQL. O intervalo de versão ^0.1.2
indica que esse pacote é compatível com todas as versões do codeql/cpp-all
iguais ou superiores à 0.1.2
e inferiores a 0.2.0
. Qualquer arquivo de biblioteca do CodeQL (um arquivo com uma extensão .qll
) definido nesse pacote estará disponível para consultas definidas em qualquer pacote de consultas que inclua esse pacote no bloco de dependências.
A propriedade library
indica que esse pacote é um pacote de biblioteca e não contém nenhuma consulta.
Pacotes do CodeQL para consultas personalizadas
Um pacote personalizado do CodeQL que contém consultas e bibliotecas C++ personalizadas pode ter um arquivo qlpack.yml
contendo:
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
suites: my-custom-suites
em que codeql/cpp-all
é o nome do pacote do CodeQL para análise do C/C++ incluído no repositório do CodeQL. O intervalo de versão ^0.1.2
indica que esse pacote é compatível com todas as versões do codeql/cpp-all
iguais ou superiores à 0.1.2
e inferiores a 0.2.0
. my-github-user/my-custom-libraries
é o nome de um pacote do CodeQL que contém bibliotecas personalizadas do CodeQL para C++. Qualquer arquivo de biblioteca do CodeQL (um arquivo com uma extensão .qll
) definido neste pacote estará disponível para consultas no pacote my-github-user/my-custom-queries
.
A propriedade suites
indica um diretório em que podem ser encontrados conjuntos de consultas "conhecidos". Esses pacotes podem ser usados na linha de comando se referindo apenas ao nome, em vez do caminho completo. Para obter mais informações sobre os pacotes de consulta, confira "Como criar conjuntos de consultas do CodeQL".
Pacotes do CodeQL para testes personalizados
Para pacotes personalizados do CodeQL que contêm arquivos de teste, você também precisa incluir uma propriedade extractor
para que o comando test run
saiba como criar bancos de dados de teste. Você também pode especificar a propriedade tests
.
O arquivo qlpack.yml
a seguir informa que my-github-user/my-query-tests
depende de my-github-user/my-custom-queries
em uma versão igual ou superior a 1.2.3 e inferior a 2.0.0. Ele também declara que a CLI deve usar o Java extractor
ao criar bancos de dados de teste. A linha tests: .
declara que todos os arquivos .ql
no pacote devem ser executados como testes quando codeql test run
é executado com a opção --strict-test-discovery
. Normalmente, os pacotes de teste não contêm uma propriedade version
. Isso impede que você os publique acidentalmente.
name: my-github-user/my-query-tests
dependencies:
my-github-user/my-custom-queries: ^1.2.3
extractor: java
tests: .
Para obter mais informações sobre como executar testes, confira "Testar consultas personalizadas".
Exemplos de pacotes do CodeQL no repositório do CodeQL
Cada uma das linguagens no repositório do CodeQL tem quatro pacotes principais do CodeQL:
-
Pacote de biblioteca principal da linguagem, com o esquema de banco de dados usado pela linguagem e as bibliotecas e consultas do CodeQL em
<language>/ql/lib
-
Pacote de consultas principal para a linguagem que inclui as consultas padrão das linguagens, juntamente com os conjuntos de consultas em
<language>/ql/src
-
Testes para as principais bibliotecas e consultas de linguagem em
<language>/ql/test
-
Exemplo de consultas para a linguagem em
<language>/ql/examples
Pacote de biblioteca principal
Veja um arquivo de exemplo qlpack.yml
do pacote de linguagem principal das bibliotecas de análise do C/C++:
name: codeql/cpp-all
version: x.y.z-dev
dbscheme: semmlecode.cpp.dbscheme
library: true
upgrades: upgrades
Algumas observações adicionais sobre as seguintes propriedades:
-
library
: indica que esse é um pacote de biblioteca sem consultas executáveis. Ele só deve ser usado como uma dependência de outros pacotes. -
dbscheme
eupgrades
: essas propriedades são internas da CodeQL CLI e só devem ser definidas no pacote do QL principal de uma linguagem.
Pacote de consultas principal
Veja um arquivo de exemplo qlpack.yml
de pacote de consultas principal de consultas de análise do 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
Algumas observações adicionais sobre as seguintes propriedades:
-
dependencies
: esse pacote de consultas depende decodeql/cpp-all
ecodeql/suite-helpers
. Como essas dependências são resolvidas na origem, não importa com qual versão do pacote do CodeQL elas são compatíveis. Para obter mais informações de como resolver as dependências por meio da origem, confira "Dependências de origem". -
suites
: indica o diretório que contém conjuntos de consultas "conhecidos". -
defaultSuiteFile
: o nome do arquivo do pacote de consultas padrão usado quando nenhum pacote de consultas é especificado.
Testes para o pacote principal do CodeQL
Veja um arquivo de exemplo qlpack.yml
do pacote de teste principal para testes de análise do C/C++:
name: codeql/cpp-tests
dependencies:
codeql/cpp-all: "*"
codeql/cpp-queries: "*"
extractor: cpp
tests: .
Algumas observações adicionais sobre as seguintes propriedades:
-
dependencies
: esse pacote depende da consulta principal do CodeQL e dos pacotes de biblioteca para C++. -
extractor
: especifica que todos os testes usarão o mesmo extrator C++ para criar o banco de dados para os testes. -
tests
: especifica o local dos testes. Nesse caso, os testes estão na pasta raiz (e em todas as subpastas) do pacote. -
version
: não há nenhuma propriedadeversion
para o pacote de testes. Isso impede que os pacotes de teste sejam publicados acidentalmente.