SonarQube – pierwsze kroki

23/04/2020

Data ostatniej aktualizacji: 04.09.2020 10:58

Czy warto korzystać z narzędzi do automatycznej analizy kodu? Czy czas i wysiłek poświęcony na zainstalowanie i konfigurację takiego oprogramowania może przynieść wymierne korzyści dla naszego projektu? W niniejszym artykule postaram się odpowiedzieć na te pytania. Posłużę się przykładem platformy SonarQube. Przy okazji pokażę prosty sposób na samodzielną instalację i uruchomienie tego narzędzia pozwalające zapoznać się z jego funkcjonalnościami oraz wdrożyć we własnym projekcie.

SonarQube – co to takiego?

SonarQube jest narzędziem służącym do ciągłej analizy statycznej kodu pod względem jakości. Umożliwia automatyczne wykrywanie błędów, słabych punktów powodujących obniżenie bezpieczeństwa oraz tzw. “code smells”. Potrafi odnaleźć fragmenty, które zostały powielone, co pozwala zredukować ilość kodu. Głównymi korzyściami płynącymi z zastosowania SonarQube jest poprawa jakości i bezpieczeństwa tworzonego kodu oraz kontrola i zmniejszenie długu technologicznego.

Analiza kodu źródłowego

Najprościej rzecz ujmując w wyniku przeprowadzonej analizy otrzymujemy ogólną miarę jakości oraz listę przypadków, w których zdefiniowane reguły zostały złamane.

image001 - Altkom Software & Consulting

W chwili publikacji artykułu, SonarQube w wersji 8.1.0.31237 oferował wsparcie dla 27 języków. Liczba zdefiniowanych reguł, na podstawie których zachodzi weryfikacja jest imponująca, a w razie potrzeby możemy też dodawać własne. Każda z reguł jest szczegółowo opisana oraz zawiera przykłady rozwiązania problemu.

image003 - Altkom Software & Consulting

Z poziomu zakładki Quality Profiles mamy dostęp do listy profili określających które reguły są obecnie aktywne. Inicjalnie dla każdego języka dostępny jest domyślny, nieedytowalny profil Sonar way, który możemy potraktować jako punkt wyjścia, skopiować i zacząć dostosowywać do potrzeb danego projektu.

Edycja Developer daje możliwość analizowania branchy i pull requestów. Wsparcie w zakresie integracji z interfejsami graficznymi wybranych narzędzi ALM (GitHub, Bitbucket czy GitLab) pozwala łatwo zweryfikować czy nowy kod spełnia założone wymagania jakości. Quality Gate zdefiniowany na poziomie brancha umożliwia określenie czy istniejący na nim kod jest gotowy do „zmergowania”.

Quality Gate

Quality Gate jest narzędziem determinującym standardy dotyczące jakości przyjęte dla danego projektu. Zgodnie z dokumentacją jest to zbiór warunków określających gotowość kodu do wypuszczenia na środowisko produkcyjne. Warunki definiowane w ramach Quality Gate to na przykład:

Domyślna konfiguracja, Sonar way jest zalecana dla większości projektów. W myśl promowanego przez twórców podejścia Clean as You Code jedynie określa warunki dotyczące nowego kodu. Nic nie stoi jednak na przeszkodzie aby tworzyć i zapisywać własne profile dopasowane do potrzeb i specyfiki konkretnych projektów.

image005 - Altkom Software & Consulting

Pierwsza linia obrony

Nikomu nie trzeba tłumaczyć jak ważnym aspektem jest bezpieczeństwo aplikacji. SonarQube ma wiele do zaoferowania również w tym względzie. Dedykowany moduł potrafi prześledzić ścieżkę, którą pokonują potencjalnie zmanipulowane przez atakującego dane i wykrywa wrażliwe miejsca w kodzie, w których może nastąpić atak. SonarQube zapewnia wsparcie dla wielu znanych API, które mogą stanowić źródło jak również cel ataku. Umożliwia konfigurację pod kątem pracy z autorskimi framework’ami, m.in. w zakresie sanityzacji kodu. Daje to ochronę przed atakami typu SQL Injection, Code Injection czy Server-Side Request Forgery (SSRF).

image007 - Altkom Software & Consulting

SonarQube w akcji

