Skip to content

Commit

Permalink
Merge branch 'release/1.3'
Browse files Browse the repository at this point in the history
  • Loading branch information
theshadowco committed Jul 25, 2019
2 parents b721f49 + b65131e commit 2b37fcf
Show file tree
Hide file tree
Showing 11 changed files with 927 additions and 220 deletions.
15 changes: 13 additions & 2 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -43,8 +43,19 @@ SonarQube может создавать несколько замечаний п

На данный момент поддерживаются следующие варианты формирования отчета:

- **JSON** - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления. [Пример: examples\example-report.json](examples\example-report.json)
- **HTML** - формируется отчет в формате html, метрики выгнржаются только для русского представления. [Пример: examples\example-report.html](examples\example-report.html)
- **JSON** - формируется отчет в формате json, метрики выгружаются дважды - для идентификатора метрики и для русского представления. [Пример: examples\example-report.json](examples/example-report.json)
- **HTML** - формируется отчет в формате html, метрики выгнржаются только для русского представления. [Пример: examples\example-report.html](examples/example-report.html)

### Сводный отчет по разработчикам

При необходимоси получить отчет по разработчикам (не конкретные замечания, а "температуру") и понять, кто в команде как работает можно вручную собирать информацию по страницам SonarQube, но проще использовать **`sonar-helper`**, вызвав команду **`usr-report`** и проанализировать полученный результат.

На данный момент поддерживается вариант формирования отчета в формате **JSON**. [Пример отчета: examples\example-usr-report.json](examples/example-usr-report.json)

### Перенос замечаний

При необходимости перенести замечания с одного разработчика на другого (первый например покинул команду) используют возможности массового изменения замечаний. В случае когда замечаний много, много проектов это может отнять большое количество сил т.к. изменять можно порциаями по 500.
**`sonar-helper`** предоставляет возможность выполнить это быстро и просто, для чего необходимо вызвать команду **`transfer-issues`**.

## Примеры

Expand Down
8 changes: 8 additions & 0 deletions examples/example-transfer.cfg-file.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"--token": "2ef785ca946170b7086668132175eb01386943a1",
"--server": "http://my.sonar.server:9000",
"--projects": "bsp,mdm",
"--statuses": "OPEN",
"--assigned": "notme,false",
"--assign": "me"
}
8 changes: 8 additions & 0 deletions examples/example-usr-report.cfg-file.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
{
"--token": "2ef785ca946170b7086668132175eb01386943a1",
"--server": "http://my.sonar.server:9000",
"--projects": "bsp,mdm",
"--statuses": "OPEN",
"--report-path": "usr-rep.json",
"--report-format": "JSON"
}
29 changes: 29 additions & 0 deletions examples/example-usr-report.json
Original file line number Diff line number Diff line change
@@ -0,0 +1,29 @@
{
"ДатаФормирования": "2019-05-06T14:17:17.5125591",
"СерверSonarQube": "http:\/\/my.sonar.server:9000",
"Количество": 2,
"Замечания": [
{
"КлючПроекта": "mdm",
"Статус": "OPEN",
"Автор": "my.user@mail.domain",
"Отвественный": "my.user",
"Правило": "RuleCode",
"Критичность": "MAJOR",
"Тип": "BUG",
"Время": 40,
"Количество": 20
},
{
"КлючПроекта": "bsp",
"Статус": "OPEN",
"Автор": "my.user@mail.domain",
"Отвественный": "my.user",
"Правило": "RuleCode2",
"Критичность": "MINOR",
"Тип": "CODE_SMELL",
"Время": 29,
"Количество": 29
}
]
}
140 changes: 33 additions & 107 deletions src/Классы/КомандаЗакрытьИшузы.os
Original file line number Diff line number Diff line change
@@ -1,15 +1,20 @@
///////////////////////////////////////////////////////////////////////////////////////////////////
//
// Служебный модуль с реализацией работы команды issue-resolver
//
// (C) Maximov Valery (aka theshadowco)
//
///////////////////////////////////////////////////////////////////////////////////////////////////

