Автоматическая проверка кода на Go


В прошлый раз, я уже писал небольшую инструкцию про то, как настроить автоматическую проверку кода с помощью pronto. Это отличный инструмент, который позволяет проверить качество кода при помощи всевозможных линтеров и получить результат в виде комментариев на GitHub или GitLab. Но, он написан на Ruby, следовательно, подключить его к проектам на других языках программирования, не представляется возможным. Поэтому, я начал искать альтернативу и нашел - reviewdog.

reviewdog

В отличие от pronto, reviewdog написан на Go. Его можно скомпилировать и подключить к любому проекту, вне зависимости от языка программирования.

Также, он может работать с любыми линтерами, достаточно лишь перенаправить результат работы линтера на вход reviewdog и определить формат сообщения. Для этого, reviewdog нужно запустить с флагом -efm и передать в качестве параметра строку вида: "%f:%l:%c: %m". Для примера, возьмем golint:

$ golint ./... | reviewdog -efm="%f:%l:%c: %m" -diff="git diff master"

Флаг -diff обязателен лишь для локального запуска, он позволяет отфильтровать результат и вывести сообщения только для новых изменений.

Чтобы постоянно не определять формат для каждого линтера, reviewdog поставляется с уже предопределенными форматами. Список можно получить, запустив его с флагом -list:

$ reviewdog -list
eslint		(eslint [-f stylish]) A fully pluggable tool for identifying and reporting on patterns in JavaScript	- https://github.com/eslint/eslint
eslint-compact	(eslint -f compact) A fully pluggable tool for identifying and reporting on patterns in JavaScript	- https://github.com/eslint/eslint
golint		linter for Go source code										- https://github.com/golang/lint
govet		Vet examines Go source code and reports suspicious problems						- https://golang.org/cmd/vet/
pep8		Python style guide checker										- https://pypi.python.org/pypi/pep8
phpstan		(phpstan --errorFormat=raw) PHP Static Analysis Tool - discover bugs in your code without running it!	- https://github.com/phpstan/phpstan
rubocop		A Ruby static code analyzer, based on the community Ruby style guide					- https://github.com/bbatsov/rubocop
sbt		the interactive build tool										- http://www.scala-sbt.org/
sbt-scalastyle	Scalastyle - SBT plugin											- http://www.scalastyle.org/sbt.html
scalac		Scala compiler												- http://www.scala-lang.org/
scalastyle	Scalastyle - Command line										- http://www.scalastyle.org/command-line.html
stylelint	A mighty modern CSS linter										- https://github.com/stylelint/stylelint
tsc		TypeScript compiler											- https://www.typescriptlang.org/
tslint		An extensible linter for the TypeScript language							- https://github.com/palantir/tslint
checkstyle	checkstyle XML format											- http://checkstyle.sourceforge.net/

Список небольшой, но он включает все популярные линтеры для разных языков программирования. Теперь, вместо определения формата, можно передать его название с помощью флага -f:

$ golint ./... | reviewdog -f=golint -diff="git diff master"

Этот же формат можно использовать и для других линтеров, например для golangci-lint:

$ golangci-lint run | reviewdog -f=golint -diff="git diff master"

Отдельно стоит упомянуть поддержку XML-формата checkstyle. С его помощью можно работать с такими линтерами, как например gometalinter:

$ gometalinter --checkstyle | reviewdog -f=checkstyle -diff="git diff master"

Для более удобного запуска нескольких линтеров, reviewdog поддерживает конфигурационные файлы следующего формата:

# .reviewdog.yml
runner:
  <tool-name>:
    cmd: <command> # (required)
    errorformat: # (optional if there is supporeted format for <tool-name>. see reviewdog -list)
      - <list of errorformat>
    name: <tool-name> # (optional. you can overwrite <tool-name> defined by runner key)

  # examples
  golint:
    cmd: golint ./...
    errorformat:
      - "%f:%l:%c: %m"
  govet:
    cmd: go tool vet -all -shadowstrict .

Теперь достаточно просто запустить reviewdog и он сам все сделает:

$ reviewdog -diff="git diff master"

По умолчанию reviewdog выводит весь результат работы в консоль. Для того, чтобы опубликовать результат на GitHub, нужно объявить переменную окружения REVIEWDOG_GITHUB_API_TOKEN и запустить reviewdog с флагом -reporter=github-pr-review:

$ export REVIEWDOG_GITHUB_API_TOKEN="<token>"
$ reviewdog -reporter=github-pr-review

В таком случае флаг -diff уже не нужен, reviewdog получит необходимые данные из переменных окружения:

$ export CI_PULL_REQUEST=7
$ export CI_REPO_OWNER=mgrachev
$ export CI_REPO_NAME=gastly
$ export CI_COMMIT=$(git rev-parse HEAD)

На этом плюсы reviewdog не заканчиваются, т.к. он из коробки поддерживает несколько популярных CI, таких как: Travis CI, Circle CI и GitLab CI. Если вы используете один из этих сервисов, то вам не нужно объявлять эти переменные окружения.

Это лишь малая часть тех возможностей, на что способен reviewdog. Более подробную информацию можно получить на странице проекта haya14busa/reviewdog.

Похожие записи

Docker for Mac и Kubernetes

Небольшой эксперимент с Docker for Mac и Kubernetes.

Автоматическая проверка кода с помощью Vexor

Пошаговая инструкция, что для этого нужно сделать.

Управление зависимостями через Homebrew

Управление внешними зависимостями проекта c помощью Homebrew Bundle.

Класс Set и уникальные коллекции объектов

Рассмотрим решение одной задачи с использованием класса Set и DDD.

Настройка Passenger для работы с Action Cable

Решаем проблему работы WebSocket-сервера через Phusion Passenger.

Настройка Rails-сервера на DigitalOcean

Настройка боевого Rails-сервера на DigitalOcean. Шаг за шагом.

Резервное копирование GitLab с помощью rsync

Мини-проект для автоматического резервного копирования GitLab c помощью Ruby и rsync.

Настройка Rails-окружения на OS X Yosemite

Полноценное рабочее окружение на OS X 10.10 Yosemite: Ruby, Homebrew, Oh My ZSH, rbenv и многое другое.