I vÄrt arbete anvÀnder vi aktivt plattformen SonarQube för att upprÀtthÄlla en hög kodkvalitet. Vid integrationen av ett av projekten skrivet i VueJs+Typescript, uppstod problem. DÀrför skulle jag vilja berÀtta mer om hur vi lyckades lösa dem.

Denna artikel handlar, som jag nĂ€mnde tidigare, om plattformen SonarQube. Lite teori â vad Ă€r det alls för nĂ„got, för de som hör talas om den för första gĂ„ngen:
SonarQube (tidigare Sonar) â en plattform med öppen kĂ€llkod för kontinuerlig analys och bedömning av kodkvalitet.
Stöder kodanalys och felidentifiering enligt programmeringsstandarder som MISRA C, MISRA C++, MITRE/CWE och CERT Secure Coding Standards. Det kan ocksÄ identifiera fel frÄn OWASP Top 10 och CWE/SANS Top 25 programvarufel.
Trots att plattformen anvÀnder olika fÀrdiga verktyg, sammanfattar SonarQube resultaten till en enhetlig instrumentpanel, vilket visar historiken av körningar och dÀrigenom möjliggör att se den övergripande trenden i förÀndringen av programvarukvalitet under utvecklingen.
Mer information kan erhÄllas pÄ
Det stöder ett stort antal programmeringssprĂ„k. Enligt informationen frĂ„n lĂ€nken ovan â det Ă€r över 25 sprĂ„k. För att stödja ett specifikt sprĂ„k mĂ„ste motsvarande plugin installeras. I community-versionen ingĂ„r pluginet för arbete med Javascript (inklusive typesŃript), Ă€ven om det stĂ„r motsatsen i wikin. Det Javascript sköts av pluginet SonarJS, för Typescript SonarTS respektive.
För att skicka tÀckningsinformation anvÀnds den officiella klienten sonarqube-scanner, som, med instÀllningar frÄn config-filen, skickar dessa data till servern SonarQube för vidare konsolidering och aggregating.
För Javascript det finns . SÄ, vi börjar med steg-för-steg implementeringen av SonarQube pÄ Vue-projektet som anvÀnder Typescript.
För att sÀtta upp servern SonarQube anvÀnder vi docker-compose.
sonar.yaml:
version: '1'
services:
simplesample-sonar:
image: sonarqube:lts
ports:
- 9001:9000
- 9092:9092
network_mode: bridgeStarta:
docker-compose -f sonar.yml upEfter detta SonarQube kommer att vara tillgĂ€ngligt pĂ„ adressen â .

Just nu finns det inga projekt, och det Àr förstÄeligt. Vi kommer att ÄtgÀrda denna situation. Jag utgick frÄn det officiella exempelprojektet för VueJS+TS+Jest. Vi klonar det till oss:
git clone https://github.com/vuejs/vue-test-utils-typescript-example.gitFörst behöver vi installera klienten SonarQube, som kallas sonar-scanner, för npm finns en wrapper:
yarn add sonarqube-scannerOch vi lÀgger omedelbart till kommandot i scripts för att arbeta med det.
package.json:
{
âŠ
scripts: {
...
"sonar": "sonar-scanner"
...
},
âŠ
}DÀrefter, för att skannern ska fungera, mÄste vi ange projektinstÀllningar i en speciell fil. LÄt oss börja med det grundlÀggande.
sonar-project.properties:
sonar.host.url=http://localhost:9001
sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Test-applikation (VueJS+TS)
sonar.sources=src
# sonar.tests=
sonar.test.inclusions=src/**/*tests*/**
sonar.sourceEncoding=UTF-8- sonar.host.url â adressen Sonarâa;
- sonar.projectKey â en unik identifierare för projektet pĂ„ servern Sonarâa;
- sonar.projectName â namnet pĂ„ det, vilket kan Ă€ndras nĂ€r som helst, eftersom identifieringen av projektet sker genom projectKey;
- sonar.sources â mappen med kĂ€llor, vanligtvis Ă€r detta src, men det kan vara vad som helst. Denna mapp anges relativt rotmappen, vilket Ă€r mappen frĂ„n vilken skannern körs;
- sonar.tests â en parameter som gĂ„r i par med den föregĂ„ende. Detta Ă€r mappen dĂ€r testerna finns. I detta projekt finns det ingen sĂ„dan mapp, utan testet ligger bredvid den testade komponenten i mappen 'testâ, sĂ„ vi kommer tills vidare att ignorera den och anvĂ€nda nĂ€sta parameter;
- sonar.test.inclusions â sökvĂ€gen för tester med en mask, det kan finnas flera element listade genom kommatecken;
- sonar.sourceEncoding â kodningen för kĂ€llfilerna.
För den första körningen av skannern Àr allt klart, förutom den grundlÀggande föregÄende ÄtgÀrden: att köra sjÀlva testmotorn för att generera information om tÀckning som skannern senare ska anvÀnda.
Men för detta mÄste testmotorn konfigureras för att generera denna information. I detta projekt Àr testmotorn Jest. Och dess instÀllningar finns i den relevanta delen av filen package.json.
Vi lÀgger till dessa instÀllningar:
"collectCoverage": true,
"collectCoverageFrom": [
"src/**/*",
"!src/main.ts",
"!src/App.vue",
"!src/**/*.d.*",
"!src/**/*__tests__*"
],Det vill sÀga vi stÀller in flaggan för behovet av att berÀkna tÀckningen och kÀllan (tillsammans med undantagen) baserat pÄ vilka den ska bildas.
Nu kör vi testet:
yarn testVi fÄr följande resultat:

