Пользовательский запрос CodeQL в Azure DevOps в конвейере yaml выдает ошибку: запросы для javascript не определены

Я хочу запускать пользовательские запросы codeql для повышенной безопасности в Azure DevOps (эта функция теперь доступна в Azure DevOps, а не только в GitHub). Встроенные запросы по умолчанию, такие как безопасность и качество, работают нормально. Я запускаю их партиями по ночам.

Но сейчас я строю новый отдельный конвейер, который будет работать и ночью пакетно. С его помощью я хочу выполнить несколько пользовательских запросов в поисках конкретного нежелательного шаблона в этом довольно большом репозитории JavaScript git.

Все это хранится и запускается в службах Azure DevOps. Я начал с простого запроса на поиск всех ToDo codeql, чтобы все заработало. Но я получаю эту ошибку, которую я не могу найти в документации или Часто задаваемые вопросы по сканированию кода, или посмотрите, что у кого-то еще было раньше:

/opt/hostedtoolcache/CodeQL/2.17.2/x64/codeql/codeql database init --codescanning-config=/home/vsts/work/1/s/.azuredevops/customcodeql/customconfig.yaml --db-cluster /home/vsts/work/_temp/advancedsecurity.codeql/d --source-root=/home/vsts/work/1/s --language=javascript --calculate-baseline
A fatal error occurred: No queries defined for javascript
##[warning] Error running the 'database init' CodeQL command for javascript (2)
##[error]Error running the 'database init' CodeQL command for javascript (2)

====================================================================================================
Analyzing CodeQL execution results.
CodeQL analysis finished with exit code 2.

У меня есть конвейер yaml с задачами AdvancedSecurity-Codeql-Init@1, AdvancedSecurity-Codeql-Autobuild@1 и AdvancedSecurity-Codeql-Analyze@1 . Задача AdvancedSecurity-Codeql-Init@1 указывает на файл yaml codeqlconfig, и в этом файле я указываю на простой запрос todo codeql. Это точно, как это должно быть сделано в соответствии с документацией, которую я прочитал, например: Анализ с помощью пользовательских запросов.

Однажды я написал неверный путь в запросе codeql. Затем я получил сообщение об ошибке: A fatal error occurred: ./azuredevops/customcodeql/todos.ql is not a .ql file, .qls file, a directory, or a query pack specification. Я исправил путь (добавил . infront, чтобы он стал ./.azuredevops....) и больше не получал ошибку типа «не могу найти файл», поэтому я предполагаю, что файл найден сейчас.

Но теперь я получаю другую ошибку: «Для javascript не определены запросы», поэтому предположим, что он находит мой todos.ql, но все равно не работает.

Вот три файла, которые я использую:

Вот todo.ql, взятый из примеров :

/**
 * @id js/javascript/todocomment
 * @name TODO_comments
 * @description Finds comments containing the word TODO
 * @kind problem
 * @problem.severity recommendation
 * @tags comment
 *       TODO
 */
import javascript

from Comment c
where c.getText().regexpMatch("(?si).*\\bTODO\\b.*")
select c

Вот код customconfig.yaml:

name: "Run custom queries"
disable-default-queries: true
queries:
  - name: TODO_comments
    uses: ./.azuredevops/customcodeql/todos.ql
paths:
  - src 
paths-ignore: 
  - '**/node_modules'
  - '**/*.test.js'
query-filters:
 - include:
    kind: problem

Вот часть конвейера yaml, который запускается в Azure DevOps как пакетное задание. Ошибка возникает в задаче AdvancedSecurity-Codeql-Init@1 версии 1.1.262 примерно через 7 секунд.

- stage: Analyze_Custom_CQL
  jobs:
  - job: Analyze
    steps:
    - task: AdvancedSecurity-Codeql-Init@1
      inputs:
        languages: 'javascript'
        loglevel: '3'
        configfilepath: '$(build.sourcesDirectory)/.azuredevops/customcodeql/customconfig.yaml'

    - task: AdvancedSecurity-Codeql-Autobuild@1
      displayName: 'Advanced Security Autobuild'

    - task: AdvancedSecurity-Codeql-Analyze@1   

Я что-то упустил в todos.ql, метаданных или что-то в этом роде? Я изменил фильтр и включил его в customconfig.yaml. Пробовал с ними или без них.

Привет, могу ли я узнать, что ваш специальный запрос отправлен в ветку, код которой сканируется этим конвейером?

Alvin Zhao - MSFT 23.05.2024 04:46

