{"id":22529,"date":"2023-07-07T05:00:00","date_gmt":"2023-07-07T03:00:00","guid":{"rendered":"https:\/\/sii.pl\/blog\/?p=22529"},"modified":"2024-07-22T14:51:51","modified_gmt":"2024-07-22T12:51:51","slug":"statyczna-analiza-kodu-w-net-przy-uzyciu-sonarqube-localhost","status":"publish","type":"post","link":"https:\/\/sii.pl\/blog\/statyczna-analiza-kodu-w-net-przy-uzyciu-sonarqube-localhost\/","title":{"rendered":"Statyczna analiza kodu w .NET przy u\u017cyciu SonarQube localhost"},"content":{"rendered":"\n<p>W dzisiejszych czasach, testowanie oprogramowania jest kluczowym etapem w procesie wytwarzania aplikacji. Dlatego te\u017c, w celu zapewnienia jako\u015bci kodu, cz\u0119sto korzystamy z r\u00f3\u017cnych narz\u0119dzi, kt\u00f3re pomagaj\u0105 nam w automatyzacji test\u00f3w i ocenie pokrycia kodu.<\/p>\n\n\n\n<p>Jednym z nich jest SonarQube, czyli aplikacja open source s\u0142u\u017c\u0105ca do kontroli jako\u015bci kodu, w tym m.in.: do oceny pokrycia kodu, wykrywania b\u0142\u0119d\u00f3w czy podatno\u015bci (OWASP, PCI DSS, CWE \u2013 Ryc. 1).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules.jpg\"><img decoding=\"async\" width=\"1024\" height=\"275\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules-1024x275.jpg\" alt=\" Raporty bezpiecze\u0144stwa\" class=\"wp-image-22530\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules-1024x275.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules-300x81.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules-768x207.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules-1536x413.jpg 1536w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/000-sonar-security-rules.jpg 1576w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 1 <a href=\"https:\/\/docs.sonarqube.org\/latest\/user-guide\/security-reports\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Raporty bezpiecze\u0144stwa<\/a><\/figcaption><\/figure>\n\n\n\n<p>W artykule przyjrzymy si\u0119 temu, jak mo\u017cna wykorzysta\u0107 SonarQube do statycznej analizy kodu w aplikacjach C# .NET.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co to jest statyczna analiza kodu?<\/strong><\/h2>\n\n\n\n<p>Statyczna analiza kodu to proces automatycznego skanowania kodu \u017ar\u00f3d\u0142owego w celu wykrycia:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>b\u0142\u0119d\u00f3w,<\/li>\n\n\n\n<li>potencjalnych zagro\u017ce\u0144 bezpiecze\u0144stwa,<\/li>\n\n\n\n<li>niesp\u00f3jno\u015bci,<\/li>\n\n\n\n<li>niezgodno\u015bci z najlepszymi praktykami programistycznymi.<\/li>\n<\/ul>\n\n\n\n<p>Wa\u017cne jest to, \u017ce analiza ta przeprowadzana jest zanim kod zostanie uruchomiony.<\/p>\n\n\n\n<p>W przypadku j\u0119zyka C# statyczna analiza kodu mo\u017ce by\u0107 wykonywana za pomoc\u0105 r\u00f3\u017cnych narz\u0119dzi, w tym specjalistycznych narz\u0119dzi IDE (ang. Integrated Development Environment) takich jak Microsoft Visual Studio, jak r\u00f3wnie\u017c zewn\u0119trznych narz\u0119dzi, np. SonarQube, ReSharper czy Code Analysis.<\/p>\n\n\n\n<p>Narz\u0119dzia te wykorzystuj\u0105 r\u00f3\u017cne techniki i algorytmy do skanowania kodu, uwzgl\u0119dniaj\u0105c regu\u0142y statycznej analizy kodu, kt\u00f3re pozwalaj\u0105 na wykrywanie potencjalnych b\u0142\u0119d\u00f3w. Korzystaj\u0105 r\u00f3wnie\u017c z podej\u015bcia opartego na sztucznej inteligencji i uczeniu maszynowym. Umo\u017cliwiaj\u0105 identyfikowanie b\u0142\u0119d\u00f3w i niesp\u00f3jno\u015bci na podstawie wcze\u015bniejszych wzorc\u00f3w oraz analizy du\u017cych zbior\u00f3w danych.<\/p>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Korzy\u015bci p\u0142yn\u0105ce ze statycznej analizy kodu<\/strong><\/h3>\n\n\n\n<p>Korzy\u015bci wynikaj\u0105ce z zastosowania statycznej analizy kodu w j\u0119zyku C# s\u0105 liczne. Przede wszystkim pozwala ona na wykrycie b\u0142\u0119d\u00f3w we wczesnym etapie procesu wytwarzania oprogramowania, co prowadzi do oszcz\u0119dno\u015bci czasu i zmniejszenia koszt\u00f3w poprawek w p\u00f3\u017aniejszych fazach projektu. Po drugie, statyczna analiza kodu pozwala na identyfikowanie potencjalnych zagro\u017ce\u0144 bezpiecze\u0144stwa, co jest szczeg\u00f3lnie istotne w przypadku aplikacji, kt\u00f3re wymagaj\u0105 wysokiego poziomu bezpiecze\u0144stwa, takich jak aplikacje medyczne, do kierowania ruchem kolejowym lub lotniczym.<\/p>\n\n\n\n<p>Jednym z istotnych element\u00f3w analizy statycznej jest pokrycie kodu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co to jest pokrycie kodu?<\/strong><\/h2>\n\n\n\n<p>Pokrycie kodu to miara okre\u015blaj\u0105ca, w jaki spos\u00f3b testy jednostkowe pokrywaj\u0105 kod \u017ar\u00f3d\u0142owy aplikacji. Im wy\u017cszy poziom pokrycia kodu, tym wi\u0119ksza pewno\u015b\u0107, \u017ce kod dzia\u0142a zgodnie z oczekiwaniami i jest bardziej odporny na b\u0142\u0119dy.<\/p>\n\n\n\n<p>Istniej\u0105 r\u00f3\u017cne rodzaje pokrycia kodu, takie jak pokrycie instrukcji, ga\u0142\u0119zi, wierszy lub funkcji. Ka\u017cdy z tych rodzaj\u00f3w ma swoje zalety i wady, za\u015b wyb\u00f3r konkretnego typu zale\u017cy od potrzeb projektu.<\/p>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Co to jest SonarQube?<\/strong><\/h2>\n\n\n\n<p>SonarQube to platforma do ci\u0105g\u0142ej inspekcji jako\u015bci kodu, kt\u00f3ra zapewnia programistom kompleksowy zestaw narz\u0119dzi do analizy i pomiaru jako\u015bci ich kodu.<\/p>\n\n\n\n<p>Oferuje szereg funkcji, takich jak:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>analiza kodu,<\/li>\n\n\n\n<li>pokrycie kodu,<\/li>\n\n\n\n<li>wykrywanie duplikat\u00f3w kodu,<\/li>\n\n\n\n<li>skanowanie pod k\u0105tem podatno\u015bci, aby pom\u00f3c programistom w identyfikowaniu i rozwi\u0105zywaniu problem\u00f3w.<\/li>\n<\/ul>\n\n\n\n<p>SonarQube integruje si\u0119 z r\u00f3\u017cnymi narz\u0119dziami i j\u0119zykami, w tym C#, Java, Python i wieloma innymi, a mo\u017cna go u\u017cywa\u0107 zar\u00f3wno w \u015brodowisku lokalnym, jak i w chmurze. Jego przyjazny interfejs i szczeg\u00f3\u0142owe raportowanie sprawiaj\u0105, \u017ce jest \u0142atwy w u\u017cyciu i umo\u017cliwia szybkie wdro\u017cenie.<\/p>\n\n\n\n<p>W celu przeprowadzenia analizy kodu na naszej maszynie lokalnej, warto przyjrze\u0107 si\u0119 poszczeg\u00f3lnym u\u017cywanym komponentom i powi\u0105zaniom pomi\u0119dzy nimi (Ryc. 2):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/001-sonar-components.jpg\"><img decoding=\"async\" width=\"924\" height=\"451\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/001-sonar-components.jpg\" alt=\"Komponenty u\u017cyte w celu przeprowadzenia analizy kodu\" class=\"wp-image-22532\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/001-sonar-components.jpg 924w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/001-sonar-components-300x146.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/001-sonar-components-768x375.jpg 768w\" sizes=\"(max-width: 924px) 100vw, 924px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 2 <a href=\"https:\/\/www.sonarsource.com\/products\/sonarqube\/\" target=\"_blank\" aria-label=\"Komponenty u\u017cyte w celu przeprowadzenia analizy kodu (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Komponenty u\u017cyte w celu przeprowadzenia analizy kodu<\/a><\/figcaption><\/figure>\n\n\n\n<p>Dost\u0119pne komponenty SonarQube:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Skaner \u2013 proces, kt\u00f3ry dokonuje analizy kodu \u017ar\u00f3d\u0142owego,<\/li>\n\n\n\n<li>Baza danych \u2013 przechowywane s\u0105 w niej metryki zwi\u0105zane z jako\u015bci\u0105 kodu oraz konfiguracj\u0119,<\/li>\n\n\n\n<li>Serwer SonarQube \u2013 udost\u0119pnia interfejs u\u017cytkownika, przetwarza raporty z analizy kodu i zapisuje je do bazy danych.<\/li>\n<\/ul>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Instalacja komponent\u00f3w SonarQube<\/strong><\/h2>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Server MSSQL<\/strong><\/h3>\n\n\n\n<p>W tym zakresie jest wiele tutoriali, wi\u0119c opis samej instalacji opuszcz\u0119. Istotne jest natomiast, aby spe\u0142ni\u0107 warunki przy tworzeniu bazy danych:<\/p>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Collation&nbsp;<strong>MUST<\/strong>&nbsp;be case-sensitive (CS) and accent-sensitive (AS) (wersja angielska tego wymagania pozwala na \u0142atwiejsze jego zrozumienie), np. Polish_CS_AS.<\/li>\n\n\n\n<li>po utworzeniu bazy nale\u017cy upewni\u0107 si\u0119, \u017ce mamy ustawion\u0105 opcj\u0119 READ_COMMITED_SNAPSHOT:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">SELECT is_read_committed_snapshot_on FROM sys.databases WHERE name='TwojaBazaSonarQube';<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Je\u015bli nie, ustawiamy j\u0105:<\/li>\n<\/ul>\n\n\n\n<pre class=\"wp-block-preformatted\">ALTER DATABASE TwojaBazaSonarQube SET READ_COMMITTED_SNAPSHOT ON WITH ROLLBACK IMMEDIATE;<\/pre>\n\n\n\n<ul class=\"wp-block-list\">\n<li>Je\u015bli uruchamiamy instancj\u0119 SQL server lokalnie, warto pami\u0119ta\u0107 o ustawieniu konkretnego portu np. 1433.<\/li>\n<\/ul>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>SonarQube server<\/strong><\/h3>\n\n\n\n<p>Jednym z wymaga\u0144 jest instalacja i konfiguracja Java Oracle JRE 17 lub OpenJDK 17. Skorzystajmy z drugiej opcji (Ryc. 3).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/003-sonar-download-versions.jpg\"><img decoding=\"async\" width=\"654\" height=\"186\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/003-sonar-download-versions.jpg\" alt=\"Dost\u0119pne wersje JDK do pobrania\" class=\"wp-image-22536\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/003-sonar-download-versions.jpg 654w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/003-sonar-download-versions-300x85.jpg 300w\" sizes=\"(max-width: 654px) 100vw, 654px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 3 <a href=\"https:\/\/jdk.java.net\/archive\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Dost\u0119pne wersje JDK do pobrania<\/a><\/figcaption><\/figure>\n\n\n\n<p>Po rozpakowaniu w naszej wybranej lokalizacji konfigurujemy systemowe zmienne \u015brodowiskowe:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">JAVA_HOME &lt;\u015bcie\u017cka do rozpakowanego folderu&gt;\n\nPATH &lt;\u015bcie\u017cka do rozpakowanego folderu\/bin&gt; lub %JAVA_HOME%\/bin\nSONAR_JAVA_PATH &lt;\u015bcie\u017cka do rozpakowanego folderu\/bin\/java.exe&gt; lub %JAVA_HOME%\/bin\/java.exe\n<\/pre>\n\n\n\n<p>Z oficjalnej strony SonarQube pobieramy najnowsz\u0105 wersj\u0119 community (Ryc. 4) i rozpakowujemy:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/004-sonar-app-versions.jpg\"><img decoding=\"async\" width=\"1024\" height=\"251\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/004-sonar-app-versions-1024x251.jpg\" alt=\"Dost\u0119pne wersje SonarQube\" class=\"wp-image-22538\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/004-sonar-app-versions-1024x251.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/004-sonar-app-versions-300x74.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/004-sonar-app-versions-768x188.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/004-sonar-app-versions.jpg 1477w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Rys. 4 <a href=\"https:\/\/www.sonarqube.org\/downloads\/\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Dost\u0119pne wersje SonarQube<\/a><\/figcaption><\/figure>\n\n\n\n<p>Konfiguracja polega na odkomentowaniu i ustawieniu odpowiednich parametr\u00f3w w pliku conf\/sonar.properties. W naszym przypadku to jedynie konfiguracja po\u0142\u0105czenia z baz\u0105 danych:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">sonar.jdbc.username=&lt;TwojaNazwaU\u017cytkownikaDb&gt;\nsonar.jdbc.password=&lt;TwojeHas\u0142o&gt;\n\nsonar.jdbc.url=jdbc:sqlserver:\/\/localhost:1433;databaseName=&lt;TwojaBazaSonarQube&gt;;encrypt=false\n<\/pre>\n\n\n\n<h3 class=\"wp-block-heading\"><strong>Scanner<\/strong><\/h3>\n\n\n\n<p>Instalujemy globalnie niezb\u0119dne narz\u0119dzie do przeprowadzenia skanu przy pomocy komendy:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">dotnet tool install dotnet-sonarscanner \u2013global<\/pre>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Uruchomienie<\/strong><\/h2>\n\n\n\n<p>Teraz, gdy mamy ju\u017c wszystko zainstalowane oraz skonfigurowane, odpalmy instancj\u0119 serwera SonarQube poprzez wykonanie skryptu z folderu instalacyjnego serwera:<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">bin\\windows-x86-64\\StartSonar.bat<\/pre>\n\n\n\n<p>W konsoli powinni\u015bmy zobaczy\u0107 logi potwierdzaj\u0105ce uruchomienie serwera (Ryc. 5):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/005-sonar-run-server.jpg\"><img decoding=\"async\" width=\"716\" height=\"45\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/005-sonar-run-server.jpg\" alt=\"Potwierdzenie uruchomienia serwera SonarQube\" class=\"wp-image-22540\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/005-sonar-run-server.jpg 716w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/005-sonar-run-server-300x19.jpg 300w\" sizes=\"(max-width: 716px) 100vw, 716px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 5 Potwierdzenie uruchomienia serwera SonarQube<\/figcaption><\/figure>\n\n\n\n<p>Serwer Web UI SonarQube nas\u0142uchuje domy\u015blnie na porcie 9000 (mo\u017cna to zmieni\u0107 w pliku sonar.properties), a credentiale, kt\u00f3re musimy zmieni\u0107 podczas pierwszego logowania, to admin\/admin).<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/010-sonar-start-page.jpg\"><img decoding=\"async\" width=\"1024\" height=\"719\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/010-sonar-start-page-1024x719.jpg\" alt=\"Strona startowa SonarQube\" class=\"wp-image-22542\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/010-sonar-start-page-1024x719.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/010-sonar-start-page-300x211.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/010-sonar-start-page-768x539.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/010-sonar-start-page.jpg 1227w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 6 Strona startowa SonarQube<\/figcaption><\/figure>\n\n\n\n<p>Najpierw stw\u00f3rzmy projekt w SonarQube, wybieraj\u0105c opcj\u0119 Manually (Ryc. 6), a nast\u0119pnie podaj\u0105c dane projektu (Ryc. 7):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full is-resized\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/015-sonar-create-project.jpg\"><img decoding=\"async\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/015-sonar-create-project.jpg\" alt=\"Tworzenie projektu w SonarQube\" class=\"wp-image-22544\" width=\"567\" height=\"605\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/015-sonar-create-project.jpg 567w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/015-sonar-create-project-281x300.jpg 281w\" sizes=\"(max-width: 567px) 100vw, 567px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 7 Tworzenie projektu w SonarQube<\/figcaption><\/figure>\n\n\n\n<p>Jako \u017ce wszystko do tej pory dzia\u0142o si\u0119 lokalnie, r\u00f3wnie\u017c do skanu u\u017cyjemy kodu znajduj\u0105cego si\u0119 na localhost. Wobec tego sklonujmy repozytorium (Ryc. 8), kt\u00f3re przygotowa\u0142em na cele tego artyku\u0142u i wybierzmy opcj\u0119 Locally widoczn\u0105 po stworzeniu projektu.<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/018-sonar-github-repo.jpg\"><img decoding=\"async\" width=\"1024\" height=\"459\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/018-sonar-github-repo-1024x459.jpg\" alt=\"Repozytorium zawieraj\u0105ce przyk\u0142adowy kod do analizy\" class=\"wp-image-22547\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/018-sonar-github-repo-1024x459.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/018-sonar-github-repo-300x134.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/018-sonar-github-repo-768x344.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/018-sonar-github-repo.jpg 1294w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 8 <a href=\"https:\/\/github.com\/mpyssii\/SonarQube.git\" target=\"_blank\" aria-label=\" (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\" rel=\"nofollow\" >Repozytorium zawieraj\u0105ce przyk\u0142adowy kod do analizy<\/a><\/figcaption><\/figure>\n\n\n\n<p>Istotne, \u017ceby w projekcie testowym dodana by\u0142a referencja do coverlet.collector, dzi\u0119ki kt\u00f3remu mo\u017cemy zebra\u0107 dane po przeprowadzeniu test\u00f3w. Kolejne kroki to stworzenie tokena, kt\u00f3ry pozwoli na przeprowadzenie analizy oraz wyb\u00f3r rodzaju projektu \u2013 w naszym przypadku to .NET (Ryc. 9):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/020-sonar-analysis-configuration.jpg\"><img decoding=\"async\" width=\"840\" height=\"576\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/020-sonar-analysis-configuration.jpg\" alt=\"Generowanie tokena i wyb\u00f3r rodzaju projektu\" class=\"wp-image-22549\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/020-sonar-analysis-configuration.jpg 840w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/020-sonar-analysis-configuration-300x206.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/020-sonar-analysis-configuration-768x527.jpg 768w\" sizes=\"(max-width: 840px) 100vw, 840px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 9 Generowanie tokena i wyb\u00f3r rodzaju projektu<\/figcaption><\/figure>\n\n\n\n<p>SonarQube podpowie nam, jakich komend powinni\u015bmy u\u017cy\u0107, aby przeprowadzi\u0107 analiz\u0119. Domy\u015blnie jednak nie proponuje wygenerowania pokrycia kodu, wobec tego rozszerzmy nieco propozycj\u0119 (poni\u017csze instrukcje dotycz\u0105 wersji Core .NET, a dla wersji .NET Framework prosz\u0119 odnie\u015b\u0107 si\u0119 do dokumentacji):<\/p>\n\n\n\n<pre class=\"wp-block-preformatted\">dotnet sonarscanner begin \/k:\"SonarTest\" \/d:sonar.host.url=\"http:\/\/localhost:9000\" \/d:sonar.token=\"TwojTokenZSonarQube\" \/d:sonar.cs.opencover.reportsPaths=\"**\\coverage.opencover.xml\" \/d:sonar.qualitygate.wait=true\n\ndotnet build\n\ndotnet test --collect:\"XPlat Code Coverage;Format=opencover\"\n\ndotnet sonarscanner end \/d:sonar.token=\" TwojTokenZSonarQube \" <\/pre>\n\n\n\n<p>Pierwsza linia skryptu powy\u017cej odpowiada za start analizy, wskazuj\u0105c jednocze\u015bnie nazw\u0119 projektu, URL serwera, token oraz nazw\u0119 pliku raportu jaki zostanie wykorzystany w generowaniu raportu po stronie SonarQube. Drugiej komendy my\u015bl\u0119, \u017ce nie trzeba t\u0142umaczy\u0107. Komenda trzeci odpala testy oraz generuje plik w formacie opencover o nazwie coverage.opencover.xml. Ostatnia komenda odpowiada za zako\u0144czenie analizy. Na naszym ekranie powinni\u015bmy zobaczy\u0107 informacje o powodzeniu przeprowadzonej analizy (Ryc. 10):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/025-sonar-execution-output.jpg\"><img decoding=\"async\" width=\"805\" height=\"250\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/025-sonar-execution-output.jpg\" alt=\"Rezultat analizy\" class=\"wp-image-22553\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/025-sonar-execution-output.jpg 805w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/025-sonar-execution-output-300x93.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/025-sonar-execution-output-768x239.jpg 768w\" sizes=\"(max-width: 805px) 100vw, 805px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 10 Rezultat analizy<\/figcaption><\/figure>\n\n\n\n<p>Wracaj\u0105c do web UI (Ryc. 11), mo\u017cemy w bardzo czytelnej formie przegl\u0105dn\u0105\u0107 wszystkie problemy, kt\u00f3re zosta\u0142y wykryte podczas analizy:<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/030-sonar-results.jpg\"><img decoding=\"async\" width=\"1024\" height=\"526\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/030-sonar-results-1024x526.jpg\" alt=\"Problemy wykryte podczas analizy SonarQube\" class=\"wp-image-22556\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/030-sonar-results-1024x526.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/030-sonar-results-300x154.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/030-sonar-results-768x395.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/030-sonar-results.jpg 1304w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 11 Problemy wykryte podczas analizy SonarQube<\/figcaption><\/figure>\n\n\n\n<p><strong>Celem artyku\u0142u jest pokazanie, jak przeprowadzi\u0107 analiz\u0119 kodu<\/strong>, nie b\u0119d\u0119 natomiast omawia\u0142 interfejsu web SonarQube i mo\u017cliwo\u015bci, jakie nam daje.<\/p>\n\n\n\n<p>Warto jeszcze wspomnie\u0107 o dost\u0119pnym rozszerzeniu do Visual Studio o nazwie SonarLint, kt\u00f3re pozwala nam m.in. na prac\u0119 w Connected Mode i bie\u017c\u0105c\u0105 analiz\u0119 naszego kodu. Po instalacji SonarLint nale\u017cy skonfigurowa\u0107 go do u\u017cycia z naszym serwerem SonarQube. W pierwszej kolejno\u015bci po stronie serwera musimy wygenerowa\u0107 User Token, klikaj\u0105c w My Account i wybieraj\u0105c zak\u0142adk\u0119 security (Ryc. 12):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-full\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/035-sonar-user-token.jpg\"><img decoding=\"async\" width=\"1021\" height=\"337\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/035-sonar-user-token.jpg\" alt=\"Generowanie User Token\" class=\"wp-image-22558\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/035-sonar-user-token.jpg 1021w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/035-sonar-user-token-300x99.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/035-sonar-user-token-768x253.jpg 768w\" sizes=\"(max-width: 1021px) 100vw, 1021px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 12 Generowanie User Token<\/figcaption><\/figure>\n\n\n\n<p>Kolejnym i ostatnim ju\u017c krokiem jest konfiguracja po\u0142\u0105czenia po stronie Visual Studio. W\u0142\u0105czamy widok Team Explorer, klikamy Connect i podajemy URL naszego serwera oraz wcze\u015bniej wygenerowany User Token (Ryc. 13):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/040-sonar-sonarlint-config.jpg\"><img decoding=\"async\" width=\"1024\" height=\"515\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/040-sonar-sonarlint-config-1024x515.jpg\" alt=\"Konfiguracja SonarLint\" class=\"wp-image-22561\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/040-sonar-sonarlint-config-1024x515.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/040-sonar-sonarlint-config-300x151.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/040-sonar-sonarlint-config-768x386.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/040-sonar-sonarlint-config.jpg 1052w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 13 Konfiguracja SonarLint<\/figcaption><\/figure>\n\n\n\n<p>Teraz pozostaje klikn\u0105\u0107 prawym przyciskiem na nasz projekt i wybra\u0107 opcj\u0119 Bind. W okienku Error List w VS powinni\u015bmy widzie\u0107 te same problemy, jak w web UI SonarQube (lokalnie tworzony jest taki sam ruleset, jak w profilach na serwerze i jest on zsynchronizowany) (Ryc. 14):<\/p>\n\n\n\n<figure class=\"wp-block-image aligncenter size-large\"><a href=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/045-sonar-error-list.jpg\"><img decoding=\"async\" width=\"1024\" height=\"216\" src=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/045-sonar-error-list-1024x216.jpg\" alt=\"Widoczne ostrze\u017cenia wykryte przez SonarLint\" class=\"wp-image-22563\" srcset=\"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/045-sonar-error-list-1024x216.jpg 1024w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/045-sonar-error-list-300x63.jpg 300w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/045-sonar-error-list-768x162.jpg 768w, https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/045-sonar-error-list.jpg 1383w\" sizes=\"(max-width: 1024px) 100vw, 1024px\" \/><\/a><figcaption class=\"wp-element-caption\">Ryc. 14 Widoczne ostrze\u017cenia wykryte przez SonarLint<\/figcaption><\/figure>\n\n\n\n<h2 class=\"wp-block-heading\"><strong>Podsumowanie<\/strong><\/h2>\n\n\n\n<p>W artykule om\u00f3wi\u0142em narz\u0119dzie SonarQube, kt\u00f3re s\u0142u\u017cy do statycznej analizy kodu \u017ar\u00f3d\u0142owego w celu wykrycia b\u0142\u0119d\u00f3w, wyciek\u00f3w pami\u0119ci, nieprawid\u0142owych zastosowa\u0144 zmiennych, nieefektywnych fragment\u00f3w kodu i innych problem\u00f3w. Narz\u0119dzie to dzia\u0142a w oparciu o regu\u0142y analizy statycznej, kt\u00f3re okre\u015blaj\u0105 standardy kodowania i najlepsze praktyki.<\/p>\n\n\n\n<p>SonarQube umo\u017cliwia programistom definiowanie i dostosowywanie w\u0142asnych regu\u0142 analizy statycznej oraz dostarcza raporty o jako\u015bci kodu dla ca\u0142ego zespo\u0142u.<\/p>\n\n\n\n<p>***<\/p>\n\n\n\n<p>Je\u017celi interesuj\u0105 Ci\u0119 <a href=\"https:\/\/sii.pl\/blog\/all\/przeglad-narzedzi\/\" target=\"_blank\" aria-label=\"inne narz\u0119dzia wykorzystywane w bran\u017cy IT (opens in a new tab)\" rel=\"noreferrer noopener\" class=\"ek-link\">inne narz\u0119dzia wykorzystywane w bran\u017cy IT<\/a>, zobacz koniecznie wi\u0119cej artyku\u0142\u00f3w naszych ekspert\u00f3w. <\/p>\n\n\n<div class=\"kk-star-ratings kksr-auto kksr-align-left kksr-valign-bottom\"\n    data-payload='{&quot;align&quot;:&quot;left&quot;,&quot;id&quot;:&quot;22529&quot;,&quot;slug&quot;:&quot;default&quot;,&quot;valign&quot;:&quot;bottom&quot;,&quot;ignore&quot;:&quot;&quot;,&quot;reference&quot;:&quot;auto&quot;,&quot;class&quot;:&quot;&quot;,&quot;count&quot;:&quot;44&quot;,&quot;legendonly&quot;:&quot;&quot;,&quot;readonly&quot;:&quot;&quot;,&quot;score&quot;:&quot;4.7&quot;,&quot;starsonly&quot;:&quot;&quot;,&quot;best&quot;:&quot;5&quot;,&quot;gap&quot;:&quot;11&quot;,&quot;greet&quot;:&quot;&quot;,&quot;legend&quot;:&quot;4.7\\\/5 ( votes: 44)&quot;,&quot;size&quot;:&quot;18&quot;,&quot;title&quot;:&quot;Statyczna analiza kodu w .NET przy u\u017cyciu SonarQube localhost&quot;,&quot;width&quot;:&quot;130.8&quot;,&quot;_legend&quot;:&quot;{score}\\\/{best} ( {votes}: {count})&quot;,&quot;font_factor&quot;:&quot;1.25&quot;}'>\n            \n<div class=\"kksr-stars\">\n    \n<div class=\"kksr-stars-inactive\">\n            <div class=\"kksr-star\" data-star=\"1\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"2\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"3\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"4\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" data-star=\"5\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n    \n<div class=\"kksr-stars-active\" style=\"width: 130.8px;\">\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n            <div class=\"kksr-star\" style=\"padding-right: 11px\">\n            \n\n<div class=\"kksr-icon\" style=\"width: 18px; height: 18px;\"><\/div>\n        <\/div>\n    <\/div>\n<\/div>\n                \n\n<div class=\"kksr-legend\" style=\"font-size: 14.4px;\">\n            4.7\/5 ( votes: 44)    <\/div>\n    <\/div>\n","protected":false},"excerpt":{"rendered":"<p>W dzisiejszych czasach, testowanie oprogramowania jest kluczowym etapem w procesie wytwarzania aplikacji. Dlatego te\u017c, w celu zapewnienia jako\u015bci kodu, cz\u0119sto &hellip; <a class=\"continued-btn\" href=\"https:\/\/sii.pl\/blog\/statyczna-analiza-kodu-w-net-przy-uzyciu-sonarqube-localhost\/\">Continued<\/a><\/p>\n","protected":false},"author":329,"featured_media":22568,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_acf_changed":false,"_editorskit_title_hidden":false,"_editorskit_reading_time":0,"_editorskit_is_block_options_detached":false,"_editorskit_block_options_position":"{}","inline_featured_image":false,"footnotes":""},"categories":[1314],"tags":[2427,1742,1546,129,272],"class_list":["post-22529","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-development-na-twardo","tag-digital","tag-sonarqube","tag-przeglad-narzedzi","tag-c","tag-net"],"acf":[],"aioseo_notices":[],"republish_history":[],"featured_media_url":"https:\/\/sii.pl\/blog\/wp-content\/uploads\/2023\/06\/Statyczna-analiza-kodu-w-.NET-przy-uzyciu-SonarQube-localhost.jpg","category_names":["Development na twardo"],"_links":{"self":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22529"}],"collection":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/users\/329"}],"replies":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/comments?post=22529"}],"version-history":[{"count":3,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22529\/revisions"}],"predecessor-version":[{"id":22781,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/posts\/22529\/revisions\/22781"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media\/22568"}],"wp:attachment":[{"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/media?parent=22529"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/categories?post=22529"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/sii.pl\/blog\/wp-json\/wp\/v2\/tags?post=22529"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}