VueJS+TS-projektintegration med SonarQube

Vi anvÀnder plattformen aktivt i vÄrt arbete soundQube att upprÀtthÄlla kodkvaliteten pÄ en hög nivÄ. NÀr man integrerar ett av projekten som skrivits in VueJs+Typescript, problem uppstod. DÀrför skulle jag vilja berÀtta mer i detalj hur vi lyckades lösa dem.

VueJS+TS-projektintegration med SonarQube

I den hÀr artikeln kommer vi att prata, som jag skrev ovan, om SonarQube-plattformen. En liten teori - vad det Àr i allmÀnhet, för de som hör om det för första gÄngen:

soundQube (före detta Ekolod) Àr en öppen kÀllkodsplattform för kontinuerlig inspektion och kodkvalitetsmÀtning.
Stöder kodanalys och feldetektering enligt reglerna i programmeringsstandarderna MISRA C, MISRA C++, MITER/CWE och CERT Secure Coding Standards. Den kan ocksÄ kÀnna igen fel frÄn OWASP Top 10 och CWE/SANS Top 25 programmeringsfellistor.
Trots att plattformen anvÀnder olika fÀrdiga verktyg, reducerar SonarQube resultaten till en enda instrumentpanel, hÄller en historik över körningar och lÄter dig dÀrigenom se den allmÀnna trenden med förÀndringar i mjukvarukvalitet under utveckling.

Mer information finns pÄ officiella hemsida

Ett stort antal programmeringssprÄk stöds. Av informationen frÄn lÀnken ovan att döma Àr dessa fler Àn 25 sprÄk. För att stödja ett specifikt sprÄk mÄste du installera lÀmplig plugin. Communityversionen innehÄller ett plugin för att arbeta med Javascript (inklusive typerсript), Àven om wikin sÀger motsatsen. Bakom Javascript plugin svar SonarJS, för Typescript SonarTS respektive.

Den officiella klienten anvÀnds för att skicka tÀckningsinformation sonarqube-skanner, som med hjÀlp av instÀllningarna frÄn config-fil, skickar denna data till servern soundQube för ytterligare konsolidering och aggregering.

för Javascript finns npm omslag. SĂ„ lĂ„t oss börja steg-för-steg implementering soundQube ĐČ Vue-projekt med hjĂ€lp av skrivmaskin.

För att distribuera servern soundQube lÄt oss dra fördel docker-compose.

sonar.yaml:

version: '1'
    services:
        simplesample-sonar:
            image: sonarqube:lts
            ports:
                - 9001:9000
                - 9092:9092
            network_mode: bridge

Lansera:

docker-compose -f sonar.yml up

DÀrefter soundQube kommer att finnas pÄ: http://localhost:9001 .

VueJS+TS-projektintegration med SonarQube
Det finns inga projekt i det Ànnu och det Àr rÀttvist. Vi kommer att rÀtta till denna situation. Jag tog det officiella exempelprojektet för VueJS+TS+Jest. LÄt oss böja det mot oss sjÀlva:

git clone https://github.com/vuejs/vue-test-utils-typescript-example.git

Först mÄste vi installera klienten soundQube, som kallas ekolodsskannerför npm det finns ett omslag:

yarn add sonarqube-scanner

Och lÀgg omedelbart till kommandot skript att arbeta med det.

package.json:

{
 
 
   scripts: {
      ...
      "sonar": "sonar-scanner"
      ...
   },
 

}

DÀrefter, för att skannern ska fungera, mÄste du stÀlla in projektinstÀllningarna i en speciell fil. LÄt oss börja med grunderna.

sonar-project.properties:

sonar.host.url=http://localhost:9001

sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Test Application (VueJS+TS)

sonar.sources=src
# sonar.tests=
sonar.test.inclusions=src/**/*tests*/**
sonar.sourceEncoding=UTF-8

  • sonar.host.url - adress Ekolod'A;
  • sonar.projectKey – unik projektidentifierare pĂ„ servern Ekolod'A;
  • sonar.projectName – dess namn, det kan Ă€ndras nĂ€r som helst, eftersom projektet identifieras av projektnyckel;
  • ekolod.kĂ€llor – mapp med kĂ€llor, vanligtvis detta src, men kan vara vad som helst. Denna mapp Ă€r instĂ€lld i förhĂ„llande till rotmappen, som Ă€r den mapp frĂ„n vilken skannern startas;
  • ekolod.test – en parameter som gĂ„r parallellt med den föregĂ„ende. Det hĂ€r Ă€r mappen dĂ€r testerna finns. I det hĂ€r projektet finns det ingen sĂ„dan mapp, och testet finns bredvid komponenten som testas i mappen 'test', sĂ„ vi ignorerar det för tillfĂ€llet och anvĂ€nder nĂ€sta parameter;
  • sonar.test.inneslutningar – sökvĂ€g för tester med en mask, det kan finnas flera element listade separerade med kommatecken;
  • sonar.sourceEncoding – kodning för kĂ€llfiler.

För den första lanseringen av skannern Àr allt klart, förutom den huvudsakliga föregÄende ÄtgÀrden: starta sjÀlva testmotorn, sÄ att den kan generera information om tÀckningen, som skannern senare kommer att anvÀnda.

Men för att göra detta mÄste du konfigurera testmotorn för att generera denna information. I detta projekt Àr testmotorn det finns. Och dess instÀllningar finns i motsvarande del av filen package.json.

LÄt oss lÀgga till dessa instÀllningar:

"collectCoverage": true,
"collectCoverageFrom": [
      "src/**/*",
      "!src/main.ts",
      "!src/App.vue",
      "!src/**/*.d.*",
      "!src/**/*__tests__*"
],