Aby na własne oczy zobaczyć co potrafi SonarQube i samodzielnie przetestować jego możliwości możemy szybko i łatwo uruchomić instancję lokalnie. Poniżej przykład z wykorzystaniem kontenera docker’owego, projektu budowanego przy użyciu Maven i domyślnej konfiguracji:

  1. Uruchamiamy serwer SonarQube:
    $ docker run -d --name sonarqube -p 9000:9000 sonarqube
  2. W pliku pom projektu, który chcemy analizować w sekcji build -> plugins dodajemy zależność:
    <plugin>
     <groupId>org.sonarsource.scanner.maven</groupId>
     <artifactId>sonar-maven-plugin</artifactId>
     <version>3.7.0.1746</version>
    </plugin>

    Uruchamiamy skan przez wywołanie polecenia:

    mvn sonar:sonar

To wszystko. Teraz pod adresem http://localhost:9000 z poziomu przeglądarki mamy dostęp do interfejsu graficznego. Możemy zalogować się na użytkownika admin (hasło: admin). Statystyki dotyczące skanu, który przed chwilą wykonaliśmy znajdują się na liście projektów w zakładce Projects. Po wybraniu projektu możemy m.in. przeglądać listę bug’ów, podatności czy też uzyskać informację na temat pokrycia testami. Nawigacja jest łatwa i intuicyjna.

image009 - Altkom Software & Consulting

Wczesne wykrywanie problemów

Jedną z najbardziej użytecznych z punktu widzenia programisty funkcjonalności opisywanej platformy jest Sonarlint – rozszerzenie dostępne dla wszystkich popularnych IDE – pozwalające na wykrywanie nieprawidłowości już w momencie pisania kodu.

W celu integracji z IntelliJ IDEA instalujemy plugin Sonarlint. Jeżeli chcemy korzystać z tych samych reguł, które mamy zdefiniowane na serwerze konfigurujemy połączenie (w przeciwnym wypadku będą używane reguły domyślne):

image011 - Altkom Software & Consulting

Od tej pory mamy dostęp do dodatkowej zakładki, na której widoczna jest lista problemów wykrytych w aktualnie otwartym pliku, wraz z opisem każdego przypadku. Dodatkowo miejsca, w których występują nieprawidłowości są zaznaczone w edytorze. Znacznie usprawnia to pracę dewelopera w zakresie tworzenia czystego kodu jak również stwarza okazję do rozszerzenia wiedzy w tym obszarze dzięki definicjom i przykładom zaprezentowanym w regułach.

W trybie połączenia z serwerem dostajemy też możliwość otrzymywania powiadomień (tzw. SonarLint Smart Notifications) o ewentualnej zmianie statusu Quality Gate oraz o przypadkach wykrycia nowych problemów w naszym kodzie.

Integracja z systemami kontroli wersji

Dane pobrane z systemu kontroli wersji w trakcie skanowania pozwalają na odblokowanie takich funkcjonalności jak:

SonarQube zapewnia domyślnie wsparcie dla Git i SVN.

Integracja z narzędziami Continuous Integration

Skanowanie SonarQube można włączyć jako jeden z kroków w wykorzystywanym procesie CI ponieważ łatwo integruje się on z popularnymi narzędziami takimi jak Jenkins czy Azure DevOps. W praktyce build zakończy się statusem failed za każdym razem kiedy nie zostaną spełnione kryteria określone przez Quality Gate.

image013 - Altkom Software & Consulting

Co jeszcze potrafi SonarQube?

Obok opisanych wyżej funkcjonalności SonarQube oferuje wiele dodatkowych opcji. Są to:

SonarQube w chmurze

W przypadku projektów open source istnieje możliwość korzystania ze wszystkich funkcjonalności online za darmo pod adresem https://sonarcloud.io/ lub skorzystania z płatnych planów do prowadzenia prywatnych analiz.

image015 - Altkom Software & Consulting

Podsumowanie

Jak widać zastosowanie w projektach narzędzi platformy SonarQube niesie ze sobą wiele korzyści. Daje nam możliwość kontroli nad jakością tworzonego kodu oraz pozwala na zarządzanie długiem technologicznym. Dzięki automatycznemu wykrywaniu wielu podatności wspomaga tworzenie bezpiecznych aplikacji. Usprawnia proces code review i daje szybki dostęp do bazy wiedzy obejmującej reguły czystego kodu już na etapie jego tworzenia. Łatwość instalacji i integracji z systemami kontroli wersji i CI powodują, iż czas konfiguracji narzędzia jest niewielki. Sugeruję tu pamiętać o wykorzystaniu dostępnych opcji konfiguracji w celu dostosowania reguł do charakteru swojego projektu i specyfiki zespołu, który nad nim pracuje.

Autor: Bartosz Wojtulewicz, Starszy Programista Java w Altkom Software & Consulting