From 3fb7bc99a32a37593d6695de855d0e6034b22bc8 Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Mon, 6 May 2019 14:08:54 +0300 Subject: [PATCH 1/6] =?UTF-8?q?=D0=A0=D0=B5=D0=B0=D0=BB=D0=B8=D0=B7=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BE=20=D1=84=D0=BE=D1=80=D0=BC=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BE=D1=82=D1=87=D0=B5?= =?UTF-8?q?=D1=82=D0=B0=20=D0=B8=20=D1=81=D0=BE=D1=85=D1=80=D0=B0=D0=BD?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20=D0=B2=20=D1=84=D0=BE=D1=80=D0=BC?= =?UTF-8?q?=D0=B0=D1=82=D0=B5=20json?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- ...20\236\321\202\321\207\320\265\321\202.os" | 259 ++++++++++++++++++ ...21\201\321\202\320\265\320\274\321\213.os" | 2 + ...20\241\320\276\320\275\320\260\321\200.os" | 96 +++++++ 3 files changed, 357 insertions(+) create mode 100644 "src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" new file mode 100644 index 0000000..e7f1eaa --- /dev/null +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" @@ -0,0 +1,259 @@ +Перем Лог; + +Перем Токен; +Перем АдресСервера; +Перем РодительскийПроект; +Перем Проекты; +Перем Метрики; +Перем ПутьКОтчету; +Перем ФорматОтчета; + +/////////////////////////////////////////////////////////////////////////////////////////////////// +// Прикладной интерфейс +/////////////////////////////////////////////////////////////////////////////////////////////////// + +Процедура ЗарегистрироватьКоманду(Знач ИмяКоманды, Знач Парсер) Экспорт + + ОписаниеКоманды = Парсер.ОписаниеКоманды(ИмяКоманды, "Формирует отчет по проекту/списку проектов"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--token", "Токен для авторизации на сервере SonarQube"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--server", "Адрес сервера SonarQube (например http://my.sonar.server:9000)"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--projects", "Ключ проектов, строкой через запятую (например hrm:develop,buh)"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--total-metrics", "Вывод в отчет метрик по проекту. + | Нужные метрики передаются строкой через запятую. + | Возможные значения: + | + | По умолчанию выводятся все метрики"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--report-path", "Путь для сохранения отчета"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--report-format", "Формат сохраняемого отчета. + | Возможные варианнты: + | HTML - создает html - страницу + | JSON - выгружает файл json + | + | По умолчанию используется формат JSON"); + Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--cfg-file", "Путь к конфигурационному файлу в формате json (utf-8), свойства объекта соответствуют ключам запуска. + | Пример конфигурационного файла находится в каталоге examples"); + + Парсер.ДобавитьКоманду(ОписаниеКоманды); + +КонецПроцедуры + +// Выполняет логику команды +// +// Параметры: +// ПараметрыКоманды - Соответствие - Соответствие ключей командной строки и их значений +// ДополнительныеПараметры - Соответствие - (необязательно) дополнительные параметры +// +Функция ВыполнитьКоманду(Знач ПараметрыКоманды, Знач ДополнительныеПараметры = Неопределено) Экспорт + + Лог = ДополнительныеПараметры.Лог; + ОшибокНет = ПрочитатьПараметрыЗапуска(ПараметрыКоманды); + Если НЕ ОшибокНет Тогда + Возврат СообщитьОбОшибке("Ошибка запуска"); + КонецЕсли; + + Если ПустаяСтрока(ПутьКОтчету) Тогда + ПутьКОтчету = ОбъединитьПути(".", "report." + НРег(ФорматОтчета)); + КонецЕсли; + + Лог.Информация("Получение информации о проектах"); + ПроектыSQ = Сонар.ПолучитьПроекты(АдресСервера, Токен); + + КоллекцияОтчетов = СоздатьКоллекциюОтчетов(); + Лог.Информация("Формирование отчетов по проектам"); + + КоллекцияПроектов = СтрРазделить(Проекты, ",", Ложь); + + Для Каждого Проект Из КоллекцияПроектов Цикл + Лог.Информация(" Формирование отчета для проекта `%1`", Проект); + ОписаниеПроекта = ПроектыSQ.Получить(СокрЛП(Проект)); + Если ОписаниеПроекта = Неопределено Тогда + Лог.Ошибка(" Проект `%1` не обнаружен", Проект); + Продолжить; + КонецЕсли; + + КоллекцияОтчетов.Отчеты.Добавить(СоздатьОтчет(ОписаниеПроекта, Сонар.ПолучитьМетрикиПроекта(АдресСервера, Токен, ОписаниеПроекта, Метрики))); + + КонецЦикла; + + КоллекцияОтчетов.Количество = КоллекцияОтчетов.Отчеты.Количество(); + + Лог.Информация("Сохранение отчетов в файл '%1'", ПутьКОтчету); + СформироватьОтчет(КоллекцияОтчетов); + + Возврат МенеджерКомандПриложения.РезультатыКоманд().Успех; + +КонецФункции + +/////////////////////////////////////////////////////////////////////////////////////////////////// + +Функция ПрочитатьПараметрыЗапуска(ПараметрыКоманды) + + МаксимальноеКоличествоСтатусов = 5; + ОшибокНет = Истина; + + Токен = ПараметрыКоманды["--token"]; + АдресСервера = ПараметрыКоманды["--server"]; + Проекты = ПараметрыКоманды["--projects"]; + Метрики = ПараметрыКоманды["--total-metrics"]; + ПутьКОтчету = ПараметрыКоманды["--report-path"]; + ФорматОтчета = ПараметрыКоманды["--report-format"]; + + ПутьККонфигурационномуФайлу = ПараметрыКоманды["--cfg-file"]; + Если ПутьККонфигурационномуФайлу <> Неопределено Тогда + + Файл = Новый Файл(ПутьККонфигурационномуФайлу); + Если Файл.Существует() Тогда + ТекстовыйДокумент = Новый ТекстовыйДокумент(); + ТекстовыйДокумент.Прочитать(ПутьККонфигурационномуФайлу); + Лог.Отладка("Содержимое конфигурационного файла: %1%2", Символы.ПС, ТекстовыйДокумент.ПолучитьТекст()); + JSON = Новый ЧтениеJSON(); + JSON.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст()); + ПараметрыИзФайла = ПрочитатьJSON(JSON, Истина); + Если Токен = Неопределено Тогда + Токен = ПараметрыИзФайла.Получить("--token"); + КонецЕсли; + Если АдресСервера = Неопределено Тогда + АдресСервера = ПараметрыИзФайла.Получить("--server"); + КонецЕсли; + Если Проекты = Неопределено Тогда + Проекты = ПараметрыИзФайла.Получить("--projects"); + КонецЕсли; + Если Метрики = Неопределено Тогда + Метрики = ПараметрыИзФайла.Получить("--total-metrics"); + КонецЕсли; + Если ПутьКОтчету = Неопределено Тогда + ПутьКОтчету = ПараметрыИзФайла.Получить("--report-path"); + КонецЕсли; + Если ФорматОтчета = Неопределено Тогда + ФорматОтчета = ПараметрыИзФайла.Получить("--report-format"); + КонецЕсли; + Иначе + Лог.Ошибка("Конфигурационный файл по пути `%1` не обнаружен", ОбернутьЗначениеДляПечати(ПутьККонфигурационномуФайлу)); + ОшибокНет = Ложь; + КонецЕсли; + + КонецЕсли; + + Лог.Отладка("Прочитанные параметры:"); + Лог.Отладка(" Токен = `%1`", ОбернутьЗначениеДляПечати(Токен)); + Лог.Отладка(" Адрес сервера = `%1`", ОбернутьЗначениеДляПечати(АдресСервера)); + Лог.Отладка(" Ключи проектов = `%1`", ОбернутьЗначениеДляПечати(Проекты)); + Лог.Отладка(" Метрики проекта = `%1`", ОбернутьЗначениеДляПечати(Метрики)); + Лог.Отладка(" Путь к отчету = `%1`", ОбернутьЗначениеДляПечати(ПутьКОтчету)); + Лог.Отладка(" Формат отчета = `%1`", ОбернутьЗначениеДляПечати(ФорматОтчета)); + + Если Не ЗначениеЗаполнено(Токен) Тогда + Лог.Ошибка("Не указан токен для авторизации"); + ОшибокНет = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(АдресСервера) Тогда + Лог.Ошибка("Не указан адрес сервера SonarQube"); + ОшибокНет = Ложь; + КонецЕсли; + + Если Не ЗначениеЗаполнено(Проекты) Тогда + Лог.Ошибка("Не указан ключ(-и) проекта(-ов)"); + ОшибокНет = Ложь; + КонецЕсли; + + Метрики = ПолучитьПравильныеМетрики(Метрики, ОшибокНет); + + Если Не ЗначениеЗаполнено(ПутьКОтчету) Тогда + ПутьКОтчету = ""; + КонецЕсли; + + Если Не ЗначениеЗаполнено(ФорматОтчета) Тогда + ФорматОтчета = "JSON"; + Иначе + ФорматОтчета = ПолучитьПравильныйФорматОтчета(ФорматОтчета, ОшибокНет); + КонецЕсли; + + Возврат ОшибокНет; + +КонецФункции + +Функция ОбернутьЗначениеДляПечати(Знач Значение) + Если ЗначениеЗаполнено(Значение) Тогда + Возврат Строка(Значение); + КонецЕсли; + Возврат "<Незаполнено>"; +КонецФункции + +Функция СообщитьОбОшибке(ТекстОшибки) + + Лог.Ошибка(ТекстОшибки); + Возврат МенеджерКомандПриложения.РезультатыКоманд().ОшибкаВремениВыполнения; + +КонецФункции + +Функция ПолучитьПравильныйФорматОтчета(Знач ВыбранныйФорматОтчета, ОшибокНет) + + ВРЕГВыбранныйФорматОтчета = ВРЕГ(ВыбранныйФорматОтчета); + Если НЕ (ВРЕГВыбранныйФорматОтчета = "HTML" ИЛИ ВРЕГВыбранныйФорматОтчета = "JSON") Тогда + + ОшибокНет = Ложь; + Лог.Ошибка("Указан неизвестный формат отчета `%1`", ОбернутьЗначениеДляПечати(ВыбранныйФорматОтчета)); + + КонецЕсли; + + Возврат ВРЕГВыбранныйФорматОтчета; + +КонецФункции + +Функция ПолучитьПравильныеМетрики(Знач ВыбранныеМетрики, ОшибокНет) + + ПравильныеМетрики = Новый Структура(); + МетрикиШаблон = Сонар.ДоступныеМетрики(); + Если ПустаяСтрока(ВыбранныеМетрики) Тогда + Для Каждого Метрика Из МетрикиШаблон Цикл + ПравильныеМетрики.Вставить(Метрика.Ключ, ""); + КонецЦикла; + Иначе + КоллекцияМетрик = СтрРазделить(ВыбранныеМетрики, ",", Ложь); + Для Каждого Метрика Из КоллекцияМетрик Цикл + Если МетрикиШаблон.Свойство(СокрЛП(Метрика)) Тогда + ПравильныеМетрики.Вставить(СокрЛП(Метрика), 0); + Иначе + ОшибокНет = Ложь; + Лог.Ошибка("Указана неизвестная метрика `%1`", ОбернутьЗначениеДляПечати(Метрика)); + КонецЕсли; + КонецЦикла; + КонецЕсли; + + Возврат ПравильныеМетрики; + +КонецФункции + +Функция СоздатьКоллекциюОтчетов() + + Результат = Новый Структура(); + Результат.Вставить("ДатаФормирования", ТекущаяДата()); + Результат.Вставить("СерверSonarQube", АдресСервера); + Результат.Вставить("Количество", 0); + Результат.Вставить("Отчеты", Новый Массив()); + + Возврат Результат; + +КонецФункции + +Функция СоздатьОтчет(ОписаниеПроекта, МетрикиПроекта) + + Результат = Новый Структура(); + Результат.Вставить("КлючПроекта", ОписаниеПроекта.Код); + Результат.Вставить("Метрики", МетрикиПроекта); + + Возврат Результат; + +КонецФункции + +Процедура СформироватьОтчет(КоллекцияОтчетов) + + Если ФорматОтчета = "JSON" Тогда + ЗаписьJSON = Новый ЗаписьJSON(); + ЗаписьJSON.ОткрытьФайл(ПутьКОтчету); + ЗаписатьJSON(ЗаписьJSON, КоллекцияОтчетов); + ЗаписьJSON.Закрыть(); + КонецЕсли; + +КонецПроцедуры diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" index 23a4dcd..57b546b 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" @@ -49,6 +49,7 @@ ВозможныеКомандыПриложения.Вставить("Помощь", "help"); ВозможныеКомандыПриложения.Вставить("ПоказатьВерсию", "version"); ВозможныеКомандыПриложения.Вставить("ЗакрытьИшузы", "issue-resolver"); + ВозможныеКомандыПриложения.Вставить("СгенерироватьОтчет", "report"); ВозможныеКомандыПриложения = Новый ФиксированнаяСтруктура(ВозможныеКомандыПриложения); @@ -63,6 +64,7 @@ КлассыРеализацииКоманд[ВозможныеКоманды().Помощь] = "КомандаСправкаПоПараметрам"; КлассыРеализацииКоманд[ИмяКомандыВерсия()] = "КомандаVersion"; КлассыРеализацииКоманд[ВозможныеКоманды().ЗакрытьИшузы] = "КомандаЗакрытьИшузы"; + КлассыРеализацииКоманд[ВозможныеКоманды().СгенерироватьОтчет] = "КомандаСгенерироватьОтчет"; //... //КлассыРеализацииКоманд["<имя команды>"] = "<КлассРеализации>"; diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\275\320\260\321\200.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\275\320\260\321\200.os" index 01d9e26..dc80d85 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\275\320\260\321\200.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\241\320\276\320\275\320\260\321\200.os" @@ -338,6 +338,101 @@ КонецПроцедуры +// ПолучитьМетрикиПроекта +// Возвращает набор метрик проекта +// Параметры: +// АдресСервера - Строка - Адрес (хост) сервера SonarQube +// Токен - Строка - Токен пользователя, от имени которого выполняются запросы к API +// ОписаниеПроекта - Структура - Описание проекта SonarQube +// * Идентификатор - Строка - Идентификатор проекта +// * Код - Строка - Код (Ключ) проекта +// ТребуемыеМетрики - Структура - Метрики, которые необходимо получить +// +// Возвращаемое значение: +// Структура - Метрики и их значения +// +Функция ПолучитьМетрикиПроекта(АдресСервера, Токен, ОписаниеПроекта, Знач ТребуемыеМетрики) Экспорт + + МетрикиСтрокой = ""; + Для Каждого Метрика Из ТребуемыеМетрики Цикл + МетрикиСтрокой = МетрикиСтрокой + ?(ПустаяСтрока(МетрикиСтрокой), "", ",") + Метрика.Ключ; + КонецЦикла; + + Метрики = Новый Структура(); + ДоступныеМетрики = ДоступныеМетрики(); + + URL = "measures/component?metricKeys=" + МетрикиСтрокой + "&component=" + ОписаниеПроекта.Код; + Ответ = ВыполнитьЗапрос(АдресСервера, Токен, URL, "GET"); + + Для Каждого Метрика Из Ответ.component.measures Цикл + + ЗначениеМетрики = ""; + Если Метрика.Свойство("value") Тогда + ЗначениеМетрики = Метрика.value; + ИначеЕсли Метрика.Свойство("periods") И Метрика.periods.Количество() Тогда + ЗначениеМетрики = Метрика.periods[0].value; + Иначе + Сообщить(Метрика.metric); + Продолжить; + КонецЕсли; + + Метрики.Вставить(СтрЗаменить(ДоступныеМетрики[Метрика.metric], " ", "_"), ЗначениеМетрики); + Метрики.Вставить(Метрика.metric, ЗначениеМетрики); + + КонецЦикла; + + Для Каждого ТребуемаяМетрика Из ТребуемыеМетрики Цикл + Если Не Метрики.Свойство(ТребуемаяМетрика.Ключ) Тогда + Метрики.Вставить(СтрЗаменить(ДоступныеМетрики[ТребуемаяМетрика.Ключ], " ", "_"), null); + Метрики.Вставить(ТребуемаяМетрика.Ключ, null); + КонецЕсли; + КонецЦикла; + + Возврат Метрики; + +КонецФункции + +// ДоступныеМетрики +// Возвращает коллекцию доступных метрик проекта +// Возвращаемое значение: +// Структура - Коллекция имен метрик +// +Функция ДоступныеМетрики() Экспорт + + Результат = Новый Структура(); + Результат.Вставить("bugs", "Ошибки"); + Результат.Вставить("new_bugs", "Ошибки в новом коде"); + Результат.Вставить("violations", "Замечания"); + Результат.Вставить("new_violations", "Замечания в новом коде"); + Результат.Вставить("ncloc", "Строки кода"); + Результат.Вставить("alert_status", "Порог качества"); // OK ERROR WARRING + Результат.Вставить("security_rating", "Рейтинг безопасности"); // A B C D E числами + Результат.Вставить("reliability_rating", "Рейтинг надежности"); // A B C D E числами + Результат.Вставить("sqale_index", "Технический долг"); // в мин + Результат.Вставить("open_issues", "Открытые замечания"); + Результат.Вставить("reopened_issues", "Переоткрытые замечания"); + Результат.Вставить("wont_fix_issues", "Неактуальные замечания"); + Результат.Вставить("false_positive_issues", "Ложное срабатывание"); + Результат.Вставить("cognitive_complexity", "Когнитивная сложность"); + Результат.Вставить("complexity", "Цикломатическая сложность"); + Результат.Вставить("confirmed_issues", "Подтвержденные замечания"); + Результат.Вставить("blocker_violations", "Блокирующие замечания"); + Результат.Вставить("new_blocker_violations", "Блокирующие замечания в новом коде"); + Результат.Вставить("critical_violations", "Критические замечания"); + Результат.Вставить("new_critical_violations", "Критические замечания в новом коде"); + Результат.Вставить("info_violations", "Информационные замечания"); + Результат.Вставить("new_info_violations", "Информационные замечания в новом коде"); + Результат.Вставить("major_violations", "Важные замечания"); + Результат.Вставить("new_major_violations", "Важные замечания в новом коде"); + Результат.Вставить("minor_violations", "Незначительные замечания"); + Результат.Вставить("new_minor_violations", "Незначительные замечания в новом коде"); + Результат.Вставить("duplicated_blocks", "Дублирующиеся участки кода"); + Результат.Вставить("new_duplicated_blocks", "Дублирующиеся участки в новом коде"); + + Возврат Результат; + +КонецФункции + /////////////////////////////////////////////////////////////////// // Слубные процедуры и функции /////////////////////////////////////////////////////////////////// @@ -378,6 +473,7 @@ Если ОтветHTTP.КодСостояния = 200 Тогда json = Новый ЧтениеJSON(); json.УстановитьСтроку(ОтветHTTP.ПолучитьТелоКакСтроку()); + // Сообщить(ОтветHTTP.ПолучитьТелоКакСтроку()); Возврат ПрочитатьJson(json); КонецЕсли; From 5794a7c024ce4a39b518bc4f41bf7434c9010cd0 Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Mon, 6 May 2019 14:23:28 +0300 Subject: [PATCH 2/6] #ONECICD-91 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Убрал заготовку поддержки HTML, добавил пример конфигурационного файла и добавил запись README --- README.md | 4 +++ examples/example-report.cfg-file.json | 8 +++++ ...20\236\321\202\321\207\320\265\321\202.os" | 34 ++++++++++++++++--- 3 files changed, 42 insertions(+), 4 deletions(-) create mode 100644 examples/example-report.cfg-file.json diff --git a/README.md b/README.md index 91fb0e5..a2cd989 100644 --- a/README.md +++ b/README.md @@ -36,3 +36,7 @@ SonarQube может создавать несколько замечаний п **Пример 3:** В родительском проекте есть 3 замечания на строке, исправлено два. В дочернем тоже 3 замечания, исправленных 1. В результате - в дочернем проекте будет закрыто еще одно замечание, и общее количество закрых станет 2. **Пример 4:** В родительском проекте есть 3 замечания на строке, исправлено два. В дочернем 4 замечания, исправленных 1. В результате - в дочернем проекте не будет закрыто ни одного нового замечния. + +### Отчет по проектам + +При необходимоси получить отчет по проектам (по интересующим метрикам) и использовать его в других приложениях (либо рассылать по почте) можно вручную собирать информацию по страницам SonarQube, но проще использовать `sonar-helper`, вызвав команду `report` и передав ей информации для авторизации, список проектов и интересующих метрик. diff --git a/examples/example-report.cfg-file.json b/examples/example-report.cfg-file.json new file mode 100644 index 0000000..1fd0580 --- /dev/null +++ b/examples/example-report.cfg-file.json @@ -0,0 +1,8 @@ +{ + "--token": "2ef785ca946170b7086668132175eb01386943a1", + "--server": "http://my.sonar.server:9000", + "--projects": "bsp,mdm", + "--total-metrics": "ncloc,bugs,sqale_index", + "--report-path": "rep.json", + "--report-format": "JSON" +} diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" index e7f1eaa..c7a3927 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" @@ -20,13 +20,39 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--projects", "Ключ проектов, строкой через запятую (например hrm:develop,buh)"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--total-metrics", "Вывод в отчет метрик по проекту. | Нужные метрики передаются строкой через запятую. - | Возможные значения: - | + | Возможные значения (ключ - расшифровка): + | bugs - Ошибки + | new_bugs - Ошибки в новом коде + | violations - Замечания + | new_violations - Замечания в новом коде + | ncloc - Строки кода + | alert_status - Порог качества + | security_rating - Рейтинг безопасности + | reliability_rating - Рейтинг надежности + | sqale_index - Технический долг + | open_issues - Открытые замечания + | reopened_issues - Переоткрытые замечания + | wont_fix_issues - Неактуальные замечания + | false_positive_issues - Ложное срабатывание + | cognitive_complexity - Когнитивная сложность + | complexity - Цикломатическая сложность + | confirmed_issues - Подтвержденные замечания + | blocker_violations - Блокирующие замечания + | new_blocker_violations - Блокирующие замечания в новом коде + | critical_violations - Критические замечания + | new_critical_violations - Критические замечания в новом коде + | info_violations - Информационные замечания + | new_info_violations - Информационные замечания в новом коде + | major_violations - Важные замечания + | new_major_violations - Важные замечания в новом коде + | minor_violations - Незначительные замечания + | new_minor_violations - Незначительные замечания в новом коде + | duplicated_blocks - Дублирующиеся участки кода + | new_duplicated_blocks - Дублирующиеся участки в новом коде | По умолчанию выводятся все метрики"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--report-path", "Путь для сохранения отчета"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--report-format", "Формат сохраняемого отчета. | Возможные варианнты: - | HTML - создает html - страницу | JSON - выгружает файл json | | По умолчанию используется формат JSON"); @@ -190,7 +216,7 @@ Функция ПолучитьПравильныйФорматОтчета(Знач ВыбранныйФорматОтчета, ОшибокНет) ВРЕГВыбранныйФорматОтчета = ВРЕГ(ВыбранныйФорматОтчета); - Если НЕ (ВРЕГВыбранныйФорматОтчета = "HTML" ИЛИ ВРЕГВыбранныйФорматОтчета = "JSON") Тогда + Если НЕ (ВРЕГВыбранныйФорматОтчета = "JSON") Тогда ОшибокНет = Ложь; Лог.Ошибка("Указан неизвестный формат отчета `%1`", ОбернутьЗначениеДляПечати(ВыбранныйФорматОтчета)); From 2b649a62b70235189ae421bfe682d94160bd2884 Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Tue, 7 May 2019 17:51:42 +0300 Subject: [PATCH 3/6] #ONECICD-91 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Добавил поддержку HTML отчета - Добавил примеры сформированных отчетов - Добавил запись README --- README.md | 7 ++ examples/example-report.html | 61 ++++++++++++++++ examples/example-report.json | 28 ++++++++ ...20\236\321\202\321\207\320\265\321\202.os" | 71 ++++++++++++++++++- 4 files changed, 166 insertions(+), 1 deletion(-) create mode 100644 examples/example-report.html create mode 100644 examples/example-report.json diff --git a/README.md b/README.md index a2cd989..a20dd15 100644 --- a/README.md +++ b/README.md @@ -40,3 +40,10 @@ SonarQube может создавать несколько замечаний п ### Отчет по проектам При необходимоси получить отчет по проектам (по интересующим метрикам) и использовать его в других приложениях (либо рассылать по почте) можно вручную собирать информацию по страницам SonarQube, но проще использовать `sonar-helper`, вызвав команду `report` и передав ей информации для авторизации, список проектов и интересующих метрик. + +На данный момент поддерживаются следующие варианты формирования отчета: + +- **JSON** - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления +- **HTML** - формируется отчет в формате html, метрики выгнржаются только для русского представления + +Примеры отчетов находятся в каталоге [examples](/examples) diff --git a/examples/example-report.html b/examples/example-report.html new file mode 100644 index 0000000..fff97ac --- /dev/null +++ b/examples/example-report.html @@ -0,0 +1,61 @@ + + + + + Отчет + + + +
+