Det vill sÀga, vi sÀtter sjÀlva flaggan för behovet av att berÀkna tÀckning och kÀllan (tillsammans med undantag) pÄ grundval av vilken den kommer att bildas.

LÄt oss nu köra testet:

yarn test

Vi kommer att se följande:

VueJS+TS-projektintegration med SonarQube

Anledningen Àr att det inte finns nÄgon kod i sjÀlva komponenten. LÄt oss fixa det hÀr.

HelloWorld.vue:

...
methods: {
    calc(n) {
      return n + 1;
    }
  },
mounted() {
  this.msg1 = this.msg + this.calc(1);
},
...

Detta kommer att rÀcka för att berÀkna tÀckningen.

Efter att ha startat om testet kommer vi att se till detta:

VueJS+TS-projektintegration med SonarQube

PÄ skÀrmen bör vi se information om tÀckningen, och en mapp kommer att skapas i projektmappen tÀckning med testtÀckningsinformation i ett universellt format LCOV (LTP GCOV-tillÀgg).

Gcov Àr ett fritt distribuerat verktyg för att undersöka kodtÀckning. Gcov genererar det exakta antalet körningar för varje sats i ett program och lÄter dig lÀgga till kommentarer till kÀllkoden. Gcov kommer som ett standardverktyg som en del av GCC-paketet.
Lcov - grafiskt grÀnssnitt för gcov. Den sÀtter ihop gcov-filer för flera kÀllfiler och producerar en uppsÀttning HTML-sidor med kod och tÀckningsinformation. Sidor genereras ocksÄ för att underlÀtta navigeringen. Lcov stöder tÀckning av strÀngar, funktioner och grenar.

Efter att testerna Àr slutförda kommer tÀckningsinformation att finnas i coverage/lcov.info.
Vi mÄste sÀga Ekolod'Var kan jag fÄ det ifrÄn? LÄt oss dÀrför lÀgga till följande rader till dess konfigurationsfil. Men det finns en poÀng: projekt kan vara flersprÄkiga, det vill sÀga i mappen src det finns kÀllkoder för flera programmeringssprÄk och anknytning till ett eller annat, och i sin tur bestÀms anvÀndningen av ett eller annat plugin av dess förlÀngning. Och tÀckningsinformation kan lagras pÄ olika platser för olika programmeringssprÄk, sÄ varje sprÄk har sin egen sektion för att stÀlla in detta. VÄrt projekt anvÀnder skrivmaskin, sÄ vi behöver en instÀllningssektion bara för det:

sonar-project.properties:

sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.info

Allt Àr klart för första lanseringen av skannern. Jag skulle vilja notera att projektet Àr Ekolod'e skapas automatiskt första gÄngen du kör skannern för ett givet projekt. I efterföljande tider kommer information att samlas för att se dynamiken i förÀndringar i projektparametrar över tid.

SÄ lÄt oss anvÀnda kommandot som skapades tidigare package.json:

yarn run sonar 

Notera: Du kan ocksÄ anvÀnda parametern -X för mer detaljerad loggning.

Om skannern startades för första gÄngen kommer binÀren för sjÀlva skannern att laddas ner först. Efter det startar den och börjar skanna servern Ekolod'a för installerade plugins, och berÀknar dÀrigenom sprÄk som stöds. Olika andra parametrar för dess funktion laddas ocksÄ: kvalitetsprofiler, aktiva regler, statistikförrÄd, serverregler.

VueJS+TS-projektintegration med SonarQube

VueJS+TS-projektintegration med SonarQube

Notera: Vi kommer inte att uppehÄlla oss i detalj inom ramen för den hÀr artikeln, men du kan alltid kontakta officiella kÀllor.

DÀrefter börjar mappanalysen src för tillgÀngligheten av kÀllfiler för alla (om ett specifikt sÄdant inte Àr uttryckligen specificerat) som stöds sprÄk, med efterföljande indexering.

