Skip to main content

Сведения о рабочих областях CodeQL

CodeQL рабочих пространств позволяют разрабатывать и поддерживать несколько связанных CodeQL пакетов вместе, разрешая зависимости между ними напрямую из источника.

Кто может использовать эту функцию?

CodeQL доступен для следующих типов репозитория:

Сведения о рабочих областях CodeQL

Примечание.

В этой статье описываются функции, доступные в версии действия CodeQL и связанного пакета CodeQL CLI в первоначальном выпуске этой версии GitHub Enterprise Server. Если ваше предприятие использует более последнюю версию действия CodeQL, ознакомьтесь с версией GitHub Enterprise Cloud этой статьи, чтобы узнать о последних функциях. Сведения об использовании последней версии см. в разделе Настройка сканирования кода для устройства.

Рабочее пространство CodeQL обычно используется для разработки набора библиотечных и запросных пакетов, зависящих друг от друга. При использовании рабочей области CodeQL все пакеты CodeQL в рабочей области доступны в качестве зависимостей источника при выполнении команды CodeQL, разрешающей запросы. Это упрощает разработку, обслуживание и публикацию нескольких связанных пакетов CodeQL. Дополнительные сведения о пакетах CodeQL см. в разделе Настройка анализа с помощью пакетов CodeQL.

Рабочие пространства обычно хранятся в одном репозитории Git, чтобы связанные паки можно было разрабатывать и публиковать вместе.

Зависимости источника

В рабочем пространстве CodeQL все пакеты, включённые в рабочее пространство, рассматриваются как исходные зависимости друг от друга. Это означает, что они разрешаются напрямую из локальной файловой системы, а не из кэша CodeQL пакета.

Потому что рабочие пакеты разрешаются из источника:

  • Локальные изменения в одном наборе сразу видны другим наборам в рабочем пространстве.
  • Зависимости, найденные в рабочем пространстве, переопределяют версии в кэше пакетов.
  • Ограничения по версиям в qlpack.yml файлах игнорируются в зависимости от рабочего пространства, так как версия определяется содержимым рабочего пространства.

Это поведение особенно полезно при одновременной разработке нескольких связанных пакетов. Рассмотрим пример.

  • Зависимость пока не опубликована и существует только локально.
  • Вы вносите скоординированные изменения в несколько пакетов и хотите, чтобы они разрешались друг против друга во время тестирования.

Вне рабочего пространства зависимости разрешаются из кэша пакета и должны соответствовать ограничениям версии, определённым в qlpack.yml. Внутри рабочего пространства резолюция отдаёт приоритет локальному исходному контенту.

CodeQL рабочих областей и разрешения запросов

Модель зависимости рабочего пространства влияет на то, как пакеты устанавливаются и публикуются.

  • Во время установки зависимости, найденные в рабочем пространстве, не загружаются в кэш пакета и не записываются в codeql-pack.lock.yml файл.
  • Во время публикации зависимости, предоставляемые рабочим пространством, объединяются с использованием локального исходного контента, а не версий из кэша пакетов.

Например, запуск codeql pack install в каталоге pack внутри рабочего пространства использует любые зависимости, найденные в этом пространстве, вместо того чтобы загружать их в кэш пакетов или записывать в codeql-pack.lock.yml файл. См . раздел AUTOTITLE.

Example

Рабочее пространство CodeQL определяется YAML-файлом с именем codeql-workspace.yml. Рассмотрим следующий файл codeql-workspace.yml:

provide:
  - "**/qlpack.yml"

И следующий файл пакета библиотеки qlpack.yml CodeQL в рабочей области:

name: my-company/my-library
library: true
version: 1.0.0

И следующий файл пакета qlpack.yml запросов CodeQL в рабочей области:

name: my-company/my-queries
version: 1.0.0
dependencies:
  my-company/my-library: "*"
  codeql/cpp-all: ~0.2.0

Обратите внимание, что dependencies блок для пакета my-company/my-queriesзапросов CodeQL указывает "*" версию пакета библиотеки. Так как пакет библиотеки уже определен как зависимость источника codeql-workspace.yml, содержимое пакета библиотеки всегда разрешается из рабочей области. Любое ограничение версии, указанное вами, будет игнорироваться в этом случае. Использование "*" для исходных зависимостей явно показывает, что версия унаследована из рабочего пространства.