Перем Лог;

Перем Токен;
Перем АдресСервера;
Перем РодительскийПроект;
Перем ДочерниеПроекты;
Перем ИсключаемыеПроекты;
Перем Статусы;
Перем ИзEDTВКонфигуратор;
Перем Теги;
Перем МаксимальноеКоличествоСтатусов;

Перем ПрочитанныеПараметры;

///////////////////////////////////////////////////////////////////////////////////////////////////
// Прикладной интерфейс
///////////////////////////////////////////////////////////////////////////////////////////////////
Expand Down Expand Up @@ -54,23 +59,27 @@
Лог = ДополнительныеПараметры.Лог;
ОшибокНет = ПрочитатьПараметрыЗапуска(ПараметрыКоманды);
Если НЕ ОшибокНет Тогда
Возврат СообщитьОбОшибке("Ошибка запуска");
Возврат ОбщегоНазначения.СообщитьОбОшибке("Ошибка запуска");
КонецЕсли;


АдресСервера = ПрочитанныеПараметры.Получить("АдресСервера");
Токен = ПрочитанныеПараметры.Получить("Токен");
РодительскийПроект = ПрочитанныеПараметры.Получить("РодительскийПроект");

Лог.Информация("Получение информации о проектах");
ПроектыSQ = Сонар.ПолучитьПроекты(АдресСервера, Токен);
Лог.Информация("Получение информации о родительском проекте");
ОписаниеРодительскогоПроекта = ПроектыSQ.Получить(РодительскийПроект);
Если ОписаниеРодительскогоПроекта = Неопределено Тогда
Возврат СообщитьОбОшибке(СтрШаблон("Родительский проект `%1` в списке проектов не обнаружен", РодительскийПроект));
Возврат ОбщегоНазначения.СообщитьОбОшибке(СтрШаблон("Родительский проект `%1` в списке проектов не обнаружен", РодительскийПроект));
КонецЕсли;

Лог.Информация("Получение закрываемых замечаний из родительского проекта");
ЗамечанияРодительскогоПроекта = Сонар.ПолучитьЗамечанияПроекта(
АдресСервера, Токен,
ОписаниеРодительскогоПроекта,
СтрСоединить(Статусы, ","),
ИзEDTВКонфигуратор);
ПрочитанныеПараметры.Получить("ИзEDTВКонфигуратор"));

Если НЕ ЗамечанияРодительскогоПроекта.Количество() Тогда

Expand Down Expand Up @@ -102,6 +111,7 @@
КонецЦикла;

Лог.Информация("Закрытие замечаний в дочерних проектах");
Теги = ПрочитанныеПараметры.Получить("Теги");
Для Каждого ДочернийПроект Из ДочерниеПроекты Цикл
Лог.Информация("Закрытие замечаний в проекте `%1`", ДочернийПроект);
ОписаниеПроекта = ПроектыSQ.Получить(СокрЛП(ДочернийПроект));
Expand All @@ -127,103 +137,33 @@

Функция ПрочитатьПараметрыЗапуска(ПараметрыКоманды)

ПрочитанныеПараметры = ОбщегоНазначения.ПрочитатьПараметрыЗапуска(ПараметрыКоманды, Истина);
ОшибокНет = ПрочитанныеПараметры.Получить("ОшибокНет");
МаксимальноеКоличествоСтатусов = 5;
ОшибокНет = Истина;

Токен = ПараметрыКоманды["--token"];
АдресСервера = ПараметрыКоманды["--server"];
РодительскийПроект = ПараметрыКоманды["--parent-project"];
ДочерниеПроектыСтрокой = ПараметрыКоманды["--child-projects"];
ИсключаемыеПроектыСтрокой = ПараметрыКоманды["--exclude-projects"];
СтатусыСтрокой = ПараметрыКоманды["--statuses"];
Теги = ПараметрыКоманды["--tags"];
ИзEDTВКонфигуратор = ПараметрыКоманды["--edt2cfg"];