VueJS+TS-projektintegration med SonarQube

DÀrefter kommer olika andra analyser, som vi inte fokuserar pÄ i den hÀr artikeln (till exempel linting, upptÀckt av kodduplicering etc.).

I slutet av skannerns arbete samlas all insamlad information, arkiveras och skickas till servern.

Efter detta kan vi redan se vad som hÀnde i webbgrÀnssnittet:

VueJS+TS-projektintegration med SonarQube

Som vi kan se fungerade nÄgot, och visar till och med nÄgon form av tÀckning, men det stÀmmer inte överens med vÄr det finns-Rapportera.

LÄt oss ta reda pÄ det. LÄt oss titta pÄ projektet mer i detalj, klicka pÄ tÀckningsvÀrdet och "falla igenom" i en detaljerad filrapport:

VueJS+TS-projektintegration med SonarQube

HÀr ser vi, förutom den huvudsakliga, granskade filen HelloWorld.vue, det finns ocksÄ en fil main.ts, vilket förstör hela bilden av bevakningen. Men hur kommer det sig att vi uteslutit det frÄn berÀkningen av tÀckningen. Ja, allt stÀmmer, men det var pÄ nivÄn det finns, men skannern indexerade det, sÄ det hamnade i sina berÀkningar.

LÄt oss fixa detta:

sonar-project.properties:

...
sonar.exclusions=src/main.ts
...

Jag skulle vilja göra ett förtydligande: förutom de mappar som anges i den hÀr parametern lÀggs Àven alla mappar som anges i parametern till sonar.test.inneslutningar.

Efter att ha startat skannern ser vi rÀtt information:

VueJS+TS-projektintegration med SonarQube

VueJS+TS-projektintegration med SonarQube

LÄt oss titta pÄ nÀsta punkt - Kvalitetsprofiler. Jag pratade ovan om stöd EkolodpÄ flera sprÄk samtidigt. Det Àr precis vad vi ser. Men vi vet att vÄrt projekt Àr inskrivet TS, sÄ varför anstrÀnga skannern med onödiga manipulationer och kontroller. Vi kommer att stÀlla in sprÄket för analys genom att lÀgga till ytterligare en parameter till konfigurationsfilen Ekolod'A:

sonar-project.properties:

...
sonar.language=ts
...

LÄt oss köra skannern igen och se resultatet:

VueJS+TS-projektintegration med SonarQube

TĂ€ckningen var helt borta.

Om vi ​​tittar pĂ„ skannerloggen kan vi se följande rad:

VueJS+TS-projektintegration med SonarQube

Det vill sÀga, vÄra projektfiler var helt enkelt inte indexerade.

Situationen Àr som följer: officiellt stöd VueJs finns i plugin-programmet SonarJSvem Àr ansvarig för Javascript.

VueJS+TS-projektintegration med SonarQube

Men detta stöd finns inte i plugin SonarTS för TS, om vilken en officiell biljett öppnades i buggspÄraren Ekolod'A:

  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 representanterna frÄn SonarQube-utvecklarna som bekrÀftar detta faktum.

VueJS+TS-projektintegration med SonarQube

VueJS+TS-projektintegration med SonarQube

Men allt fungerade för oss, invÀnder du. Ja det Àr det, lÄt oss prova lite "hacka".
Om det finns stöd .vue-filer Ekolod'Äh, lÄt oss dÄ försöka sÀga Ät honom att betrakta dem som skrivmaskin.

LÄt oss lÀgga till en parameter:

sonar-project.properties:

...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...

LÄt oss starta skannern:

VueJS+TS-projektintegration med SonarQube

Och voila, allt Àr tillbaka till det normala, och med en profil bara för skrivmaskin. Det vill sÀga vi lyckades lösa problemet i supporten VueJs+TS för soundQube.

LÄt oss försöka gÄ lÀngre och förbÀttra tÀckningsinformationen lite.

Vad vi har gjort hittills:

  • lagts till i projektet Ekolod-scanner;
  • uppstart det finns att generera tĂ€ckningsinformation;
  • konfigurerad Ekolod-scanner;
  • löste supportproblemet .vue-filer + skrivmaskin.

Förutom testtÀckning finns det andra intressanta anvÀndbara kriterier för kodkvalitet, till exempel kodduplicering och antalet rader (inblandade i berÀkningen av koefficienter relaterade till kodkomplexitet) i projektet.

I den nuvarande implementeringen av plugin för att arbeta med TS (SonarTS) kommer inte att fungera CPD (Copy Paste Detector) och rÀkna rader med kod .vue-filer.

