Pomysł na Raspberry Pi – SonarQube

simplecoding.pl 7 lat temu

Cześć czytelniku. Chciałbym Ci dzisiaj pokazać interesujące zastosowanie Raspberry Pi. Część osób, która kupuje ten minikomputer łapie zajawkę na początku, świat IoT, mnóstwo zastosowań…jednak niektórzy mają takie Raspberry, podepną diodę, migną raz czy dwa i taki sprzęt leży i się marnuje, zakurzony…..

No dobrze, a co to Raspberry Pi?

Rozumiem, iż część osób mogło nie słyszeć o czymś takim, więc przybliżę czym jest ta malina. Tak najprościej jest to mini komputer. Najpopularniejsza jego wersja wygląda o tak:

To cudo potrafi znacznie więcej niż tylko miganie diodą. Bardzo niskim kosztem można zrobić na przykład domowy monitoring (w najbliższym czasie z chęcią pokażę jak łatwe może to być). Wiele różnych inspiracji można znaleźć w sieci. A dlaczego to jest takie super? Przede wszystkim jest to niski wydatek. w tej chwili w wersji trzeciej w cenie około 200 złotych dostajemy mini komputer, który posiada: wejście HDMI, 4 wyjścia USB, moduł Wi-Fi, Bluetooth, port Ethernet oraz to, czego “zwykły komputer” nie posiada, czyli 40 GPIO (interfejs do komunikacji z innymi urządzeniami) oraz 4 gniazda montażowe. Zasilany jest on poprzez wejście micro USB, a jako pamięć masowa najczęściej tutaj występuje karta micro SD. Pozostałe parametry? 1 GB RAM, 1,2 Ghz taktowanie… Takie coś tylko za 200 zł? Brzmi świetnie, prawda?

Problem w tym, iż czasami gwałtownie zajawka mija…osobiście bardziej zajmuję się programowaniem aplikacji niż tak niskopoziomowymi rzeczami. Priorytety wzięły górę i też niestety “zabawka” poszła trochę w odstawkę…na szczęście wpadłem na pomysł jak to wykorzystać do moich codziennych zastosowań. Postanowiłem zrobić z Raspberry Pi domowy serwer, w którym będę miał całą analizę projektów względem jakości i poprawności kodu. Do tego służy np bardzo znany SonarQube.

A czym znowu jest ten cały SonarQube?

SonarQube to nic innego jak platforma do ciągłej analizy kodu właśnie. Pozwala łatwo znaleźć duplikaty kodu, kod niezgodny ze standardem, pokrycie kodu testami, potencjalne bugi. Wszystko ponadto jest zapisywane historycznie. Oznacza to, iż łatwo możemy sprawdzić jak jakość naszego kodu zmieniała się w czasie. Bardzo ważna też jest możliwość sprawdzenia naszego długu technologicznego, czyli najprościej rzecz ujmując czasu, który potrzebujemy do poprawienia kodu w taki sposób, aby jakościowo był bardzo dobry. Jak to z długami bywa, im większy on jest, tym większe potencjalne problemy możemy mieć…jest to jednak temat na osobnego posta, na pewno go też poruszę. Kolejną zaletą Sonara jest bardzo przejrzysty webowy interfejs graficzny. Jego obsługę poruszę w najbliższych dniach, ale sam możesz go odkrywać, jest bardzo intuicyjny. I na koniec jako zaletę możemy wymienić łatwą integrację z wszelakimi IDE oraz pluginami. Osobiście mam to zintegrowanie z moim ulubionym IntelliJ i łatwo mogę sprawdzić będąc w danej klasie co tutaj nie gra. Łatwo też to połączyć z narzędziami typu Maven czy Gradle. Możemy dzięki jednej komendy analizować projekt. O tym wspomnę następnym razem. Sonara możesz postawić na zwykłym komputerze, jednak jak nie musimy naszego sprzętu obciążać, a możemy do tej pracy “zaciągnąć” Raspberry Pi to dlaczego by nie?

Przed zabawą – co nam będzie potrzebne?

Oczywiście, niezbędne będzie nam Raspberry Pi. Ważne, aby było ono w tej samej sieci co komputer z którego chcemy się łączyć. Osobiście mam dostęp do Raspberry z komputera poprzez sieć LAN (Raspberry Pi oraz mój PC podpięte do tego samego switcha) oraz sieć wirtualną. Umożliwia mi to zdalne połączenie. Tutaj akurat pokażę to w wariancie pierwszym. Ponadto, na Raspberry Pi posiadam zainstalowany system operacyjny Raspbian (standardowa dystrybucja Debiana na Raspberry Pi), PC z Linuxem Mint (nie jest to konieczne oczywiście). SonarQube ma też swoje wymagania. Musi gdzieś wszystkie dane przechowywać. W tym celu potrzebna będzie nam baza danych, którą zainstalujemy w pierwszej kolejności.