Сводная информация

+

+ Адрес сервера: https://my.sonar.server:9000
+ Дата формирования: 06.05.2019 14:17:17
+ Количество отчетов: 2
+

+
+
+ + + + + + + + + + + + + + + + + + +
Проект: bsp
МетрикаЗначение
Технический долг16734
Ошибки0
Строки кода112092
+
+
+ + + + + + + + + + + + + + + + + + +
Проект: mdm
МетрикаЗначение
Технический долг30632
Ошибки110
Строки кода147102
+
+ + + diff --git a/examples/example-report.json b/examples/example-report.json new file mode 100644 index 0000000..8f093b2 --- /dev/null +++ b/examples/example-report.json @@ -0,0 +1,28 @@ +{ + "ДатаФормирования": "2019-05-06T14:17:17.5125591", + "СерверSonarQube": "http:\/\/my.sonar.server:9000", + "Количество": 2, + "Отчеты": [{ + "КлючПроекта": "bsp", + "Метрики": { + "Технический_долг": "16734", + "sqale_index": "16734", + "Ошибки": "0", + "bugs": "0", + "Строки_кода": "112092", + "ncloc": "112092" + } + }, + { + "КлючПроекта": "mdm", + "Метрики": { + "Технический_долг": "30632", + "sqale_index": "30632", + "Строки_кода": "147102", + "ncloc": "147102", + "Ошибки": "110", + "bugs": "110" + } + } + ] +} diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" index c7a3927..d058faf 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" @@ -53,6 +53,7 @@ Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--report-path", "Путь для сохранения отчета"); Парсер.ДобавитьИменованныйПараметрКоманды(ОписаниеКоманды, "--report-format", "Формат сохраняемого отчета. | Возможные варианнты: + | HTML - создает html - страницу | JSON - выгружает файл json | | По умолчанию используется формат JSON"); @@ -216,7 +217,7 @@ Функция ПолучитьПравильныйФорматОтчета(Знач ВыбранныйФорматОтчета, ОшибокНет) ВРЕГВыбранныйФорматОтчета = ВРЕГ(ВыбранныйФорматОтчета); - Если НЕ (ВРЕГВыбранныйФорматОтчета = "JSON") Тогда + Если НЕ (ВРЕГВыбранныйФорматОтчета = "HTML" ИЛИ ВРЕГВыбранныйФорматОтчета = "JSON") Тогда ОшибокНет = Ложь; Лог.Ошибка("Указан неизвестный формат отчета `%1`", ОбернутьЗначениеДляПечати(ВыбранныйФорматОтчета)); @@ -280,6 +281,74 @@ ЗаписьJSON.ОткрытьФайл(ПутьКОтчету); ЗаписатьJSON(ЗаписьJSON, КоллекцияОтчетов); ЗаписьJSON.Закрыть(); + ИначеЕсли ФорматОтчета = "HTML" Тогда + ДоступныеМетрики = Сонар.ДоступныеМетрики(); + ТекстТаблиц = ""; + Для Каждого Отчет Из КоллекцияОтчетов.Отчеты Цикл + ТекстСтрок = ""; + Для Каждого Метрика Из Отчет.Метрики Цикл + Если ДоступныеМетрики.Свойство(Метрика.Ключ) Тогда + Продолжить; // оставим только русско-язычные + КонецЕсли; + ТекстСтрок = ТекстСтрок + СтрШаблон(ШаблонСтрокаТаблицы(), СтрЗаменить(Метрика.Ключ, "_", " "), Метрика.Значение) + Символы.ПС; + КонецЦикла; + ТекстТаблиц = ТекстТаблиц + СтрШаблон(ШаблонТаблица(), Отчет.КлючПроекта, ТекстСтрок) + Символы.ПС; + КонецЦикла; + ТекстОтчета = СтрШаблон(ШаблонОтчета(), + КоллекцияОтчетов.ДатаФормирования, + КоллекцияОтчетов.СерверSonarQube, + КоллекцияОтчетов.Количество, + ТекстТаблиц); + + ЗаписьJSON = Новый ЗаписьJSON(); + ЗаписьJSON.ОткрытьФайл(ПутьКОтчету); + ЗаписьJSON.ЗаписатьБезОбработки(ТекстОтчета); + ЗаписьJSON.Закрыть(); КонецЕсли; КонецПроцедуры + +Функция ШаблонОтчета() + Возврат + " + | + | + | + |Отчет sonar-helper + | + | + | + |
+ |