För att skapa en syntetisk situation med kodduplicering, duplicera helt enkelt komponentfilen med ett annat namn och lÀgger Àven till den i koden main.ts en dummyfunktion och duplicera den med ett annat namn. För att kontrollera om duplicering som i .vue, och i .ts -filer.

main.ts:

...
function name(params:string): void {
  console.log(params);
}
...

För att göra detta mÄste du tillfÀlligt kommentera konfigurationsraden:

sonar-project.properties:

...
sonar.exclusions=src/main.ts
...

LÄt oss starta om skannern tillsammans med testning:

yarn test && yarn run sonar

Naturligtvis kommer vÄr bevakning att falla, men nu Àr vi inte intresserade av det.

NÀr det gÀller att duplicera kodrader kommer vi att se:

VueJS+TS-projektintegration med SonarQube

För att kontrollera kommer vi att anvÀnda CPD-verktyg - jscpd:

npx jscpd src

VueJS+TS-projektintegration med SonarQube

För kodrader:

VueJS+TS-projektintegration med SonarQube

Kanske kommer detta att lösas i framtida pluginversioner SonarJS(TS). Jag skulle vilja notera att de gradvis börjar slÄ samman dessa tvÄ plugins till ett SonarJS, vilket jag tycker Àr korrekt.

Nu ville jag övervÀga alternativet att förbÀttra tÀckningsinformationen.

Hittills kan vi se testtÀckning i procent för hela projektet, och för filer i synnerhet. Men det Àr möjligt att utöka denna indikator med information om kvantiteten enhet-tester för projektet, sÄvÀl som i samband med filer.

Det finns ett bibliotek som kan det finns-konvertera rapporten till format för Ekolod'A:
generiska testdata - https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

LÄt oss installera det hÀr biblioteket i vÄrt projekt:

yarn add jest-sonar-reporter

Och lÀgg till det i konfigurationen det finns:

package.json:



"testResultsProcessor": "jest-sonar-reporter"



LÄt oss nu köra testet:

yarn test

DĂ€refter skapas en fil i projektets rot test-report.xml.

LÄt oss anvÀnda det i konfigurationen Ekolod'A:

sonar-project.properties:



sonar.testExecutionReportPaths=test-report.xml



Och starta om skannern:

yarn run sonar

LÄt oss se vad som har förÀndrats i grÀnssnittet Ekolod'A:

VueJS+TS-projektintegration med SonarQube

Och ingenting har förÀndrats. Faktum Àr att Sonar inte betraktar filerna som beskrivs i Jest-rapporten som filer enhet-test. För att rÀtta till denna situation anvÀnder vi konfigurationsparametern Ekolod ekolod.test, dÀr vi uttryckligen kommer att ange mapparna med tester (vi har bara en för tillfÀllet):

sonar-project.properties:



sonar.tests=src/components/__tests__



LÄt oss starta om skannern:

yarn run sonar

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

VueJS+TS-projektintegration med SonarQube

Nu har vi sett numret pÄ vÄra enhet-tester och, efter att ha misslyckats genom att klicka inuti, kan vi se fördelningen av detta nummer bland projektfilerna:

VueJS+TS-projektintegration med SonarQube

Slutsats

SÄ vi tittade pÄ ett verktyg för kontinuerlig analys soundQube. Vi har framgÄngsrikt integrerat ett projekt skrivet i det VueJs+TS. Fixade nÄgra kompatibilitetsproblem. Vi ökade informationsinnehÄllet i testtÀckningsindikatorn. I den hÀr artikeln undersökte vi bara ett av kodkvalitetskriterierna (kanske ett av de viktigaste), men soundQube stöder andra kvalitetskriterier, inklusive sÀkerhetstester. Men inte alla dessa funktioner Àr fullt tillgÀngliga i samfundet-versioner. En av de intressanta och anvÀndbara funktionerna Àr integration soundQube med olika hanteringssystem för kodlager, sÄsom GitLab och BitBucket. Att förebygga merge pull(merge) begÀran'a till förvarets huvudgren nÀr tÀckningen Àr försÀmrad. Men det hÀr Àr en historia för en helt annan artikel.

PS: Allt som beskrivs i artikeln i form av kod finns tillgÀngligt i min gaffel.

Endast registrerade anvÀndare kan delta i undersökningen. Logga in, SnÀlla du.

AnvÀnder du SonarQube-plattformen:

  • 26,3%Ja 5

  • 15,8%Nr 3

  • 15,8%Jag hörde talas om den hĂ€r plattformen och vill anvĂ€nda3

  • 10,5%Jag har hört talas om den hĂ€r plattformen och vill inte anvĂ€nda2

  • 0,0%Jag anvĂ€nder en annan plattform0

  • 31,6%Första gĂ„ngen jag hör om henne6

19 anvÀndare röstade. 3 anvÀndare avstod frÄn att rösta.

KĂ€lla: will.com

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