При выполнении codeql pack install из каталога пакета запросов соответствующая версия codeql/cpp-all загружается в локальный кэш пакетов. Кроме того, codeql-pack.lock.yml создается файл, содержащий разрешенную версию codeql/cpp-all. Файл блокировки не будет содержать запись my-company/my-library , так как она разрешается из исходных зависимостей. Файл codeql-pack.lock.yml будет выглядеть примерно так:

dependencies:
  codeql/cpp-all:
    version: 0.2.2

При выполнении codeql pack publish из каталога codeql/cpp-all пакета запросов зависимость от кэша пакетов и my-company/my-library рабочей области объединяются и my-company/my-queries публикуются в реестре контейнеров GitHub.

Пример codeql-workspace.yml файла

Рабочее пространство CodeQL определяется YAML-файлом с именем codeql-workspace.yml. Этот файл содержит provide блок и при необходимости ignore и registries блоки.

  • Блок provide содержит список шаблонов глобов, определяющих пакеты CodeQL, доступные в рабочей области.

  • Блок ignore содержит список шаблонов глобов, определяющих пакеты CodeQL, которые недоступны в рабочей области.

  • Блок registries содержит список URL-адресов GHES и шаблонов пакетов, которые управляют тем, какой реестр контейнеров используется для публикации пакетов CodeQL . См . раздел AUTOTITLE.

Каждая запись в provide разделе ignore должна сопоставляться с расположением qlpack.yml файла. Все шаблоны glob определяются относительно каталога, содержащего файл рабочей области. Список шаблонов, принятых в этом файле, см. в разделе @actions/glob.

Например, следующий codeql-workspace.yml файл определяет рабочую область, содержащую все пакеты CodeQL, рекурсивно найденные в codeql-packs каталоге, за исключением пакетов в каталоге experimental . Блок registries указывает, что codeql/\* пакеты должны быть скачаны из http://ghcr.io/v2/реестра контейнеров по умолчанию GitHub. Все остальные пакеты следует скачать и опубликовать в реестре GHE_HOSTNAME.

provide:
  - "*/codeql-packs/**/qlpack.yml"
ignore:
  - "*/codeql-packs/**/experimental/**/qlpack.yml"

registries:
 - packages: 'codeql/*'
   url: http://ghcr.io/v2/

 - packages: '*'
   url: http://containers.GHE_HOSTNAME/v2/

Вы можете перечислить пакеты, включённые в рабочее пространство, запустив codeql pack ls их в каталоге workspace.

Использование ${workspace} в качестве диапазона версий в файлах qlpack.yml

Пакеты CodeQL в рабочей области могут использовать специальные ${workspace}``~${workspace}``^${workspace} заполнители и диапазон версий. Эти заполнители указывают, что этот пакет зависит от версии указанного пакета, который в настоящее время находится в рабочей области. Этот заполнитель обычно используется для зависимостей внутри пакетов библиотек, чтобы гарантировать, что при публикации зависимости в файле qlpack.yml отражают состояние рабочей области при их публикации.

Example

Рассмотрим следующие два пакета библиотеки в одной рабочей области:

name: my-company/my-library
library: true
version: 1.2.3
dependencies:
  my-company/my-library2: ${workspace}
name: my-company/my-library2
library: true
version: 4.5.6

При my-company/my-library публикации в реестре контейнеров GitHub версия зависимости my-company/my-library2 в опубликованном qlpack.yml файле будет записана как 4.5.6.

Аналогичным образом, если зависимость находится my-company/my-library2: ^${workspace} в исходном пакете, а затем будет опубликован пакет, версия my-company/my-library2 зависимости в опубликованном qlpack.yml файле будет записана как ^4.5.6, указывающая, что версии >= 4.5.6 и < 5.0.0 все совместимы с этим пакетом библиотеки.

Если зависимость находится my-company/my-library2: ~${workspace} в исходном пакете, а затем будет опубликован пакет, версия my-company/my-library2 зависимостей в опубликованном qlpack.yml файле будет записана как ~4.5.6, указывающая, что версии >= 4.5.6 и < 4.6.0 все совместимы с этим пакетом библиотеки.