Java-projektin laatua paremmaksi – SonarQube

No niin, tämä ei ole varsinaisen uusi tuote, ja jotkut aiemmista asiakkaistani ovat hehkuttaneet tätä jo aiemminkin, mutta vasta nyt oma tieni vei tämän äärelle.

Olen metriikkafriikki. Tarkoittaen että minusta on mukavaa saada jotain kättä pidempää analyysiä projektin laadusta, ja pidemmälle vieden teknisestä velasta. Siitä spagettikoodi-sotkusta jota helposti kertyy kun kiireessä ja paineen alla tehdään ja mennään siitä missä aita on matalin.

Ideana ei toki ole vain paljastaa tuskaa huonosta koodista, vaan parantaa läpinäkyvyyttä ja tukea parhaita käytäntöjä. Ideaali työlooppiin liittyy testi (speksi), minimikoodi joka sen läpäisee (ruma), riittävästi iteraatioita jotta testi ja implementaatio toimivat ok, jonka jälkeen refaktorointikierros – joka usein unohdetaan kiireessä. Toisin sanoen, jos metriikkaa kerää vanhasta projektista jossa on muutama miljoona riviä, tuska on valtaisa ja refaktoroinnin määrä kohtuuton ja epärealistinen. Eli paras hetki ottaa näkyvyyttä on itseasiassa projektin alusta alkaen, ja ideana tehdä siitä kehittäjille hyvin halpa, säännöllinen, havainnollinen, helppo, ja jopa hauska (Gamifikaatio olisi tässä kova juttu – saavutuksia ja tasoja 😉

No niin, rönsyilyksi meni. Joka tapauksessa, itse kerään metriikkaa mm. Jenkinsin avulla, GitHub näyttää kivasti metriikkaa, ja olen tottunut ajamaan code coverage vimpaimia kuten Cobertura ja JaCoCo, sekä staattisen lähdekoodin analyysejä kuten FindBugs ja PMD. Mutta nyt otin käyttöön myös Sonarin joka yhdistelee näitä, ja mikä mukavinta solahtaa mukavasti Maveniin jotta jokainen koodaaja voi sen halutessaan ajaa – tai Jenkinsiin jotta saadaan säännöllisiä raportteja. Näillä on hyvä näyttää teknisen velan määrä, idea, ja totuttaa säännölliseen refaktorointiin – joka taas vaatii testikattavuutta.

SonarQube sai huomioni kahdesta syystä: Se alkoi juuri tukemaan ainakin osittain Java 8 tasoa, ja siinä on hieno JavaScript plugin. Siinä on useita hyödyllisiä maksuttomia plugineita, ja kyseessä on aluperinkin open source tuote, mutta tarvittaessa löytyy maksullista tukea ja parempia plugareita rahalla.

Tässäpä kokoonpanoa:

Testasin ensin SonarQube serveriä omalla koneella. Latailin sen osoitteesta http://www.sonarqube.org/ – ja ajoin scriptin, joka potkaisi serverin ja muistitietokannan käyntiin porttiin 9000. Tämän jälkeen ajoin Mavenissä komennon

mvn sonar:sonar

— ja raporttihan sieltä putkahti esiin serverille. Tämän jälkeen viritin serverin toimimaan pysyvämmälle palvelimelle – valitettavasti .war paketointia ei ole enää nykyisin tarjolla, ja menin siitä missä aita on matalin eli latasin suoraan linux-asennuksen ja asensin sen servicenä. Mutta sama lopputulos kuin edellä – nyt vain serveri jyllää yötäpäivää saatavilla. Pystytin myös mysql kannan ja muutin SonarQube serverin properties tiedostosta oikeat ajurit ja yhteystiedot.

Maven työasemapäässä sitten piti opettaa sonar käyttämään etäserveriä paikallisen sijasta. Tein säädöt henk koht settings.xml tiedostoon (.m2 kansion alla oman kotihakemiston alla, tämä ei mene lähdekoodihallintaan vaan on joka kehittäjällä oma) – ja se näyttää about tältä:

<profiles>
 <profile>
 <id>sonar</id>
 <activation>
 <activeByDefault>true</activeByDefault>
 </activation>
 <properties>
 <sonar.jdbc.url>
 jdbc:mysql://myserver.mycompany.com:3306/sonar?useUnicode=true&amp;characterEncoding=utf8
 </sonar.jdbc.url>
 <sonar.jdbc.username>myusernamethatisnotroot</sonar.jdbc.username>
 <sonar.jdbc.password>notrootpassword</sonar.jdbc.password>
 <sonar.host.url>
 http://myserver.mycompany.com:9000
 </sonar.host.url>
 </properties>
 </profile>
 </profiles>

Ja taas voi ajella mvn sonar:sonar komentoa kehitysasemissa – nyt vain raportit tallettuvat jaetulle palvelimelle ja mysql kantaan.

Seuraava steppi: Oletuksena sonarissa on java-plugin joka ei oikein java 8:n kanssa tule toimeen. Sen voi onneksi päivittää uusimpaan versioon ja se alkaa tulemaan vähän paremmin toimeen.

(Yhteensopivuusongelmat ovat mm. pmd ja jacoco ja findbugs kanssa, ne voi halutessaan toki disabloida. PMD ja JaCoCo ja FindBugs taas ovat Java8 kanssa ongelmissa kiitos ASM kirjaston, jonka aiemmat/nykyiset versiot eivät tajua Java 8 bytecodea. Tässä on aika sotkuinen vyyhti ja hyvin mielenkiintoista että tätä ei ole fiksattu jo ennen Java 8 julkaisua – mutta useimpia näistä tekevät harrastetyönään kehittäjät joilla on muutakin elämää)

Joka tapauksessa, Java plugarin päivityksen ohella itse tuli asennettua mm. JavaScript plugari, sekä pdf raportointiplugari. Monenmoista muutakin herkullista löytyy.

Tuossa kuvaa Sonar raportista – kaikkine karuuksineen – ennen kuin aletaan siistimään sen perusteella:

sonar raportti

Ja JavaScriptistäkin tämä sai rouskutettua esiin metriikkaa – vaikka kyseessä on aika monimuotoinen projekti – mielestäni tosin aika lepsu analyysi 😉

sonar_javascript

Mutta – metriikaa näkyviin alkumetreistä, ja säännöllisesti. Näin saadaan koodin löyhkät esiin aiemmin. Näin saadaan bugeja korjattua ennen kuin niistä tulee bugeja – ja levitetään parhaita käytäntöjä tasaisesti tiimin kesken. SonarQube näyttäisi olevan taas yksi palikka pinossa joka saa oman hyväksyntäleiman.

Paholaismainen puoleni on seuraavaksi kiinnostunut miettimään laittaisiko buildin failaamaan jos coverage report ei ole riittävällä tasolla, jos javadoc generoinnissa on virheitä tai varoituksia, tai jos koodin kompleksisuusmetriikka mättää :p

Mainokset

Vastaa

Täytä tietosi alle tai klikkaa kuvaketta kirjautuaksesi sisään:

WordPress.com-logo

Olet kommentoimassa WordPress.com -tilin nimissä. Log Out / Muuta )

Twitter-kuva

Olet kommentoimassa Twitter -tilin nimissä. Log Out / Muuta )

Facebook-kuva

Olet kommentoimassa Facebook -tilin nimissä. Log Out / Muuta )

Google+ photo

Olet kommentoimassa Google+ -tilin nimissä. Log Out / Muuta )

Muodostetaan yhteyttä palveluun %s