@AlvinZhao-MSFT В агенте сборки Linux в журнале написано: Запуск: Оформление заказа big-javascriptrepo@feature/CQL-HomeMade to s сделано . Afaik, я знаю, что это именно та база кода на сервере Linux, которая сканируется. Но сканирование не запускается, так как я получаю ошибку в задаче инициализации AdvancedSecurity-Codeql-Init@1. Или я неправильно понял ваш вопрос?

Patrik Lindström 23.05.2024 09:38

Я думаю, что ваша текущая файловая структура правильна, и я могу воспроизвести проблему на основе вашего описания. Но я не уверен, как изменить запрос. Могу ли я узнать, работает ли сканирование в вашей локальной среде с помощью CodeQL CLI?

Alvin Zhao - MSFT 23.05.2024 10:43

Я спросил второго пилота, и он думает, даже когда я попросил его дважды проверить, что ключ использования не должен иметь отступ, хотя для обычного хакера YAML он выглядит правильно, потому что он соответствует форматированию в фильтрах запросов, который второй пилот считает правильным. . Другими словами, имя и использование должны находиться на одном уровне отступов. Дайте мне знать, сработает ли это, и я смогу добавить это в качестве ответа вместе с длинным объяснением второго пилота.

housten 28.05.2024 09:37

кстати, привет, Патрик! :D Меня, хотя я не знаком с codeql, беспокоит одна вещь — это пути. Каков путь относительно рабочего каталога или файла конфигурации? Пробовали ли вы поместить переменную build.sourcesdirectory в путь в файле customconfig.yaml? Звучит так, как будто он должен его найти, поскольку вы не получаете ошибку - если только отступ, о котором я упоминал выше, не был введен после того, как использование больше даже не замечается. Хотя Элвин воспроизводит поведение с правильным отступом, и его пути должны приводить к тому, что файл не найден, если относительность является проблемой...

housten 28.05.2024 10:11

@housten Я исправил намерение в своем примере кода. Это был просто плохой копипаст. > Пробовали ли вы поместить переменную build.sourcesdirectory в путь в файле customconfig.yaml? Я не уверен, что смогу это сделать. Поскольку customconfig.yaml предназначен для движка codeql. Относительный путь, если он уже от корня. Но я не думаю, что есть проблема с поиском запроса кода задачи, поскольку он выдает ошибку, когда путь неправильный.

Patrik Lindström 29.05.2024 12:36

Привет @PatrikLindström. Надеюсь, с момента наших последних преобразований все идет хорошо. После внутреннего обсуждения мы предлагаем добавить qlpack для запуска сканирования кода с помощью одного специального запроса. В нынешний документ он действительно не включен, что вызвало некоторую путаницу. Группа разработчиков заметила это, и мы ценим ваше время и усилия, чтобы сообщить об этой проблеме сообществу разработчиков. А сейчас, не могли бы вы попробовать выполнить действия, описанные в моем обновленном ответе ниже? Надеюсь, это сработает и для вас. Еще раз большое спасибо за идеи и обмен информацией. Хороших выходных.

Alvin Zhao - MSFT 31.05.2024 08:30
Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
0
7
288
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Обновлять

Действительно, в документе Microsoft об этом не упоминается, но мы можем решить проблему, добавив файл qlpack.yml в тот же каталог, что и todos.ql, с содержимым ниже. И конвейеру удалось инициализировать базу данных CodeQL и сообщить о проблеме, обнаруженной этим пользовательским запросом.

qlpack.yml

version: 1.0.1
dependencies:
  codeql/javascript-all: "*"
  codeql/javascript-queries: "*"


Я могу воспроизвести ту же проблему с помощью упрощенного запроса CodeQL, конфигурации и определения конвейера ниже.

/.azuredevops/customcodeql/todos.ql (содержимое скопировано из github/codeql; также проверено с некоторыми другими запросами, но безуспешно.)

/**
 * @id js/examples/todocomment
 * @name TODO comments
 * @description Finds comments containing the word TODO
 * @kind problem
 * @problem.severity recommendation
 * @tags comment
 *       TODO
 */

import javascript

from Comment c
where c.getText().regexpMatch("(?si).*\\bTODO\\b.*")
select c, "TODO comments indicate that the code may not be complete."

/.azuredevops/customcodeql/customconfig.yml

name: "Run custom queries"

# When using a configuration file, if you do not disable default queries,
# then the default CodeQL queries in the `code-scanning` query suite will also execute upon analysis.
disable-default-queries: true

# To reference local queries saved to your repository,
# the path must start with `./` followed by the path to the custom query or queries.
# Names for each query referenced is optional.
queries:
  - uses: ./.azuredevops/customcodeql/todos.ql

АОкодеQL.yml