Anledningen Àr att det inte finns nÄgon kod i sjÀlva komponenten. LÄt oss ÄtgÀrda detta.
HelloWorld.vue:
...
methods: {
calc(n) {
return n + 1;
}
},
mounted() {
this.msg1 = this.msg + this.calc(1);
},
...Detta bör rÀcka för att berÀkna tÀckningen.
Efter omstart av testet kan vi bekrÀfta detta:

PÄ skÀrmen ska vi se information om tÀckning, och i projektmappen kommer en mapp att skapas coverage med information om testtÀckning i ett universellt format LCOV (LTP GCOV-extension).
Gcov â ett fritt tillgĂ€ngligt verktyg för att undersöka kodtĂ€ckning. Gcov genererar det exakta antalet körningar för varje uttalande i programmet och möjliggör att lĂ€gga till anteckningar i kĂ€llkoden. Gcov levereras som ett standardverktyg i GCC-paketet.
Lcov â ett grafiskt grĂ€nssnitt för gcov. Det samlar gcov-filer för flera kĂ€llkods-filer och skapar ett komplettpaket av HTML-sidor med kod och detaljer om tĂ€ckning. Sidor genereras ocksĂ„ för att förenkla navigeringen. Lcov stöder tĂ€ckning av rader, funktioner och förgreningar.
Efter att testerna har körts kommer informationen om tÀckning att finnas i coverage/lcov.info.
Vi mÄste ange SonarvarifrÄn vi ska hÀmta den. DÀrför lÀgger vi till följande rader i dess konfigurationsfil. Men det finns en sak: projekt kan vara flersprÄkiga, det vill sÀga i mappen src finns kÀllkod för flera programmeringssprÄk och tillhörighet till respektive sprÄk, och i sin tur bestÀms anvÀndningen av en viss plugin, baserat pÄ dess filÀndelse. Och informationen om tÀckning kan lagras pÄ olika stÀllen för olika programmeringssprÄk, sÄ för varje programmeringssprÄk finns det en egen konfigurationsdel för detta. VÄrt projekt anvÀnder Typescript, sÄ vi behöver en konfigurationsdel just för det:
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.infoAllt Àr klart för första körningen av skannern. Jag vill pÄpeka att projektet i Sonarskapades automatiskt vid första körningen av skannern för detta projekt. Vid efterföljande tillfÀllen kommer informationen redan att ackumuleras, sÄ att man kan se hur projektparameterna förÀndras över tid.
SÄ, lÄt oss anvÀnda kommandot som tidigare skapades i package.json:
yarn run sonar AnmÀrkning: man kan ocksÄ anvÀnda parametern -X för mer detaljerad loggning.
Om skannern kördes för första gÄngen kommer dess binÀrfil att laddas ner först. DÀrefter startas den och börjar skanna servern Sonarefter installerade plugins, vilket berÀknar de stödda programmeringssprÄken. Andra olika parametrar för dess drift laddas ocksÄ: quality profiles, active rules, metrics repository, server rules.