ПутьККонфигурационномуФайлу = ПараметрыКоманды["--cfg-file"];
Если ПутьККонфигурационномуФайлу <> Неопределено Тогда

Файл = Новый Файл(ПутьККонфигурационномуФайлу);
Если Файл.Существует() Тогда
ТекстовыйДокумент = Новый ТекстовыйДокумент();
ТекстовыйДокумент.Прочитать(ПутьККонфигурационномуФайлу);
Лог.Отладка("Содержимое конфигурационного файла: %1%2", Символы.ПС, ТекстовыйДокумент.ПолучитьТекст());
JSON = Новый ЧтениеJSON();
JSON.УстановитьСтроку(ТекстовыйДокумент.ПолучитьТекст());
ПараметрыИзФайла = ПрочитатьJSON(JSON, Истина);
Если Токен = Неопределено Тогда
Токен = ПараметрыИзФайла.Получить("--token");
КонецЕсли;
Если АдресСервера = Неопределено Тогда
АдресСервера = ПараметрыИзФайла.Получить("--server");
КонецЕсли;
Если РодительскийПроект = Неопределено Тогда
РодительскийПроект = ПараметрыИзФайла.Получить("--parent-project");
КонецЕсли;
Если ДочерниеПроектыСтрокой = Неопределено Тогда
ДочерниеПроектыСтрокой = ПараметрыИзФайла.Получить("--child-projects");
КонецЕсли;
Если ИсключаемыеПроектыСтрокой = Неопределено Тогда
ИсключаемыеПроектыСтрокой = ПараметрыИзФайла.Получить("--exclude-projects");
КонецЕсли;
Если СтатусыСтрокой = Неопределено Тогда
СтатусыСтрокой = ПараметрыИзФайла.Получить("--statuses");
КонецЕсли;
Если Теги = Неопределено Тогда
Теги = ПараметрыИзФайла.Получить("--tags");
КонецЕсли;
Если ИзEDTВКонфигуратор = Ложь И ПараметрыИзФайла.Получить("--edt2cfg") <> Неопределено Тогда
ИзEDTВКонфигуратор = ПараметрыИзФайла.Получить("--edt2cfg");
КонецЕсли;
Иначе
Лог.Ошибка("Конфигурационный файл по пути `%1` не обнаружен", ОбернутьЗначениеДляПечати(ПутьККонфигурационномуФайлу));
ОшибокНет = Ложь;
КонецЕсли;

КонецЕсли;

Лог.Отладка("Прочитанные параметры:");
Лог.Отладка(" Токен = `%1`", ОбернутьЗначениеДляПечати(Токен));
Лог.Отладка(" Адрес сервера = `%1`", ОбернутьЗначениеДляПечати(АдресСервера));
Лог.Отладка(" Ключ родительского проекта = `%1`", ОбернутьЗначениеДляПечати(РодительскийПроект));
Лог.Отладка(" Ключ дочерних проектов (строкой) = `%1`", ОбернутьЗначениеДляПечати(ДочерниеПроектыСтрокой));
Лог.Отладка(" Ключ исключаемых проектов (строкой) = `%1`", ОбернутьЗначениеДляПечати(ИсключаемыеПроектыСтрокой));
Лог.Отладка(" Статусы строкой = `%1`", ОбернутьЗначениеДляПечати(СтатусыСтрокой));
Лог.Отладка(" Устанавливаемые теги = `%1`", ОбернутьЗначениеДляПечати(Теги));
Лог.Отладка(" Нужно переводить из EDT = `%1`", ОбернутьЗначениеДляПечати(ИзEDTВКонфигуратор));

Если Не ЗначениеЗаполнено(Токен) Тогда
Лог.Ошибка("Не указан токен для авторизации");
ОшибокНет = Ложь;
КонецЕсли;