steps:
- task: AdvancedSecurity-Codeql-Init@1
  inputs:
    languages: 'javascript'
    loglevel: '2'
    configfilepath: '$(build.sourcesDirectory)/.azuredevops/customcodeql/customconfig.yml'

Кроме того, я также проверил Руководство по метаданным файла запроса и предупреждающим сообщениям, файл запроса должен быть правильным.

По поводу этой проблемы и вашего требования выполнить собственный запрос Javascript CodeQL для сканирования кода вы можете сообщить о проблеме с результатами в Сообщество разработчиков — Azure DevOps, где группа поддержки может привлечь группу инженеров для получения дополнительной помощи и идей.

Я последовал вашему совету @Alvin Zhao и сообщил об этом сообществу разработчиков Azure DevOps по предоставленной вами ссылке. Также дал ссылку на этот вопрос sso. Спасибо за вашу помощь и поддержку.

Patrik Lindström 23.05.2024 23:34

Привет @PatrikLindström, ценю твое время и усилия. Хороших выходных впереди.

Alvin Zhao - MSFT 24.05.2024 03:20

Ссылка на мой билет сообщества разработчиков, сейчас он в режиме сортировки. Отправлено команде разработчиков: Developercommunity.visualstudio.com/t/…

Patrik Lindström 24.05.2024 08:27

Большое спасибо, что нашли время поделиться новостями.

Alvin Zhao - MSFT 24.05.2024 09:15

Кроме того, возможно, какой-то странный отступ в файле yaml (также из документации msft), который, как я вижу, прокомментировал Хаустен, альтернативным решением может быть упаковать это как пакет ql и ссылаться на него на этапе инициализации.

То, что вы делаете, должно работать, но лично мне больше нравится более модульный подход к созданию пакетов ql, поскольку он упрощает выполнение запросов и пакетов моделей более стандартизированным способом. Это, например, позволяет с минимальными усилиями запускать запросы локально на компьютере разработчика или в других решениях CI/CD.

Это то, что я обычно делаю, и это работает при сканировании, например, в Jenkins.

Ошибка воспроизводилась после устранения проблем с синтаксисом отступов. Пакет ql — это необязательный обходной путь, и в этой теме DC будет обсуждаться, как выполнить один пользовательский запрос. Developercommunity.visualstudio.com/t/…

Alvin Zhao - MSFT 30.05.2024 05:13
Ответ принят как подходящий

tl;dr добавить определение qlpack.yml и дополнительный строковый столбец в запрос todo.ql.

В том же каталоге, где находится запрос todo.ql, добавьте файл yaml, например, с именем qlpack.yml. В этот файл добавьте следующее:

version: 1.0.1
dependencies:
  codeql/javascript-all: "*"
  codeql/javascript-queries: "*"

Мне также пришлось добавить дополнительный столбец в запрос выбора задачи. В противном случае это потерпит неудачу. Здесь я просто добавляю foobar ¯_(ツ)_/¯ . Но следует, конечно, добавить что-то более полезное. Например, вы можете добавить шаблоны, которые берут данные из запроса. См. пример заполнителей здесь.

/**
 * @id js/javascript/todocomment
 * @name TODO_comments
 * @description Finds comments containing the word TODO
 * @kind problem
 * @problem.severity recommendation
 * @tags comment
 *       TODO
 */
import javascript

from Comment c
where c.getText().regexpMatch("(?si).*\\bTODO\\b.*")
select c,"foobar"

Этот ответ основан на решении для билетов сообщества разработчиков и встречи с инженерами GitHub Adv Security.

Другие вопросы по теме

Триггеры ресурсов Azure DevOps Pipeline
Конвейер Azure DevOps Невозможно работать с шаблоном yaml развертывания шаблона ARM для конвейера сборки фабрики данных Azure
Невозможно авторизовать приложение AzureDevOps в фабрике данных Azure
Настройка условий перед развертыванием Azure DevOps при создании конвейеров CI/CD с помощью шаблонов yaml в фабрике данных Azure
В Azure Pipelines определите переменную в пользовательском интерфейсе и используйте это значение переменной в YAML в качестве переменной времени компиляции
Невозможно развернуть конвейер DevOps. Ошибка: нет такого файла или каталога
Azure DevOps. Как найти путь к рабочему каталогу для конкретного zip-файла?
Сбой конвейера при добавлении нескольких ресурсов в файл YAML
Клиент с идентификатором объекта не имеет полномочий на выполнение действия «Microsoft.DataFactory/factories/triggers/write» в области действия
Выходная переменная задачи конвейера Azure DevOps YAML усекает открывающую скобку из строки JSON