Integration av projektet VueJS+TS med SonarQube

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.

Integration av projektet VueJS+TS med SonarQube

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Ä den officiella webbplatsen

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 npm-wrapper. 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: bridge

Starta:

docker-compose -f sonar.yml up

Efter detta SonarQube kommer att vara tillgĂ€ngligt pĂ„ adressen – http://localhost:9001 .

Integration av projektet VueJS+TS med SonarQube
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.git

Först behöver vi installera klienten SonarQube, som kallas sonar-scanner, för npm finns en wrapper:

yarn add sonarqube-scanner

Och 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 test

Vi fÄr följande resultat:

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

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.info

Allt À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.

Integration av projektet VueJS+TS med SonarQube

Integration av projektet VueJS+TS med SonarQube

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.

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

TÀckningen har försvunnit helt.

Om vi tittar i skannerloggarna kan vi se följande rad:

Integration av projektet VueJS+TS med SonarQube

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.

Integration av projektet VueJS+TS med SonarQube

Men detta stöd finns inte i pluginet SonarTS för TS, vilket bekrÀftas av en officiell biljett i bugghanteraren. Sonar:

  1. https://jira.sonarsource.com/browse/MMF-1441
  2. https://github.com/SonarSource/SonarJS/issues/1281

HÀr Àr nÄgra svar frÄn en av representanter frÄn SonarQube-utvecklarna, som bekrÀftar detta faktum.

Integration av projektet VueJS+TS med SonarQube

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

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

Integration av projektet VueJS+TS med SonarQube

CPD -verktyget –jscpd npx jscpd src:

För rader kod:

Integration av projektet VueJS+TS med SonarQube

Detta kan komma att lösas i framtida versioner av pluginerna

Integration av projektet VueJS+TS med SonarQube

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: — https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

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 test

test-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 sonar

LÄt oss se vad som har Àndrats i grÀnssnittet Sonar:

Integration av projektet VueJS+TS med SonarQube

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 sonar

LÄt oss se vad som har Àndrats i grÀnssnittet:

Integration av projektet VueJS+TS med SonarQube

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:

Integration av projektet VueJS+TS med SonarQube

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 min fork.

Endast registrerade anvÀndare kan delta i omröstningen. Logga in, 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

Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar đŸ”„ Köp pĂ„litlig webbhotell med DDoS-skydd, VPS VDS-servrar | ProHoster