Instalacja PostgreSQL

System bazodanowy dużego znaczenia dla nas jako użytkowników mieć nie będzie. Ja zdecydowałem się na PostgreSQL. Jestem fanem rozwiązań opensource’owych. Rozważałem też użycie MySQLa, gdyż jest popularniejszy i łatwo dostępny. Niestety, na Raspberry Pi udostępnionego mamy MySQLa w wersji 5.5, natomiast SonarQube wspiera ten silnik bazodanowy od wersji 5.6. Na początku musimy na naszym mini komputerze zainstalować potrzebne pakiety wpisując w terminal (Ctrl + Alt + T, zapamiętaj bardzo dobrze ten skrót):

sudo apt-get install postgresql-9.4 postgresql postgresql-common postgresql-client

Mamy tutaj silnik bazodanowy w wersji 9.4, klienta dostępnego z terminala (CLI – command line interface) oraz inne potrzebne moduły.

Teraz weźmiemy się za konfigurację.W pierwszej kolejności ustawimy hasło do użytkownika postgres który jest naszym rootem (z ang. korzeń). Możesz się z określeniem “root” spotykać często. Jest to główny użytkownik ze wszystkimi uprawnieniami. Boss. Lepiej, żebyś hasła do niego nie zapomniał, brak wszystkich uprawnień mogłby być bolesny…:) Osobiście używam do przechowywania haseł LastPassa, Ty oczywiście możesz zrobić to tak, jak Ci wygodnie. Przy okazji też zobaczymy czy PostgreSQL zainstalował się poprawnie. Wpisz w terminal:

sudo -u postgres psql

Jeżeli wszystko poszło dobrze, powinniśmy się znaleźć w CLI PostgresSQL. Wpisujemy teraz:

\password postgres

Zostaniemy zapytani o nowe hasło dla użytkownika postgres o którym była mowa. Następnie utworzymy dwóch użytkowników. Jeden będzie dla Sonara, drugi dla nas do dostępu zdalnego (nie jest to konieczne, ale warto mieć taki dostęp).

Zacznijmy od Sonara. Będę tutaj używać loginu i hasła jako SONAR_USER oraz SONAR_PASS. Postanowiłem, iż w moim przypadku będzie to:

SONAR_USER - sonar SONAR_PASS - *** :)

Analogicznie będzie dla naszego użytkownika zdalnego. Będę się tu odwoływać poprzez PC_USER oraz PC_PASS. Nazwę użytkownika wezmę taką samą z jakiej faktycznie korzystam na komputerze, czyli wszystko będzie wyglądać tak:

PC_USER - arturczopek PC_PASS - *** :)

Wpisujemy więc w terminalu:

CREATE ROLE SONAR_USER WITH LOGIN PASSWORD ‘SONAR_PASS’; CREATE ROLE PC_USER WITH LOGIN PASSWORD ‘PC_PASS’’;

Pamiętaj o zastąpieniu nazw użytkownika i haseł swoimi własnymi. Rezultat dla wszystkich polecenia powinien być następujący:

CREATE ROLE

W następnej kolejności stworzymy bazę danych dla Sonara, której właścicielem będzie nasz SONAR_USER. Nazwę bazy oznaczę jako SONAR_DATABASE. Ja nazwę bazę po prostu sonar (domyślnie sonarqube ma tak w konfiguracji). Wpisujemy kolejne proste zapytanie:

CREATE DATABASE sonar_database WITH OWNER = sonar_user;

Jeżeli wszystko poszło dobrze to powinniśmy zobaczyć:

CREATE DATABASE

Świetnie, mamy użytkowników, mamy bazę danych. Możemy opuścić terminal wpisując po prostu ‘\q’.

Dostęp zdalny do bazy danych