Если Не ЗначениеЗаполнено(АдресСервера) Тогда
Лог.Ошибка("Не указан адрес сервера SonarQube");
ОшибокНет = Ложь;
КонецЕсли;

Если Не ЗначениеЗаполнено(РодительскийПроект) Тогда
Если Не ЗначениеЗаполнено(ПрочитанныеПараметры.Получить("РодительскийПроект")) Тогда
Лог.Ошибка("Не указан ключ родительского проекта");
ОшибокНет = Ложь;
КонецЕсли;

Если Не ЗначениеЗаполнено(ДочерниеПроектыСтрокой) Тогда
Лог.Ошибка("Не указаны ключ дочерних проектов");
Если Не ЗначениеЗаполнено(ПрочитанныеПараметры.Получить("ДочерниеПроектыСтрокой")) Тогда
Лог.Ошибка("Не указаны ключи дочерних проектов");
ОшибокНет = Ложь;
Иначе
ДочерниеПроекты = СтрРазделить(ДочерниеПроектыСтрокой, ",", Ложь);
ДочерниеПроекты = СтрРазделить(ПрочитанныеПараметры.Получить("ДочерниеПроектыСтрокой"), ", ", Ложь);
КонецЕсли;

ИсключаемыеПроекты = Новый Массив();
Если ЗначениеЗаполнено(ИсключаемыеПроектыСтрокой) Тогда
ИсключаемыеПроекты = СтрРазделить(ИсключаемыеПроектыСтрокой, ",", Ложь);
Если ЗначениеЗаполнено(ПрочитанныеПараметры.Получить("ИсключаемыеПроектыСтрокой")) Тогда
ИсключаемыеПроекты = СтрРазделить(ПрочитанныеПараметры.Получить("ИсключаемыеПроектыСтрокой"), ", ", Ложь);
КонецЕсли;
ИсключаемыеПроекты.Добавить(СокрЛП(РодительскийПроект));
ИсключаемыеПроекты.Добавить(СокрЛП(ПрочитанныеПараметры.Получить("РодительскийПроект")));

Если Не ЗначениеЗаполнено(СтатусыСтрокой) Тогда
Если Не ЗначениеЗаполнено(ПрочитанныеПараметры.Получить("СтатусыСтрокой")) Тогда
Статусы = СтрРазделить("RESOLVED,CLOSED", ",", Ложь);
Иначе
Статусы = Новый Массив();
СтатусыВрем = СтрРазделить(ВРЕГ(СтатусыСтрокой), ",", Ложь);
СтатусыВрем = СтрРазделить(ВРЕГ(ПрочитанныеПараметры.Получить("СтатусыСтрокой")), ", ", Ложь);
ВсеСтатусы = СтрРазделить("OPEN,CONFIRMED,REOPENED,RESOLVED,CLOSED", ",");
Для Каждого Статус Из СтатусыВрем Цикл
Если ВсеСтатусы.Найти(Статус) <> Неопределено Тогда
Expand All @@ -237,25 +177,11 @@
ОшибокНет = Ложь;
КонецЕсли;
КонецЕсли;

Если НЕ ЗначениеЗаполнено(Теги) Тогда
Теги = "";
Если НЕ ЗначениеЗаполнено(ПрочитанныеПараметры.Получить("Теги")) Тогда
ПрочитанныеПараметры.Вставить("Теги", "");
КонецЕсли;

Возврат ОшибокНет;

КонецФункции

Функция ОбернутьЗначениеДляПечати(Знач Значение)
Если ЗначениеЗаполнено(Значение) Тогда
Возврат Строка(Значение);
КонецЕсли;
Возврат "<Незаполнено>";
КонецФункции

Функция СообщитьОбОшибке(ТекстОшибки)

Лог.Ошибка(ТекстОшибки);
Возврат МенеджерКомандПриложения.РезультатыКоманд().ОшибкаВремениВыполнения;

КонецФункции
Loading

0 comments on commit 2b37fcf

Please sign in to comment.