AnmÀrkning: kommer vi inte att gÄ in i detaljer om i denna artikel, men man kan alltid hÀnvisa till officiella kÀllor.
DÀrefter inleds analysen av mappen src avseende pÄ förekomsten av kÀllfiler för alla (om inget specifikt anges) stödda programmeringssprÄk, följt av deras indexering.

DÀrefter följer olika analyser som vi inte fokuserar pÄ i denna artikel (till exempel som: linting, identifiering av koddupplikationer osv.).
I slutet av skanningsprocessen sker en aggregering av all insamlad information, komprimering och skickas till servern.
Efter detta kan vi titta pÄ vad som har uppnÄtts i webgrÀnssnittet:

Som vi ser har nÄgot blivit resultat, och visar till och med en viss tÀckning, men det motsvarar inte vÄr Jest-rapport.
LÄt oss fördjupa oss i detta. Vi tittar nÀrmare pÄ projektet, klickar pÄ tÀckningsvÀrdet och "dyker ner" i den detaljerade rapporten om filerna:

HÀr ser vi förutom den huvudsakliga, undersökta filen HelloWorld.vue, finns Àven en fil main.ts, som förstör hela bilden av tÀckningen. Men hur kan det vara sÄ, vi uteslöt honom frÄn tÀckningsberÀkningen. Ja, det stÀmmer, men det var pÄ nivÄ Jest, men skannern har indexerat honom, sÄ han kom med i berÀkningarna.
LÄt oss fixa detta:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...Jag vill förtydliga: förutom de mappar som anges i denna parameter, inkluderas ocksÄ alla mappar som listas i parametern sonar.test.inclusions.
Efter att skannern har kört ser vi redan korrekt information:


LĂ„t oss diskutera nĂ€sta punkt â Kvalitetsprofiler. Jag nĂ€mnde tidigare stödet för Sonarflera programmeringssprĂ„k samtidigt. Detta Ă€r precis vad vi observerar. Men vi vet att projektet Ă€r skrivet i TS, sĂ„ varför belasta skannern med onödiga manipulationer och kontroller. SprĂ„ket för analys stĂ€lls in genom att lĂ€gga till ytterligare en parameter i konfigurationsfilen Sonar:
sonar-project.properties:
...
sonar.language=ts
...LÄt oss köra skannern igen och se resultatet:

TÀckningen har försvunnit helt.
Om vi tittar i skannerloggarna kan vi se följande rad:
![]()
Det vill sÀga att vÄra projektfiler helt enkelt inte har indexerats.
Situationen Àr som följer: officiellt stöd för VueJs finns i pluginet SonarJS, som ansvarar för Javascript.

Men detta stöd finns inte i pluginet SonarTS för TS, vilket bekrÀftas av en officiell biljett i bugghanteraren. Sonar:
HÀr Àr nÄgra svar frÄn en av representanter frÄn SonarQube-utvecklarna, som bekrÀftar detta faktum.


Men det fungerade ju tidigare, invĂ€nder du. Ja, det Ă€r helt riktigt, lĂ„t oss försöka lite âhackaâ.
Om det finns stöd för .vue-filer. SonarSÄ lÄt oss försöka sÀga till honom att han ska se dem som Typescript.
LÄt oss lÀgga till en parameter:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...LÄt oss köra skannern:

Och vips, allt har ÄtergÄtt till det normala, med endast en profil för Typescript. SÄ vi lyckades lösa problemet med stödet för VueJs+TS för SonarQube.
LÄt oss gÄ vidare och förbÀttra informationen om tÀckning.
Vad har vi gjort hittills:
- lagt till i projektet Sonar-skannern;
- konfigurerat Jest för att generera information om tÀckning;
- konfigurerat Sonar-skannern;
- löste problemet med stödet för .vue-filer + Typescript.
Utöver testtÀckning finns det andra intressanta och anvÀndbara kodkvalitetskriterier, exempelvis kodduplicering och antal rader (deltar i berÀkningen av koefficienter relaterade till kodens komplexitet) i projektet.
I den nuvarande implementationen av plugin för att arbeta med TS (SonarTS) kommer inte att fungera CPD (Copy Paste Detector) och antal rader kod .vue-filer.
För att skapa en syntetisk situation för kodduplicering, duplicera helt enkelt komponentfilen med ett annat namn, lÀgg Àven till en tom funktion i koden och duplicera den med ett annat namn. För att kontrollera dupliceringen som i main.ts , samt i .vue.ts -filer. main.ts:
... function name(params:string): void { console.log(params); } ...
För detta mÄste vi temporÀrt kommentera konfigurationsraden:LÄt oss starta om skannern tillsammans med testningen:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...yarn test && yarn run sonar
SjÀlvklart kommer vÄr tÀckning att sjunka, men det Àr inte sÄ intressant just nu.I relation till kodduplication kommer vi att se:
För att verifiera anvÀnder vi