Teraz zadbamy o dostęp zdalny. Nie jest to konieczne i o ile go nie potrzebujesz i wystarczy Ci operowanie tylko na Raspberry to możesz ominąć ten punkt. Osobiście jednak zachęcam do takiego dostępu, może Ci się przydać do innych baz o ile takie byś posiadał na Raspberry Pi. Domyślnie PostgreSQL blokuje dostęp do bazy z innych maszyn. Jest to świetne na początku. Potem zwykle potrzebujemy dostępu do bazy z innego urządzenia. W tym celu musimy przejść do konfiguracji PostgreSQL. Otworzymy więc plik pg_hba.conf edytorem tekstowym. Osobiście użyję tutaj nano, nic bardziej skomplikowanego nam nie potrzeba. Pliki znajdziemy w folderze /etc/postgresql/9.4/main. Wpisujemy w terminal:

sudo nano /etc/postgresql/9.4/main/pg_hba.conf

Będziemy potrzebować tutaj dodać adresy, z których możemy się połączyć. Będziemy chcieli, aby każdy z naszej sieci mógł się połączyć. Ale zaraz, zaraz.. Skąd ja znam adres sieci? To jest stosunkowo proste. o ile chcemy wziąć wszystkie urządzenia z sieci, potrzebny będzie nam jej adres oraz maska. Możemy takie informacje uzyskać wpisując w konsolę:

ifconfig

Oto rezultat na moim PC (nie na Raspberry, aczkolwiek o ile są faktycznie w tej samej sieci to nie ma to znaczenia)

Świetnie! Z enp2s0 (u Ciebie może to być na przykład eth0) możemy odczytać, iż mój adres PC w sieci lokalnej to 192.168.1.140, a maska podsieci 255.255.255.0. zwykle maska jest taka sama w wielu przypadkach, natomiast adres w sieci lokalnej ma zwykle postać 192.168.x.y. Skrócony zapis maski domyślnej to /24 (24 “jedynek” w zapisie bitowym). Zatem pierwsze 24 bity (3 oktety) adresu PC to będzie adres naszej sieci. Resztę zastępujemy bitami ‘0’. W moim przypadku adres sieci będzie więc wyglądał tak 192.168.1.0.

Mamy już adres sieci, możemy powrócić do konfiguracji PostgreSQLa. Na końcu pliku pg_hba.conf, który już wcześniej na Raspberry otworzyliśmy potrzebujemy dodać:

host all all all adres_sieci/skrócona_maska md5.

W moim przypadku będzie to:

host all all 192.168.1.0/24 md5

Zapisujemy dane i zamykamy plik (w nano skrót klawiszowy – Ctrl + x).

Potrzebujemy też zmienić jeszcze jedną rzecz w innym pliku konfiguracyjnym – postgresql.conf. Otwórzmy go więc:

sudo nano /etc/postgresql/9.4/main/postgresql.conf

Szukamy linii, która posiada atrybut “listen_addresses”. Prawdopodobnie posiada ona wartość ‘localhost’. Zastępujemy ją:

listen_addresses = ‘*’

Zwróć uwagę na początek. Może być tak, iż masz “#listen_addresses”. To znaczy, iż linia jest “wykomentowana”, czyli nie będzie brana pod uwagę. Wystarczy usunąć znak hash (“#”) na początku linii. Teraz możemy zrestartować serwer i przejść do instalacji klienta na komputerze z którego będziemy się łączyć. Restart bazy danych wykonamy poprzez wpisanie w terminal:

sudo service postgresql restart

Teraz przejdziemy do naszego PC. Potrzebujemy zainstalować dwa pakiety. Klient oraz GUI do niego. Użyjemy pgAdmina, graficznie może trochę przestarzały, ale funkcjonalności ma wszystkie, które potrzebujemy i jest stworzony specjalnie pod ten silnik bazodanowy. W terminalu komputera:

sudo apt-get install postgresql-client pgadmin3

Możemy uruchomić GUI poprzez wpisanie w terminal pgadmin3 bądź w inny znany Ci sposób. Powinniśmy ujrzeć takie cudo:

Nic wyszukanego nas nie przywitało, prawda? Dodajemy teraz połączenie do bazy poprzez wybranie przycisku z wtyczką (pierwszy z lewej). Co potrzebujemy ustawić:

Name: nazwa połączenia, może być dowolna Host: adres IP Raspberry Pi (nie sieci! Weźmiesz go z ifconfiga Raspberry PI) Port: port bazy danych (domyślnie 5432) Service: może być pusty Maintenance DB: baza, zostawiamy postgres Username: nazwa użytkownika, połączymy się tutaj jako PC_USER Password: PC_PASS

W moim przypadku wygląda to tak:

Super, jesteśmy zalogowani, po rozwinięciu wszystkich elementów z boku widzimy, iż mamy co potrzeba. Fantastycznie!

