Сканирование одного проекта в .NET-решении с несколькими проектами с помощью SonarQube

У меня следующая проблема.

У нас есть решение .NET, которое содержит несколько проектов и для каждого проекта создано определение сборки VSTS, потому что мы не хотим создавать все решение каждый раз, когда происходит изменение в одном из отдельных проектов.

Конечно, в этом случае при использовании SonarQube мы хотели бы передать метрики только этого конкретного проекта / определения на сервер SonarQube, а не всего решения. По умолчанию происходит последнее, и это то, что мы хотим изменить.

Мы используем VSTS с Visual Studio 2015, плагином SonarQube версии 4.1.1 и SonarQube версии 6.7 (сборка 33306). В настоящее время агенты сборки работают в Windows 8.1.

Пример структуры решения:

MainSolution

  • ProjectA
  • ProjectB
  • ProjectC

Каталог корневых источников для VSTS в этом случае C:\buildagent\vsts-agent\_work\19\s

Структура каталогов в агенте сборки будет выглядеть следующим образом:

C:\buildagent\vsts-agent\_work\19\s\ProjectA
C:\buildagent\vsts-agent\_work\19\s\ProjectB
C:\buildagent\vsts-agent\_work\19\s\ProjectC

Допустим, у нас есть определение сборки VSTS для ProjectB, которое строит только ProjectB. В этом случае мы хотим, чтобы SonarQube сканировал только содержимое проекта ProjectB.

Я пробовал несколько способов добиться этого, но ни одна из них не сработала.

  1. sonar.inclusions / sonar.exclusions Кажется, работает только на уровне файла, а не каталога или проекта. Пробовал несколько настроек, и ошибок не было, но все игнорируется сканером, в результате чего на сервер SQ ничего не отправляется.

  2. sonar.sources

Установка для свойства sonar.sources значения C:\buildagent\vsts-agent\_work\19\s\ProjectB выглядела многообещающей, но при запуске сканера мы получили следующее сообщение об ошибке:

2018-04-04T07: 12: 51.0538120Z ИНФОРМАЦИЯ: Базовый каталог: C: \ buildagent \ vsts-agent_work \ 19 \ s 2018-04-04T07: 12: 51.0538120Z ИНФОРМАЦИЯ: Рабочий каталог: C: \ buildagent \ vsts-agent_work \ 19.sonarqube \ out.sonar 2018-04-04T07: 12: 51.0538120Z ИНФОРМАЦИЯ: Пути к исходным текстам: ProjectB 2018-04-04T07: 12: 51.0548120Z ИНФОРМАЦИЯ: Кодировка источника: windows-1252, локаль по умолчанию: nl_NL 2018-04 -04T07: 12: 51.1518136Z ОШИБКА: Ошибка при выполнении сканера SonarQube 2018-04-04T07: 12: 51.1518136Z ОШИБКА: файл ProjectB / App.config нельзя проиндексировать дважды. Убедитесь, что шаблоны включения / исключения создают непересекающиеся наборы для основного и тестового файлов.

Похоже, SonarQube дважды пытается проиндексировать ProjectB. Один раз с BaseDir, установленным в C:\buildagent\vsts-agent\_work\19\s\ProjectB, и один раз с BaseDir, установленным в C:\buildagent\vsts-agent\_work\19\s

  1. sonar.projectBaseDir

При установке свойства sonar.projectBaseDir на C: \ buildagent \ vsts-agent_work \ 19 \ s \ ProjectB мы получаем ошибку ниже от SonarQube.

2018-04-04T07: 00: 51.2906744Z ОШИБКА: Ошибка при выполнении сканера SonarQube 2018-04-04T07: 00: 51.2906744Z ОШИБКА: каталог C: \ buildagent \ vsts-agent_work \ 19 \ s \ ProjectA должен относиться к проекту baseDir

Похоже, он все еще пытается просканировать весь корневой каталог исходного кода VSTS C:\buildagent\vsts-agent\_work\19\s, а не только C:\buildagent\vsts-agent\_work\19\s\ProjectB.

Так что вопрос остается. Как мы можем заставить это работать?


person Bart Huiskes    schedule 11.04.2018    source источник
comment
Есть ли у вас определение сборки для сборки всего проекта или используйте отдельные определения сборки для отдельной сборки проекта? Если вы используете отдельные определения сборки, проблем не будет. Если у вас есть только одно определение сборки, как вы собираете проекты по отдельности?   -  person Marina Liu    schedule 12.04.2018
comment
Мы используем отдельное определение сборки для каждого проекта в решении.   -  person Bart Huiskes    schedule 16.04.2018
comment
Если вы используете 3 определения сборки для 3 проектов отдельно, каждая сборка должна анализироваться только для одного проекта. Предположим, что это определение сборки только для сборки projectB (app2) ibb.co/fWc8Mn, тогда sonarqube будет анализировать только app2 ibb.co/bQiR7S.   -  person Marina Liu    schedule 17.04.2018
comment
Да, корневой исходный каталог C: \ buildagent \ vsts-agent_work \ 19 \ содержит не только источники для одного проекта, но и для всего решения, в котором находится проект. В начале сборки def. все источники решения загружаются в корневой каталог исходного кода, поскольку проект может иметь зависимость с одним или несколькими другими проектами в решении.   -  person Bart Huiskes    schedule 17.04.2018
comment
Да, все проекты будут загружены на шаге Получить источники в начале сборки. Вы также управляете артефактами сборки проектов в своем репо? В этой ситуации SQ проанализирует все проекты. Else SQ будет анализировать созданный проект только в том случае, если артефакты сборки не управляются в вашем репо. Другим способом анализа созданного проекта является игнорирование артефактов в вашем репо.   -  person Marina Liu    schedule 18.04.2018


Ответы (2)


SonarQube не поддерживает обновление только некоторых показателей в проекте SonarQube - если у вас есть проекты MSBuild A, B и C, которые все встроены в решение и отправлены в SonarQube X, тогда вы не можете просто создать A и нажать его обновленные метрики.

У вас есть несколько вариантов:

  • не запускайте анализ как часть определений сборки VSTS для каждого проекта MSBuild. Вместо этого запускайте ночную сборку всего решения и запускайте анализ как часть этой сборки.
  • помещайте каждый проект MSBuild в отдельный проект SonarQube. Это позволит вам использовать метрики для каждой сборки, но вы потеряете агрегированное представление о своих проектах. Если вы используете корпоративную версию SonarQube, вы можете использовать функцию управления портфелем, чтобы получить консолидированное представление по этим проектам SonarQube.
person duncanp    schedule 11.04.2018
comment
Первый вариант, вероятно, будет работать, но в этом случае мы не сможем использовать параметр отказа Quality Gate с нашими обычными определениями сборки в VSTS, верно? Второй момент, о котором вы упомянули, - это именно то, чего я пытаюсь достичь, но не могу заставить работать. - person Bart Huiskes; 17.04.2018

Мы приняли решение разделить решения с несколькими проектами на несколько решений и основывать определения сборки VSTS на отдельных решениях, а не на проектах. Это, наверное, лучший подход.

person Bart Huiskes    schedule 17.05.2018