Skip to content

IVNSTN/TeamTools.Linter.CommandLine

Repository files navigation

TeamTools Linter CommandLine

Утилита командной строки для выполнения линтинга с поддержкой подключаемых плагинов.

Плагины

Например, IVNSTN/TeamTools.Linter.TSQL для статического анализа кода на T-SQL. Перечень плагинов необходимо указать в конфигурационном файле.

Параметры

Параметр Сокращение Описание
--config -c Путь к конфигурационному файлу
--dir -d Путь к директорию, все файлы которой нужно линтить
--file -f Путь к одному файлу, который нужно линтить
--filelist -l Путь к текстовому файлу, в котором перечислены один или несколько полный путей к файлам, которые нужно линтить.
--output -o Путь к файлу, в который нужно сохранить результат либо console для выдачи обнаруженных замечаний в терминал.
--format -m В каком виде оформить результат: json, sonar или text. Параметр учитывается только если в output указан путь к файлу для сорахнения результата.
--severity -s Минимальный уровень серьезности замечаний, которые должны быть учтены в результате линтинга. По умолчанию - info, то есть все ошибки (error), предупреждения (warning), предложения и информационные сообщения (info или hint). Если требуются только серьёзные замечания, то необходимо передать значение warning (явные ошибки и предупреждения) или error (только явные ошибки). Серьезность замечаний по каждому нарушенному правилу указывается в конфигурации плагина.
--basepath -r Базовый путь к файлам. Если указан, то вместо абсолютных путей к файлам в логе и в итоговом файле будут указаны относительные пути с базой, заданной в этом параметре.
--verbose -v Выводить подробности о ходе выполнения линтинга в консоль
--withversion -n Перед выдачей результата в консоль сначала напечатать номер версии. При вызове с параметром --version никаких других действий выполняться не будет. А с параметром --withversion можно и линтинг запустить, и текущую версию сразу в логе увидеть.
--diff Линтить все файлы, отличающиеся от ветки master. Работает только при запуске на файлах, размещенных в GIT-репозитории. Путь к git.exe должен быть включен в PATH. Вместо этого параметра схожего эффекта можно добиться, предварительно вычислив набор файлов, подлежащих линтингу. Этот список полных путей к файлам нужно сохранить в простой текстовый файл и путь к нему передать в параметре --filelist
--quiet Не устанавливать ненулевой код возврата в случае обнаружения замечаний линтера
--version Вывести номер версии утилиты без выполнения других операций
--help Отобразить список параметров

Примеры вызова

Линтинг диффа по каталогу

.\TeamTools.Linter.CommandLine.exe --dir "c:\source\my_project"  --diff

Дифф вычисляется по Git относительно главной ветки, в итоге сканируются только изменённые файлы. Имя главной ветки можно указать в конфигурационном файле.

Линтинг конкретного файла

.\TeamTools.Linter.CommandLine.exe --file "c:\source\my_project\Stored procedures\dbo.my_proc.sql"

Линтинг всех файлов директории без учета info-сообщений

.\TeamTools.Linter.CommandLine.exe --dir "c:\source\my_project"  --severity warning

Интеграция

Утилитой можно пользоваться напрямую, вызывая её в терминале, а можно встроить в некоторые инструменты.

SSMS External Tool

Выполнить линтинг файла, открытого в текущей вкладке SSM можно с помощью настраиваемого пункта меню. Для создания нового пункта меню зайдите в Tools / External Tools, добавьте новый элемент и настройте как показано ниже.

Command           = <path to exe>\TeamTools.Linter.CommandLine.exe
Arguments         = --file $(ItemPath) --with-version
Initial directory = <пусто>
Use output window = поставьте галочку

в поле "Arguments". В поле "Initial directory" введите путь к директории с исполняемым файлом линтера (такой же как в поле "Command", но без имени файла самого exe). Поставьте галочку "Use output window", остальные пусть останутся снятыми.

Теперь можно линтить файл в открытой вкладке SSMS: нажмите правой клавишей мыши на заголовке открытой вкладки и выберите пункт меню, название которого выбрали для только что добавленного элемента "External tools".

Visual Studio External Tool

Настройка команды для линтинга конкретного файла аналогична приведенной выше для SSMS, здесь же приводится пример для поиска стопперов во всём имеющемся диффе с главной веткой в текущем репозитории:

Command           = <path to exe>\TeamTools.Linter.CommandLine.exe
Arguments         = --diff --severity warning --with-version
Initial directory = $(SolutionDir)
Use output window = поставьте галочку

SourceTree Custom Action

Откройте пункт меню Tools/Options в SourceTree, выберите вкладку "Custom actions" и добавьте новый элемент в список. Далее введите полный путь к исполняемому файлу линтера в поле "Script to run" и приведенную ниже строку в поле "Parameter":

--file "$REPO\$FILE" --severity warning --verbose

Теперь можно линтить выбранный файл прямо из интерфейса SourceTree.

GIT hook

Измененные файлы можно автоматически линтить перед пушем или даже перед коммитом. Для этого добавьте в соответствующее событие вызов скрипта, пример которого приведен ниже. В качестве первого и единственного параметра передайте ему полный путь к папке, в которой находится TeamTools.Linter.CommandLine.exe Чтобы результат был похожим на линтинг в пайплайне CI, можно ограничить минимальную серьезность замечаний при помощи параметра --severity.

#!/bin/bash

linter_folder="$1"
echo "linter: $linter_folder"

repo_path="$(git rev-parse --show-toplevel)"
echo "repository: $repo_path"

"$linter_folder/TeamTools.Linter.CommandLine.exe" \
    --config "$linter_folder/DefaultConfig.json" \
    --dir "$repo_path" \
    --basepath "$repo_path" \
    --output console \
    --severity warning \
    --diff \
    --withversion

last_exit_code=$?

if [ $last_exit_code -ne 0 ]; then
    echo "======="
    echo "Linting failed. See errors and warnings above."
    echo "All the stoppers must be fixed before pushing branch to server."
    echo "======="

    exit $last_exit_code
fi

CI pipeline

В пайплайн сборки утилита интегрируется схожим образом: сконструируйте консольный вызов с нужными параметрами и добавьте этот вызов в качестве шага пайплайна. Если не нужно, чтобы обнаружение замечаний роняло билд (например вы отдаете принятие решения на откуп Quality Gate в SonarQube), то добавьте параметр --quiet и тогда ExitCode всегда будет 0.