Teraz wrócmy do Raspberry Pi. Czas zainstalować SonarQube!

Instalacja SonarQube

Możemy wziąć się teraz za naszą główną aplikacje. Ściągamy więc oprogramowanie z głównej strony SonarQube. W dniu, kiedy to pisałem aktualna wersja to 6.2. Oczywiście, robimy to na Raspberry Pi, czyli na naszym docelowym serwerze. Pobrany plik wypakowujemy do folderu w którym Sonar powinien się znajdować. W moim przypadku będzie to ~/Development/Servers. Zawartość folderu z SonarQube (u mnie sonarqube-6.2) powinna prezentować się następująco:

Pliki instalacyjne znajdują się w folderze bin. Zobaczymy tam, owszem, pliki instalacyjne dla linuxa, ale w naszym przypadku to nie zadziała…dlaczego? Jest to spowodowane architekturą Raspberry. Możesz sprawdzić architekturę komputera wpisując w terminal:

uname -m

Poniżej porównanie między raspberry a moim PC:

Jak widzimy, w Raspberry PI mamy ARM. Niestety, SonarQube teoretycznie nie wspiera takiego rozwiązania…teoretycznie. Możemy to ominąć używając odpowiedniego Java wrappera i skonfigurować aplikację tak, aby z niego korzystała. Wrapper ściągniemy klikając tutaj. Następnie, zawartość należy wypakować do WRAPPER_PATH (lokalizacja nie jest póki co aż tak ważna). Wypakowane pliki powinny wyglądać w ten sposób:

Teraz będziemy potrzebować Javy oraz Anta. Javę prawdopodobnie masz zainstalowaną już na Raspberry Pi. o ile jednak się mylę, wpisz:

sudo apt-get install oracle-java8-jdk

Zweryfikujemy czy wszystko poszło dobrze poprzez wpisanie w konsolę:

java -version

Rezultat powinien być zbliżony lub identyczny:

Teraz przejdziemy do Anta. Ant to narzędzie do tworzenia buildów w Javie, w tej chwili jednak się z nim nie spotykam, korzysta się raczej z Mavena lub Gradle’a (o Gradle’u na pewno się czegoś dowiesz ode mnie w swoim czasie). Instalujemy Anta wpisując w terminal:

sudo apt-get install ant

Potrzebujemy dodać anta jeszcze do zmiennych środowiskowych, przynajmniej tymczasowo. Robimy to bardzo prosto. Wpisz w terminal:

export ANT_HOME=/usr/share/ant

Potrzebujemy teraz “zbuildować” nasz wrapper. W tym celu przejdź do folderu WRAPPER_PATH i uruchom skrypt build32 z opcją ‘release’ Nie powinno to trwać długo. W moim przypadku zajęło to 38 sekund:

cd WRAPPER_PATH ./build32.sh release

Następnie przejdź do folderu dist oraz wypakuj w nim archiwum wrapper-linux-armhf-32-3.5.17.tar.gz

cd dist tar -xvzf wrapper-linux-armhf-32-3.5.17.tar.gz

Mamy wrapper, mamy resztę potrzebnego oprogramowania, teraz możemy połączyć to w jedną całość. Przejdź do folderu SONAR_PATH/bin. Następnie skopiuj zawartość folderu linux-x86-32 do folderu raspberry-pi, który właśnie utworzysz. Będą tam nasze pliki instalacyjne:

cd SONAR_PATH/bin cp -r linux-x-86-32/ raspberry-pi

Świetnie, teraz przejdź do folderu raspberry-pi, oraz miej pod ręką folder z wrapperem. Będzie trzeba część plików zastąpić. Po lewej będą podane pliki z wrappera, po prawej natomiast te z folderu raspberry-pi, który potrzebujemy zastąpić:

WRAPPER_PATH/dist/wrapper-linux-armhf-32-3.5.17/bin/wrapper -> SONAR_PATH/bin/raspberry-pi/wrapper WRAPPER_PATH/dist/wrapper-linux-armhf-32-3.5.17/lib/libwrapper.so -> SONAR_PATH/lib/libwrapper.so WRAPPER_PATH/dist/wrapper-linux-armhf-32-3.5.17/lib/wrapper.jar -> SONAR_PATH/lib/wrapper.jar

Zanim uruchomimy Sonara, musimy ustawić połączenie z bazą danych. Sonar się nie domyśli..:) Przejdź do folderu SONAR_PATH/conf i otwórz edytorem tekstowym plik sonar.properties. Znajdź tam linię:

