An open API service indexing awesome lists of open source software.

https://github.com/ivnstn/teamtools.linter.commandline

Static code analysis tool for T-SQL scripts and SSDT projects
https://github.com/ivnstn/teamtools.linter.commandline

code-analysis-tool code-quality code-smell database linter rdl sql-server ssdt static-analysis tsql

Last synced: about 2 months ago
JSON representation

Static code analysis tool for T-SQL scripts and SSDT projects

Awesome Lists containing this project

README

          


# TeamTools Linter CommandLine

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

## Плагины

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

## Параметры

|Параметр|Сокращение|Описание|
|-|-|-|
| `--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` | | Отобразить список параметров

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

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

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

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

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

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

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

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

## Интеграция

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

### SSMS External Tool

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

```ini
Command = \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, здесь же приводится пример
для поиска стопперов во всём имеющемся диффе с главной веткой в текущем репозитории:

```ini
Command = \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`.

```sh
#!/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.