Сводная информация

+ |

+ |Адрес сервера: %2
+ |Дата формирования: %1
+ |Количество отчетов: %3
+ |

+ |
+ |%4 + | + |"; +КонецФункции + +Функция ШаблонТаблица() + Возврат + "
+ | + | + | + | + | + | + |%2 + |
Проект: %1
МетрикаЗначение
+ |
"; +КонецФункции + +Функция ШаблонСтрокаТаблицы() + Возврат + " + |%1 + |%2 + |"; +КонецФункции From dfaf1105a03efe84017c4309d1fc3024685064f1 Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Tue, 7 May 2019 19:34:39 +0300 Subject: [PATCH 4/6] #ONECICD-91 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - Скорректирован стиль html отчета --- examples/example-report.html | 151 +++++++++++------- ...20\236\321\202\321\207\320\265\321\202.os" | 59 +++++-- 2 files changed, 147 insertions(+), 63 deletions(-) diff --git a/examples/example-report.html b/examples/example-report.html index fff97ac..3a28c17 100644 --- a/examples/example-report.html +++ b/examples/example-report.html @@ -1,61 +1,104 @@ + - - Отчет - + +Отчет sonar-helper + + -
-

Сводная информация

-

- Адрес сервера: https://my.sonar.server:9000
- Дата формирования: 06.05.2019 14:17:17
- Количество отчетов: 2
-

