Вебинар: C# разработка и статический анализ: в чем практическая польза? - 18.11
Как известно, нашими клиентами являются разработчики. А разработчики могут неожиданно приятно удивлять. К примеру, один из наших пользователей написал свой собственный скрипт, который позволяет настроить рассылку email-сообщений об ошибках, найденных PVS-Studio. Отличие данного скрипта от нашего инструмента blame-notifier заключается в том, что он не требует установки .NET Core на Linux. Мы решили написать небольшую заметку про этот Perl-скрипт, т. к. считаем, что он может пригодиться кому-то еще.
Perl-скрипт, о котором пойдёт речь в этой заметке, опубликован на github под лицензией GPL-2.0, поэтому воспользоваться им может любой желающий.
Основной его функционал заключается в том, что он уведомляет о проблемах, найденных PVS-Studio, путем рассылки email. Можно сказать, что это практически аналог нашего инструмента blame-notifier. Электронное письмо, которое отправляет Perl-скрипт, формируется в HTML-формате и отправляется автору коммита. Информация о коммите и его авторе извлекается из Git. Стоит заметить, что для отправки email есть ряд настроек, которые мы рассмотрим чуть позже.
Скрипт сохраняет все предупреждения в базе данных (которую нужно будет настроить заранее), чтобы иметь возможность отправлять уведомления не обо всех проблемах, а только о новых обнаруженных ошибках.
Также есть возможность добавления к письму вложений. К примеру, к email можно прикрепить полный лог ошибок, обнаруженных PVS-Studio.
Конечно, есть ряд предварительных настроек, которые необходимо сделать для того, чтобы скриптом можно было воспользоваться.
Во-первых, проект должен использовать систему контроля версий Git, так как скрипт извлекает всю необходимую информацию об авторе коммита через git blame / git annotate.
Во-вторых, необходимо настроить базу данных для того, чтобы скрипт мог автоматически сохранять там найденные ошибки и, соответственно, отправлять email только для новых ошибок. Если вы хотите получать уведомления обо всех ошибках в проекте, а не только о новых – такое тоже возможно. В разделе "Варианты использования" я напишу об этом чуть подробнее.
В-третьих, необходимо настроить почту для отправки электронных писем, если у вас она еще не настроена. Этот пункт я тоже детально разберу в разделе "Настройка почты".
И самое последнее – необходимо, чтобы в операционной системе был установлен Perl. Но называть это требованием не совсем верно, т. к. обычно Perl бывает установлен на каждой ОС Linux.
Приступим к рассмотрению процесса настройки более подробно. Установку я буду производить на своей виртуальной машине, на которой установлен дистрибутив Linux openSUSE. Кстати, в файле README git-репозитория вы можете посмотреть настройку под Debian, но процесс почти ничем не отличается.
Итак, перед настройкой нам необходимо будет клонировать репозиторий с github.
Для того чтобы воспользоваться скриптом, нам понадобится установить следующие модули (указаны необходимые модули для openSUSE):
Сделать это можно командой:
$> sudo zypper install perl-DBI
perl-DBD-mysql
perl-MIME-Lite
perl-YAML
perl-List-MoreUtils
perl-FindBin-Real
А данные модули вы можете установить по желанию. Они упростят вам работу с кодом, но на работоспособность скрипта никак не повлияют:
Для настройки отправления почты воспользуемся msmtp. Установка производится командой:
$> sudo zypper install msmtp msmtp-mta
После установки необходимо создать файл /etc/msmtprc. Файл должен содержать настройки почты. К примеру, для Yandex-почты данный файл будет выглядеть таким образом:
# Set default values for all following accounts.
defaults
auth on
tls on
tls_starttls on
tls_certcheck off
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile /var/log/msmtp.log
# Account
account default
host smtp.yandex.ru
port 587
auth on
keepbcc on
from email@yandex.ru
user email@yandex.ru
password emailpassword
# Set a default account
account default: default
# Map local users to mail addresses (for crontab)
aliases /etc/aliases
Файл msmtp.log, в который скрипт будет записывать логи, вам нужно будет также создать самостоятельно.
Также для отправки почты вам потребуется включить протоколы POP3 и IMAP в настройках вашего почтового ящика.
На этом настройку почты можно считать завершенной. Чтобы убедиться, что все работает, вы можете отправить тестовое сообщение:
$> echo "test message" | mail -s "test" email@yandex.com
Далее нам необходимо настроить любую из баз данных, которая будет поддерживаться Perl. Возьмем MariaDB, как и предлагает автор скрипта.
Установить ее можно командой:
$> sudo zypper install mariadb
Затем необходимо сделать:
$> sudo rcmysql start
$> sudo mysql_secure_installation
После установки нам необходимо создать новую базу данных с именем blame и нового пользователя с таким же именем:
$> sudo mysql
mysql> CREATE DATABASE blame;
mysql> GRANT ALL on blame.* TO 'blame'@'localhost' IDENTIFIED BY
'secret_mysql_password';
mysql> quit
Базу данных необходимо будет запустить перед запуском скрипта.
Perl-скрипт будет искать конфигурационный файл в двух местах:
Если будут найдены оба файла, то файл, находящийся в домашней директории (home), переопределит файл с глобальными настройками.
Содержимое файла должно иметь YAML-формат:
---
# database connection string
dsn: DBI:mysql:blame
# database username
username: blame
# database password
password: secret_mysql_password
# smtp sender address
smtp_from: email@yandex.ru
# smtp subject
smtp_subject: New PVS Issues
# path substitution
path_search: '/root/src/src/'
path_replace: ''
Стоит обратить внимание на то, что данный файл содержит конфиденциальные данные и не должен быть доступен для чтения всем пользователям.
Perl-скрипт в качестве входного параметра принимает путь до файла в формате errorfile, полученный в результате конвертации вывода анализатора через утилиту PlogConverter. Более подробно почитать про данную утилиту вы можете здесь.
К примеру, у нас есть отчёт о проверке PVS-Studio (назовём его report.plog). Получить файл, необходимый для работы Perl-скрипта, мы можем, задав PlogConverter-у следующую команду:
plog-converter report.plog -t errorfile -o report.txt
Теперь, чтобы запустить Perl-скрипт, нам необходимо выполнить следующую команду:
$> ./blame-notifier.pl < report.txt
Содержимое письма, которое придёт на почту, будет примерно следующим:
Помимо этого, существует ряд дополнительных параметров, которые позволят более гибко использовать скрипт. Для того чтобы получить больше информации, вы можете воспользоваться опцией -h.
Давайте рассмотрим некоторые примеры использования с дополнительными опциями.
По умолчанию скрипт группирует предупреждения анализатора по автору и отсылает на почту, которая извлекается скриптом командой git annotate. Помимо этого, вы можете изменить поведение так, чтобы получать уведомления от всех авторов, переопределив их почтовые адреса. Сделать это можно, указав при запуске опцию -r <your.email>:
$> ./blame-notifier.pl -r email@yandex.ru < report.txt
При каждом запуске скрипта обновляется база данных и формируется email-рассылка со свежими предупреждениями анализатора. Если вы не хотите ограничиваться отправкой рассылки только с новыми предупреждениями, то вы можете воспользоваться опцией -d. В таком случае к базе данных применится команда SQL DROP TABLE, и скрипт разошлет уведомления обо всех предупреждениях PVS-Studio.
$> ./blame-notifier.pl -d -r email@yandex.ru < report.txt
Помимо обычного уведомления, вы можете еще прикреплять к письму вложения (например, сам отчет или его html-вариант). Для использования такой возможности передайте скрипту при запуске опцию -a, которая принимает список файлов, разделенных запятыми:
$> ./blame-notifier.pl -a 'report.txt,report.html' < report.txt
И, наконец, если вы хотите увидеть в консоли подробный вывод того, что сейчас происходит, вы можете передать скрипту опцию -v.
Если вы не хотите устанавливать .NET Core на Linux – вы можете присмотреться к данному Perl-скрипту. Возможно, вы захотите использовать именно его вместо официального решения. Во всяком случае, теперь вы точно знаете, что такой способ тоже есть.
Однако обращаем ваше внимание на то, что за данное решение мы не несем ответственности и не гарантируем, что в случае изменений логов или форматов файлов автор скрипта будет поддерживать какую-либо совместимость с предыдущими версиями.
И, напоследок, важное примечание: автор скрипта не рекомендует запускать его под root, т. к. это потребует хранения конфигурационных файлов в домашнем каталоге пользователя. Вместо этого вы можете запускать анализ PVS-Studio в контейнере Docker.
0