{"id":95,"date":"2017-07-25T07:26:10","date_gmt":"2017-07-25T05:26:10","guid":{"rendered":"http:\/\/rafallancucki.pl\/?p=95"},"modified":"2017-10-03T17:16:45","modified_gmt":"2017-10-03T15:16:45","slug":"potyczki-z-sonarqube","status":"publish","type":"post","link":"https:\/\/rafallancucki.pl\/index.php\/2017\/07\/25\/potyczki-z-sonarqube\/","title":{"rendered":"Potyczki z SonarQube"},"content":{"rendered":"<p style=\"text-align: justify; text-indent: 30px;\">W ramach podnoszenia jako\u015bci kod\u00f3w zdecydowali\u015bmy si\u0119 na uruchomienie SonarQube dla naszych projekt\u00f3w. Oczywi\u015bcie pocz\u0105tki okaza\u0142y si\u0119 trudne, bo jak ka\u017cda nowo\u015b\u0107 r\u00f3wnie\u017c statyczna analiza kod\u00f3w na pocz\u0105tku wydaje si\u0119 by\u0107 przeszkod\u0105 a nie pomoc\u0105. Jednak praktyka pokazuje, \u017ce by\u0142a to bardzo dobra decyzja. Spor\u0105 ilo\u015b\u0107 czasu po\u015bwi\u0119con\u0105 na konfiguracj\u0119 i wst\u0119pne wyczyszczenie kodu wynagradza z nawi\u0105zk\u0105 wymuszanie dobrych standard\u00f3w, jak r\u00f3wnie\u017c czasami wykrywanie b\u0142\u0119d\u00f3w w kodzie. Chcia\u0142bym pokr\u00f3tce opisa\u0107 co uruchomili\u015bmy w naszym projekcie i jak osi\u0105gn\u0119li\u015bmy u\u017cyteczno\u015b\u0107 narz\u0119dzia.<\/p>\n<p><!--more--><br \/>\n<img loading=\"lazy\" decoding=\"async\" width=\"300\" height=\"215\" class=\"alignnone size-medium wp-image-97\" style=\"display: block; margin: 0 auto;\" src=\"http:\/\/rafallancucki.pl\/wp-content\/uploads\/2017\/07\/Sonar-300x215.png\" alt=\"\" srcset=\"https:\/\/rafallancucki.pl\/wp-content\/uploads\/2017\/07\/Sonar-300x215.png 300w, https:\/\/rafallancucki.pl\/wp-content\/uploads\/2017\/07\/Sonar-768x551.png 768w, https:\/\/rafallancucki.pl\/wp-content\/uploads\/2017\/07\/Sonar-624x447.png 624w, https:\/\/rafallancucki.pl\/wp-content\/uploads\/2017\/07\/Sonar.png 1018w\" sizes=\"(max-width: 300px) 100vw, 300px\" \/><\/p>\n<h3>Pierwsze kroki<\/h3>\n<p style=\"text-align: justify; text-indent: 30px;\">W tej cz\u0119\u015bci nie chc\u0119 si\u0119 zajmowa\u0107 technicznymi aspektami instalacji &#8211; s\u0105 one opisane w wielu miejscach. Instalacja samego SonarQube nie jest problemem. Zainstalowany na build serwerze, zintegrowany z buildami TFS. Build si\u0119 uruchamia, pojawiaj\u0105 si\u0119 pierwsze wyniki analiz. Troch\u0119 zabawy z uruchomieniem integracji SCM, ale i to udaje si\u0119 rozwi\u0105za\u0107. Serwer jest zainstalowany, podczas ka\u017cdego build-a pojawiaj\u0105 si\u0119 statystyki.<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">Po kr\u00f3tkiej chwili rado\u015bci z posiadania nowego narz\u0119dzia przychodzi zimny prysznic. Pomimo, i\u017c projekt by\u0142 rozpoczynany z wysokimi standardami jako\u015bci ilo\u015b\u0107 raportowanych problem\u00f3w jest spora. Rozpoczynali\u015bmy z unit testami, mamy nowoczesn\u0105 architektur\u0119 a tu code smells liczone w setkach i Quality Gate czerwone. A mia\u0142o by\u0107 tak pi\u0119knie&#8230;<\/p>\n<h3>Nie jest dobrze \ud83d\ude09<\/h3>\n<p style=\"text-align: justify; text-indent: 30px;\">Po d\u0142u\u017cszym zastanowieniu przychodzi konkluzja &#8211; je\u015bli narz\u0119dzie ma by\u0107 u\u017cyteczne, to trzeba jako\u015b doprowadzi\u0107 do stanu, \u017ceby szum informacyjny zamieni\u0107 na u\u017cyteczne informacje. Tu kr\u00f3tka dygresja &#8211; oczywi\u015bcie bardzo pomaga zainstalowanie SonarQube w momencie rozpocz\u0119cia projektu. Je\u015bli uruchomimy analiz\u0119 statyczn\u0105 kodu na dalszym etapie projektu, to trzeba si\u0119 liczy\u0107 z du\u017c\u0105 ilo\u015bci\u0105 b\u0142\u0119d\u00f3w. Ale nawet w tym przypadku warto, jedynie QualityGate nale\u017cy dopasowa\u0107, aby reagowa\u0142y na nowo stworzone kody, pomijaj\u0105c b\u0142\u0119dy w ju\u017c istniej\u0105cych. K<\/p>\n<p style=\"text-align: justify; text-indent: 30px;\">W naszym przypadku pojawi\u0142y si\u0119 2 du\u017ce kategorie problem\u00f3w:<\/p>\n<ol>\n<li>B\u0142\u0119dy zwi\u0105zane ze specyfik\u0105 technologii<\/li>\n<li>B\u0142\u0119dy zwi\u0105zane z faktycznymi niedoskona\u0142o\u015bciami w kodzie \u017ar\u00f3d\u0142owym<\/li>\n<\/ol>\n<h3>B\u0142\u0119dy zwi\u0105zane ze specyfik\u0105 technologii<\/h3>\n<p style=\"text-align: justify; text-indent: 30px;\">Przyk\u0142adem takiego problemu jest na przyk\u0142ad metoda render() w React. Trudno sobie wyobrazi\u0107 dzielenie funkcji render() na ma\u0142e kawa\u0142ki, a SonarQube ca\u0142y czas zg\u0142asza zbyt du\u017c\u0105 z\u0142o\u017cono\u015b\u0107 funkcji lub zbyt d\u0142ug\u0105 funkcj\u0119. Mo\u017cna tu wy\u0142\u0105czy\u0107 specyficzny typ regu\u0142y w konkretnych plikach. Czyli np. javascript:FunctionComplexity jest wy\u0142\u0105czone w plikach **\/*Component.js (komponenty React maj\u0105 takie nazwy).<\/p>\n<h3>B\u0142\u0119dy zwi\u0105zane z faktycznymi niedoskona\u0142o\u015bciami w kodzie \u017ar\u00f3d\u0142owym<\/h3>\n<p style=\"text-align: justify; text-indent: 30px;\">Tutaj post\u0119powanie podobne &#8211; lepiej wy\u0142\u0105czy\u0107 tymczasowo jak\u0105\u015b regu\u0142\u0119 i p\u00f3\u017aniej w kolejnych sprintach poprawia\u0107 kody \u017ar\u00f3d\u0142owe, ni\u017c funkcjonowa\u0107 z b\u0142\u0119dami liczonymi w setkach &#8211; nikt nie b\u0119dzie zwraca\u0142 uwagi na alerty z SonarQube. Wi\u0119c kilka regu\u0142 zosta\u0142o globalnie wy\u0142\u0105czonych, a reszta b\u0142\u0119d\u00f3w uznanych za wa\u017cne zosta\u0142a poprawionych. Teraz stopniowo w kolejnych sprintach bierzemy kolejn\u0105 regu\u0142\u0119 i po w\u0142\u0105czeniu staramy si\u0119 wyczy\u015bci\u0107 kody \u017ar\u00f3d\u0142owe.<\/p>\n<h3>Podsumowanie<\/h3>\n<p style=\"text-align: justify; text-indent: 30px;\">SonarQube jako narz\u0119dzie oddaje nieocenione us\u0142ugi ale uruchomienie go tylko po to, \u017ceby dzia\u0142a\u0142 nie przyniesie efekt\u00f3w. Nale\u017cy po\u0142\u0105czy\u0107 to z wysi\u0142kiem doprowadzenia projektu do stanu QualityGate: Passed nawet za cen\u0119 wy\u0142\u0105czenia\/dostosowania pewnych regu\u0142. Maj\u0105c na uwadze stopniowe doprowadzanie kodu do faktycznego stanu. Czego wszystkim \u017cycz\u0119 \ud83d\ude09<\/p>\n","protected":false},"excerpt":{"rendered":"<p>W ramach podnoszenia jako\u015bci kod\u00f3w zdecydowali\u015bmy si\u0119 na uruchomienie SonarQube dla naszych projekt\u00f3w. Oczywi\u015bcie pocz\u0105tki okaza\u0142y si\u0119 trudne, bo jak ka\u017cda nowo\u015b\u0107 r\u00f3wnie\u017c statyczna analiza kod\u00f3w na pocz\u0105tku wydaje si\u0119 by\u0107 przeszkod\u0105 a nie pomoc\u0105. Jednak praktyka pokazuje, \u017ce by\u0142a to bardzo dobra decyzja. Spor\u0105 ilo\u015b\u0107 czasu po\u015bwi\u0119con\u0105 na konfiguracj\u0119 i wst\u0119pne wyczyszczenie kodu wynagradza [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_exactmetrics_skip_tracking":false,"_exactmetrics_sitenote_active":false,"_exactmetrics_sitenote_note":"","_exactmetrics_sitenote_category":0,"footnotes":""},"categories":[7],"tags":[],"_links":{"self":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts\/95"}],"collection":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/comments?post=95"}],"version-history":[{"count":4,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts\/95\/revisions"}],"predecessor-version":[{"id":100,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/posts\/95\/revisions\/100"}],"wp:attachment":[{"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/media?parent=95"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/categories?post=95"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/rafallancucki.pl\/index.php\/wp-json\/wp\/v2\/tags?post=95"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}