-
-
- - - - - - - - - - - - - - - - - - -
Проект: bsp
МетрикаЗначение
Технический долг16734
Ошибки0
Строки кода112092
-
-
- - - - - - - - - - - - - - - - - - -
Проект: mdm
МетрикаЗначение
Технический долг30632
Ошибки110
Строки кода147102
-
- +

Отчеты по проектам

+

Данные формирования

+ + + + + + + + + + + + + + +

Отчеты по проектам

+
+ + + + + + + + + + + + + + + + + + + +
Проект: bsp
МетрикаЗначение
Ошибки0
Технический долг16734
Строки кода112092
+
+
+ + + + + + + + + + + + + + + + + + +
Проект: mdm
МетрикаЗначение
Строки кода147102
Ошибки110
Технический долг30632
+
+ + diff --git "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" index d058faf..131555f 100644 --- "a/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" +++ "b/src/\320\232\320\273\320\260\321\201\321\201\321\213/\320\232\320\276\320\274\320\260\320\275\320\264\320\260\320\241\320\263\320\265\320\275\320\265\321\200\320\270\321\200\320\276\320\262\320\260\321\202\321\214\320\236\321\202\321\207\320\265\321\202.os" @@ -312,20 +312,61 @@ Возврат " | + | | | |Отчет sonar-helper | | + | | - |
- |

