Что мне нужно: Преобразовать ~ 45 ReportGenerator.bat .fpr Формировать выходные файлы отчета (в XML, а затем анализировать) в число ошибок SCA по степени серьезности.Вывод в CSV (или, по крайней мере, вывод на экран в виде таблицы) с одной строкой для каждого проекта.
Требуемый вывод:
BuildFolder,ProjectName,Critical,High,Medium,Low
ScaBuild1,Project1,1,1,2,13
ScaBuild1,Project2,0,0,7,500
ScaBuild2,Project3,0,0,5,10
...
Вопросы (проблемы с моим текущим сценарием ниже):
1: Как отсортировать изменения в разобранном порядке XML-узлов: Критический, Высокий, Средний, Низкий (вставка 0 в случае отсутствия результата)?
Note the default XML output is tricky to parse (GroupingSection has count attribute followed by groupTitle Element containing the severity title).
Example: <GroupingSection count="4484"><groupTitle>Low</groupTitle></GroupingSection>
Q1 - это то, что я буду использоватьдля правильного ответа (но комментарии / ответы для № 2 и № 3 являются сильным бонусом и достойны повышенного голоса)
2: преобразовать текущий «Select-XML… Select-Object… | Format-Table» по трубопроводувместо вывода заполнить объект массива (объединить с BuildFolder и ProjectName)?
3: Как только массив результатов построен, как вывести в файл .csv, а затем вывести на экран (в виде таблицы с вкладками)?
Заранее благодарим за ваш полезный ввод!
ДОПОЛНИТЕЛЬНАЯ ИНФОРМАЦИЯ
Пример пути и структуры файла (для 45 проектов):
c:\FortifyResults\ScaBuild1\ Project1.fpr, Project2.fpr
c:\FortifyResults\ScaBuild2\ Project3.fpr, Project4.fpr, Project5.fpr
…
Сценарий в настоящее времяused (преобразует каждый файл .fpr в XML (шаблон Fortify по умолчанию) и выводитs считает GroupingSection как таблицу для каждого XML-файла)
#Parameters
$FprFilePath="d:\HPFortifyBuild1\2019.02.06"
#HPF References
$FortifyInstallPath ="C:\Program Files\HP_Fortify\HP_Fortify_SCA_and_Apps_16.11"
$FortifyReportGenerator ="$FortifyInstallPath\ReportGenerator.bat"
$FortifyXmlReportTemplate ="$FortifyInstallPath\Core\config\reports\DefaultReportDefinition.xml"
CD $FprFilePath
Get-ChildItem "$FprFilePath" -Filter *.fpr |
Foreach-Object {
$NameFpr=$_.Name
$NameXml=($_.BaseName+".xml")
Write-Host "$NameFpr - Generating $NameXml report..."
& "C:\Program Files\HP_Fortify\HP_Fortify_SCA_and_Apps_16.11\bin\ReportGenerator.bat" -format xml -f $NameXml -source $NameFpr -template DefaultReportDefinition.xml
#Write-Host "$FprFilePath\$NameXml RESULTS:"
Select-XML -Path $FprFilePath\$NameXml -Xpath "/ReportDefinition[1]/ReportSection[1]/SubSection[2]/IssueListing[1]/Chart[1]/GroupingSection" | Select-Object -ExpandProperty Node | Format-Table -AutoSize
#Write-Host " "
}
Текущий пример выходных данных скрипта:
Project1.fpr - Generating Project1.xml report...
count groupTitle
----- ----------
13 Low
2 Medium
1 Critical
1 High
Project2.fpr - Generating Project2.xml report...
count groupTitle
----- ----------
500 Low
7 Medium
…
Выдержка из Project1.xml (анализируется из Project1.fpr через скрипт)
Команда сценария: ReportGenerator.bat "-format xml -f $ NameXml -source $ NameFpr -template DefaultReportDefinition.xml
Project1.xml выдержка:
<Description>A table summarizing the number of issues found and the breakdown of issues in each Fortify Priority Level</Description>
<IssueListing listing="false" limit="-1">
<Refinement/>
<Chart chartType="table">
<Axis>Fortify Priority Order</Axis>
<MajorAttribute>Analysis</MajorAttribute>
<GroupingSection count="4484"><groupTitle>Low</groupTitle></GroupingSection>
<GroupingSection count="431"><groupTitle>Medium</groupTitle></GroupingSection>
<GroupingSection count="114"><groupTitle>High</groupTitle></GroupingSection>
<GroupingSection count="13"><groupTitle>Critical</groupTitle></GroupingSection>
</Chart>
</IssueListing>
Обратите внимание на значение по умолчаниюXML-вывод сложно разобрать (GroupingSection имеет атрибут count, за которым следует элемент groupTitle, содержащий заголовок серьезности).Пример:
<GroupingSection count="4484"><groupTitle>Low</groupTitle></GroupingSection>
SSC - это NA: У меня нет SSC для этой изолированной среды сборки, поэтому API-интерфейсы SSC или связанные с ними решения не применимы к этому вопросу.
Рассмотрено связанных вопросов StackOverflow (на данный момент):