CPD -verktyget âjscpd npx jscpd src:
För rader kod:
Detta kan komma att lösas i framtida versioner av pluginerna

SonarJS(TS) . Jag vill pÄpeka att de gradvis börjar slÄ samman dessa tvÄ plugins till ett, vilket jag tror Àr rÀtt. SonarJSNu skulle jag vilja övervÀga möjligheten att förbÀttra informationen om tÀckning.
För nÀrvarande ser vi testtÀckningen i procent, över hela projektet, och per filer specifikt. Men det finns en möjlighet att utöka detta mÄtt med information om antalet
unit -tester i projektet, samt i relation till filer.Det finns ett bibliotek som kan
-rapport konvertera till format för Jestgeneric test data Sonar:
LĂ„t oss installera detta bibliotek i vĂ„rt projekt: â .
yarn add jest-sonar-reporter
Och lÀgg till det i konfigurationen... "testResultsProcessor": "jest-sonar-reporter" ... Jest:
package.json:
Nu utför vi testet:Efter det kommer en fil att skapas i projektets rot
yarn testtest-report.xml LÄt oss anvÀnda den i konfigurationen.
... sonar.testExecutionReportPaths=test-report.xml ... Sonar:
sonar-project.properties:
Och starta om skannern:Och vi startar om skannern:
yarn run sonarLÄt oss se vad som har Àndrats i grÀnssnittet Sonar:

Och ingenting har Àndrats. Det Àr sÄ att Sonar inte betraktar filerna som beskrivs i Jest-rapporten som filer -tester i projektet, samt i relation till filer.-test. För att rÀtta till denna situation anvÀnder vi en konfigurationsparameter Sonar sonar.tests, dÀr vi tydligt anger mapparna med test (vi har för nÀrvarande bara en):
sonar-project.properties:
âŠ
sonar.tests=src/components/__tests__
âŠLĂ„t oss starta om skannern:
yarn run sonarLÄt oss se vad som har Àndrats i grÀnssnittet:

Nu har vi sett antalet av vÄra -tester i projektet, samt i relation till filer.-test och genom att klicka in kan vi se fördelningen av detta antal över projektfilerna:

Slutsats
SÄ vi har gÄtt igenom verktyget för kontinuerlig analys SonarQube. Vi har framgÄngsrikt integrerat det med ett projekt skrivet i VueJs+TS. Vi har löst vissa kompatibilitetsproblem. Vi har ökat informationsinnehÄllet i testtÀckningsmÄttet. I den hÀr artikeln har vi bara gÄtt igenom ett av kvalitetskriterierna (möjligen ett av de viktigaste), men SonarQube stödjer Àven andra kvalitetskriterier, inklusive sÀkerhetstestning. Men inte alla dessa funktioner Àr helt tillgÀngliga i community-versionen. En av de intressanta och anvÀndbara funktionerna Àr integrationer SonarQube med olika kÀllkodshanteringssystem, till exempel GitLab och BitBucket. För att förhindra merge pull(merge) requesttill huvudgrenen av förrÄdet vid en reduktion av tÀckningen. Men det Àr historien för en helt annan artikel.
PS: Allt som beskrivs i artikeln som kod finns tillgÀngligt i .
Endast registrerade anvÀndare kan delta i omröstningen. , tack.
AnvÀnder du plattformen SonarQube:
26,3%Ja5
15,8%Nej3
15,8%Har hört talas om denna plattform och vill anvÀnda den3
10,5%Har hört talas om denna plattform och vill inte anvÀnda den2
0,0%AnvÀnder en annan plattform0
31,6%Hör första gÄngen om den6
19 anvÀndare har röstat. 3 anvÀndare har avstÄtt.
KĂ€lla: habr.com