Сводная информация

- |

- |Адрес сервера: %2
- |Дата формирования: %1
- |Количество отчетов: %3
- |

- |
+ |

Отчеты по проектам

+ |

Данные формирования

+ | + | + | + | + | + | + | + | + | + | + | + | + | + |
Адрес сервера:%2
Дата формирования:%1
Количество отчетов:%3
+ |

Отчеты по проектам

|%4 | |"; @@ -334,7 +375,7 @@ Функция ШаблонТаблица() Возврат "
- | + |
| | | From 9f6b87d1fda760c57781d273293dda31ff4d5a6e Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Tue, 7 May 2019 19:51:21 +0300 Subject: [PATCH 5/6] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=B3=D0=BE=D1=82=D0=BE?= =?UTF-8?q?=D0=B2=D0=BA=D0=B0=20=D0=BA=20=D0=B2=D1=8B=D0=BF=D1=83=D1=81?= =?UTF-8?q?=D0=BA=D1=83=20=D1=80=D0=B5=D0=BB=D0=B8=D0=B7=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 5 ++++- ...0\241\320\270\321\201\321\202\320\265\320\274\321\213.os" | 2 +- 2 files changed, 5 insertions(+), 2 deletions(-) diff --git a/README.md b/README.md index a20dd15..9612024 100644 --- a/README.md +++ b/README.md @@ -44,6 +44,9 @@ SonarQube может создавать несколько замечаний п На данный момент поддерживаются следующие варианты формирования отчета: - **JSON** - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления + + - **HTML** - формируется отчет в формате html, метрики выгнржаются только для русского представления + -Примеры отчетов находятся в каталоге [examples](/examples) +Примеры отчетов находятся в каталоге [examples](examples) diff --git "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" index 57b546b..071e004 100644 --- "a/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" +++ "b/src/\320\234\320\276\320\264\321\203\320\273\320\270/\320\237\320\260\321\200\320\260\320\274\320\265\321\202\321\200\321\213\320\241\320\270\321\201\321\202\320\265\320\274\321\213.os" @@ -27,7 +27,7 @@ // Функция ВерсияПродукта() Экспорт - Версия = "1.1.3"; + Версия = "1.2"; Возврат Версия; КонецФункции // ВерсияПродукта() From db75aecdecfb117f4f3a4fc696b91bbc48ddfdcd Mon Sep 17 00:00:00 2001 From: Maximov Valery Date: Tue, 7 May 2019 20:06:53 +0300 Subject: [PATCH 6/6] =?UTF-8?q?=D0=9F=D1=80=D0=B0=D0=B2=D0=BA=D0=B8=20READ?= =?UTF-8?q?ME.md?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- README.md | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index 9612024..c160910 100644 --- a/README.md +++ b/README.md @@ -14,7 +14,7 @@ Часто возникают ситуации, когда в разных проектах используется общая кодовая база и есть потребность исключить замечания родительского проекта, т.к. исправление их в дочернем самостоятельно не планируется. Переносить руками все замечания достаточно проблематично. -Для закрытия замечаний необходимо вызвать команду `issue-resolver` и передать ей информацию для авторизации, данные родительского и дочерних проектов. +Для закрытия замечаний необходимо вызвать команду **`issue-resolver`** и передать ей информацию для авторизации, данные родительского и дочерних проектов. #### Логика закрытия замечаний @@ -39,14 +39,13 @@ SonarQube может создавать несколько замечаний п ### Отчет по проектам -При необходимоси получить отчет по проектам (по интересующим метрикам) и использовать его в других приложениях (либо рассылать по почте) можно вручную собирать информацию по страницам SonarQube, но проще использовать `sonar-helper`, вызвав команду `report` и передав ей информации для авторизации, список проектов и интересующих метрик. +При необходимоси получить отчет по проектам (по интересующим метрикам) и использовать его в других приложениях (либо рассылать по почте) можно вручную собирать информацию по страницам SonarQube, но проще использовать **`sonar-helper`**, вызвав команду **`report`** и передав ей информации для авторизации, список проектов и интересующих метрик. На данный момент поддерживаются следующие варианты формирования отчета: -- **JSON** - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления - +- **JSON** - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления. [Пример: examples\example-report.json](examples\example-report.json) +- **HTML** - формируется отчет в формате html, метрики выгнржаются только для русского представления. [Пример: examples\example-report.html](examples\example-report.html) -- **HTML** - формируется отчет в формате html, метрики выгнржаются только для русского представления - +## Примеры -Примеры отчетов находятся в каталоге [examples](examples) +Примеры отчетов и конфигурационных файлов находятся в каталоге [examples](examples)
Проект: %1
Метрика