#sonar.jdbc.url=jdbc:postgresql://localhost/sonar

Widać, iż jest ona ustawiona na bazę sonar w localhoście. Zastąp końcowy fragment ‘sonar’ Twoją nazwą, czyli Twoim SONAR_DATABASE. Ponadto trzeba usunąć znak “#” z przodu. Musimy także zapewnić użytkownika bazodanowego. Utworzyliśmy go już na szczęście wcześniej. Musimy tylko znaleźć odpowiednie linijki, odkomentować i wpisać dane. Szukamy więc:

#sonar.jdbc.username #sonar.jdbc.password

i zastępujemy:

sonar.jdbc.username=SONAR_USER sonar.jdbc.password=SONAR_PASS

Zwróć uwagę, iż z początku również trzeba było usunąć znaki “#”. Po zapisaniu pliku jesteśmy w końcu gotowi do odpalenia! Przejdź do głównego katalogu z sonarem oraz uruchom aplikację z folderu bin z konfiguracją dla Raspberry Pi.

cd SONAR_PATH/bin/raspberry-pi ./sonar.sh console

Początkowo może to trochę trwać (szczególnie za pierwszym razem, baza danych początkowo jest pusta), ale jak się doczekamy, to na naszej twarzy powinien pojawić się uśmiech Po wpisaniu w przeglądarkę na Raspberry localhost:9000 bądź z innego komputera adresu Raspberry Pi z portem 9000 (RASPBERRY_PI_IP:9000) powinno nam się ukazać takie cudo:

Udało się! Mamy dostęp do Sonara, możemy analizować nasz kod. Przykładową konfigurację pokażę na przykładzie swojego projektu już niebawem. Zagłębimy się także trochę głębiej w działanie Sonara. Póki co, zachęcam do poznawania samodzielnie tej aplikacji oraz dokładniejszego przejrzenia pliku konfiguracyjnego (SONAR_PATH/conf/sonar.properties, możemy zmienić na przykład port pod jakim znajduje się Sonar). Początkowe dane do logowania to admin/admin. Oczywiście, polecam je zmienić. Zachęcam także do przejrzenia tabelek w bazie poprzez pgAdmina (przejrzenia, a nie zmieniania, lepiej tam nie mieszać….).

Sonar jako serwis

No dobrze, sonar fajny, pobawimy się, ale co, za każdym razem muszę odpalać to manualnie? Jasne, iż nie. Możemy łatwo sprawić, aby Sonar uruchamiał się jako serwis przy starcie raspberry. Tak, żeby wystarczyło go nam tylko podpiąc do prądu.

W tym celu, należy na naszym Raspberry Pi w folderze /etc/init.d utworzyć plik “sonar” i umieścić w nim następujący kawałek “kodu”:

//code #!/bin/sh # # rc file for SonarQube # # chkconfig: 345 96 10 # description: SonarQube system (www.sonarsource.org) # ### BEGIN INIT INFO # Provides: sonar # Required-Start: $network # Required-Stop: $network # Default-Start: 3 4 5 # Default-Stop: 0 1 2 6 # Short-Description: SonarQube system (www.sonarsource.org) # Description: SonarQube system (www.sonarsource.org) ### END INIT INFO /usr/bin/sonar $*

Następnie, w terminalu wpisujemy trzy następujące polecenia (pamiętaj, aby podać swój SONAR_PATH):

sudo ln -s SONAR_PATH/bin/raspberry-pi/sonar.sh /usr/bin/sonar sudo chmod 755 /etc/init.d/sonar sudo update-rc.d sonar defaults

Zrestartuj swoje Raspberry Pi i zobacz, jak Sonar po chwili znowu powstanie! o ile natomiast masz problemy aby sprawdzić czy baza danych przy starcie się uruchomiła, to poprostu spróbuj się połączyć. o ile masz problem to prawdopodobnie baza domyślnie nie “wstaje” przy starcie. Wpisz poniższą komendę aby zażegnać problem:

sudo update-rc.d postgresql enable

Podsumowanie

To był długi post, ale mam nadzieję, iż dotrwałeś do końca! Dzięki bardzo za przeczytanie. Gorąco zachęcam do używania sonara. Niebawem pokażę jak można go użyć na przykładzie mojego projektu. Można więc uznać iż temat będzie kontynuowany. UPDATE: Tutaj możesz zobaczyć jak wdrożyć SonarQube do projektu.

Do przeczytania!

Idź do oryginalnego materiału