VueJS+TS projekti integreerimine SonarQube'iga

Oma töös kasutame me aktiivselt platvormi SonarQube koodi kvaliteedi kĂ”rgel tasemel hoidmiseks. Ühe projekti integreerimise kĂ€igus, mis oli kirjutatud VueJs+Typescript, tekkisid probleemid. SeetĂ”ttu tahaksin rÀÀkida detailselt, kuidas neid lahendada.

VueJS+TS projekti integreerimine SonarQube'iga

KĂ€esolevas artiklis kĂ€sitletakse, kuidas juba mainitud platvormi SonarQube. Natuke teooriat — mis see tegelikult on, neile, kes kuulevad sellest esmakordselt:

SonarQube (endine Sonar) — avatud lĂ€htekoodiga platvorm pidevaks analĂŒĂŒsiks (ingl. continuous inspection) ja koodi kvaliteedi mÔÔtmiseks.
Toetab koodi analĂŒĂŒsi ja vigade otsimist vastavalt programmeerimisstandardite reeglitele MISRA C, MISRA C++, MITRE/CWE ja CERT Secure Coding Standards. Samuti oskab tuvastada vigu OWASP Top-10 ja CWE/SANS Top-25 programmeerimise vigade nimekirjadest.
Kuigi platvorm kasutab erinevaid valmis tööriistu, koondab SonarQube tulemused ĂŒhte informatiivse paneeli (ingl. dashboard), hoides jooksukordade ajalugu ja vĂ”imaldades seelĂ€bi nĂ€ha ĂŒldist suundumust tarkvara kvaliteedi muutumisel arenduse kĂ€igus.

Rohkem teavet saab leida ametlikul kodulehel

Toetatakse suurt arvu programmeerimiskeeli. Üleminekuinfost lĂ€htuvalt on neid rohkem kui 25. Konkreetse keele toetamiseks tuleb paigaldada vastav plugin. Community versioon sisaldab pluginaid töötamiseks Javascript (sealhulgas typescript), kuigi wikis on kirjutatud vastupidist. Selle eest vastutab plugin Javascript SonarJS , Typescripti eestSonarTS Teabe edastamiseks katvuse kohta kasutatakse ametlikku klienti vastavalt.

, mis, kasutades seadistusi failist config, saadab need andmed serverisse edasi konsolideerimiseks ja aggregeerimiseks.npm-ĂŒmbris SonarQube . Alustame samm-sammult rakendamist

Kuna Javascript has -projekt, mis kasutabTypescript SonarQube ĂŒhes Vuesonar.yaml version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge.

docker-compose -f sonar.yml up SonarQube PĂ€rast seda docker-compose.

Praegu pole sellel projekte ja see on Ôigustatud. Parandame seda olukorda. VÔtsin aluseks ametliku nÀidisprojekti:

VueJS+TS+Jest

KĂ€ivitamine:

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

Esmalt peame paigaldama kliendi SonarQube , mille nimi on http://localhost:9001 .

VueJS+TS projekti integreerimine SonarQube'iga
sonar-scanner VueJS+TS+Jest. Kloneerime selle enda juurde:

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

Esiteks peame me installima kliendi SonarQube, mille nimi on sonar-scanner, et npm on pakett:

yarn add sonarqube-scanner

Ja lisame kohe kÀsu skriptid selle kasutamiseks.

package.json:

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

}

Edasi, et skanner töötaks, peame mÀÀrama projekti sÀtted eraldi failis. Alustame pÔhiteadmistest.

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 – aadress Sonar’a;
  • sonar.projectKey – projekti unikaalne identifikaator serveris Sonar’a;
  • sonar.projectName – selle nimetus, mida saab igal ajal muuta, kuna projekti identifitseerimine toimub projectKey;
  • sonar.sources – allikafailide kaust, tavaliselt on see src, kuid see vĂ”ib olla ka mĂ”ni muu. See kaust seadistatakse vĂ”rreldes juurkaustaga, milleks on kaust, kust skanner kĂ€ivitatakse;
  • sonar.tests – parameeter, mis kĂ€ib koos eelneva. See on kaust, kus asuvad testid. Antud projektis ei ole sellist kausta, ja test asub koos testitava komponendiga kaustas ‘test‘, seega jĂ€tame selle praegu tĂ€helepanuta ja kasutame jĂ€rgmist parameetrit;
  • sonar.test.inclusions – testimiseks mĂ”eldud tee maskiga, mitme elemendi loetlemine komadega;
  • sonar.sourceEncoding – lĂ€htefailide kodeering.

Skanneri esmakordseks kÀivitamiseks on kÔik valmis, vÀlja arvatud pÔhieelting: testimismootori kÀivitamine, et luua hÔlmatusinfot, mida skanner hiljem kasutab.

Kuid selle jaoks tuleb testimismootor seadistada selle teabe genereerimiseks. KĂ€esolevas projektis on testimismootor Jest. Selle seadistused asuvad vastavas faili osas package.json.

Lisame need seadistused:

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

Seega mÀÀrame katvuse arvutamise nÔudmise lippu ja allika (koos eranditega), mille alusel see kujundatakse.

NĂŒĂŒd kĂ€ivitame testi:

yarn test

NÀeme jÀrgmist:

VueJS+TS projekti integreerimine SonarQube'iga

PÔhjus on see, et komponent ise ei sisalda koodi. Parandame selle.

HelloWorld.vue:

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

Seda on piisavalt hÔlmatuse arvutamiseks.

PÀrast testi taaskÀivitamist kinnitame seda:

VueJS+TS projekti integreerimine SonarQube'iga

Ekraanil peaksime nÀgema katte teavet ning projekti kausta luuakse kaust coverage katte teabe kohta testide universaalses formaadis LCOV (LTP GCOV laiendus).

Gcov — vabalt levitatav tööriist koodi katte analĂŒĂŒsimiseks. Gcov genereerib tĂ€pse arvu tĂ€itmise kohta iga operaatori jaoks programmis ja vĂ”imaldab lisada annotatsioone allikale. Gcov pakutakse standardtööriistana GCC paketi koostisosana.
Lcov — graafiline liides gcovile. See kogub mitme allika failide jaoks gcov faile ja loob HTML lehtede komplekti koodi ja katte teabega. Samuti genereeritakse lehed navigeerimise lihtsustamiseks. Lcov toetab ridade, funktsioonide ja harude katvust.

PĂ€rast testide sooritamist asub katte teave coverage/lcov.info.
Peame ĂŒtlema Sonarkuhu seda vĂ”tta. SeetĂ”ttu lisame jĂ€rgmised read tema konfiguratsioonifaili. Kuid on ĂŒks asi: projektid vĂ”ivad olla mitmekeelsed, st kaustas src seal on mitmeid programmeerimiskeelte alusfailid ning nende kasutamine ja pluginate valik sĂ”ltub selle laiendist. Teavet katvuse kohta vĂ”ib hoida erinevates kohtades erinevate programmeerimiskeelte jaoks, seetĂ”ttu on iga program keele jaoks oma seade. Meie projekt kasutab version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge, seega vajame selle jaoks eraldi seadete jaotust:

sonar-project.properties:

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

KÔik on valmis skanneri esimeseks kÀivitamiseks. TÀhelepanu, et projektis Sonarloob automaatselt esmakordsel skanneri kÀivitamisel antud projektile. JÀrgmistel kordadel tuleb teave kokku, et jÀlgida projekti parameetrite muutumist ajas.

Nii et kasutame varem loodud kÀsku package.json:

yarn run sonar 

MÀrkus: vÔib kasutada ka valikut -X tÀiendava detailsuse saamiseks logimisel.

Kui skanneri kÀivitamine on esmakordne, siis laaditakse kÔigepealt alla skanneri binaarfail. PÀrast seda kÀivitatakse see ja hakkab serverit skaneerima. Sonarja pluginite olemasolu osas, arvutades seelÀbi toetatud programmeerimiskeeli. Samuti laaditakse teised erinevad parameetrid selle tööks: kvaliteediprofiilid, aktiivsed reeglid, mÔÔdikute hoidla, serveri reeglid.

VueJS+TS projekti integreerimine SonarQube'iga

VueJS+TS projekti integreerimine SonarQube'iga

MÀrkus: me ei peatu nende peal artikli kÀigus, kuid alati saab pöörduda ametlike allikate poole.

JĂ€rgmisena algab kausta analĂŒĂŒs src toetatavatele programmeerimiskeeltele (kui ei ole selgelt mÀÀratud mĂ”nda konkreetset), jĂ€rgneb nende indekseerimine.

VueJS+TS projekti integreerimine SonarQube'iga

SeejĂ€rel toimub mitmeid muid analĂŒĂŒse, millele me selles artiklis ei paigaldu, nĂ€iteks: lintimine, koodi dubleerimise mÀÀramine jne.

Skaneerimise lÔpus toimub kogu kogutud teabe koondamine, arhiivimine ja saatmine serverisse.

PĂ€rast seda saame vaadata, mis tulemuseks sai veebiliideses:

VueJS+TS projekti integreerimine SonarQube'iga

Nagu nÀeme, on midagi saadud ja isegi kuvatakse mingit katvust, kuid see ei vasta meie Jest-aruandele.

Hakkame asjaga tegelema. Vaatame projekti lĂ€hemalt, klĂ”psame katvuse vÀÀrtusel ja "langeme" ĂŒksikasjalikku arvesse failide kohta:

VueJS+TS projekti integreerimine SonarQube'iga

Siit nÀeme, et peamise, uuritava faili kÔrval HelloWorld.vue, on olemas ka fail main.ts, mis rikub kogu katvuse vaate. Aga kuidas see vÔimalik on, me vÀlistasime selle katvusest. Jah, see on Ôige, aga see oli tasemel Jest, kuid skanner on selle indekseerinud, seega on see sattunud selle arvutustesse.

Korrigeerime selle:

sonar-project.properties:

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

Tahaksin mÀrkida, et peale nende kaustade, mis on antud selles parameetris, lisatakse ka kÔik kaustad, mis on loetletud parameetris sonar.test.inclusions.

PÀrast skanneri kÀivitamist nÀeme juba Ôiget teavet:

VueJS+TS projekti integreerimine SonarQube'iga

VueJS+TS projekti integreerimine SonarQube'iga

Tuleb uurida jĂ€rgmist punkti — Kvaliteedi profiilid. RÀÀkisin varem toetamisest Sonarmitme programmeerimiskeele samal ajal. See on just see, mida me jĂ€lgime. Kuid me teame, et meie projekt on kirjutatud TS, seega miks hĂ€irida skĂ€nnerit ĂŒleliigsete manipuleerimiste ja kontrollidega. AnalĂŒĂŒsimiseks mÀÀrame keele, lisades konfigureerimisfaili juurde veel ĂŒhe parameetri Sonar:

sonar-project.properties:

...
sonar.language=ts
...

KĂ€ivitame skanneri uuesti ja vaatame tulemust:

VueJS+TS projekti integreerimine SonarQube'iga

Katvus on tÀielikult kadunud.

Kui vaatame skanneri logisse, siis nÀeme jÀrgmist rida:

VueJS+TS projekti integreerimine SonarQube'iga

See tÀhendab, et meie projekti failid ei olnud lihtsalt indekseeritud.

Olukord on jÀrgmine: ametlikult on tugi VueJs pluginas , Typescripti eest, mis vastutab Javascript.

VueJS+TS projekti integreerimine SonarQube'iga

Aga seda tuge pole pluginas Teabe edastamiseks katvuse kohta kasutatakse ametlikku klienti kuna TS, mille kohta on esitatud ametlik pilet bugihaldusesse Sonar:

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

Siin on mĂ”ned vastused ĂŒhelt SonarQube'i arendaja esindajalt, mis kinnitab seda fakti.

VueJS+TS projekti integreerimine SonarQube'iga

VueJS+TS projekti integreerimine SonarQube'iga

Aga me ju tegime alles, vastaksite Te. Jah, nii on, proovime siis natuke „hĂ€kkerdada”.
Kui tugi on .vue-failidele Sonar, siis proovime öelda, et ta vaataks neid kui version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge.

Lisame parameetri:

sonar-project.properties:

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

KĂ€ivitage skanner:

VueJS+TS projekti integreerimine SonarQube'iga

Ja voilĂ , kĂ”ik on tagasi oma kolme, ja ĂŒhe profiiliga ainult version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge. See tĂ€hendab, et suutisime lahendada probleemi toe VueJs+TS kuna SonarQube.

Proovime minna edasi ja parandame natuke katvuse teavet.

Mida me oleme seni teinud:

  • lisatud projekti Sonar-skanner;
  • seadistatud Jest katvuse teabe genereerimiseks;
  • konfigureeritud Sonar-skanner;
  • lahendatud toe probleem .vue-failidele + version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge.

Lisaks katvusele testidega on ka teisi huvitavaid kvaliteedikriteeriume, nÀiteks koodi dubleerimine ja ridade arv (osalevad koodi keerukuskoefitsientide arvutamisel) projektis.

Praeguses pistikprogrammi versioonis, et töötada TS (Teabe edastamiseks katvuse kohta kasutatakse ametlikku klienti) ei tööta CPD (Kopeeri-Kleebi Detektor) ja koodiridade arvu .vue-failide.

Koodide dubleerimise kunstliku olukorra loomiseks duplitseerime lihtsalt komponendi faili teise nimega, lisame samuti koodis main.ts tĂŒhifunktsiooni ja dubleerime selle teise nimega. Et kontrollida dubleerimist nagu .vue, kui ka .ts -failides.

main.ts:

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

Selleks on vajalik ajutiselt kommenteerida konfiguratsioonirida:

sonar-project.properties:

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

KĂ€ivitame skanneri koos testimisega uuesti:

yarn test && yarn run sonar

Meie katvus langeb, aga hetkel ei huvita meid see.

Koodiridade dubleerimise vaates nÀeme:

VueJS+TS projekti integreerimine SonarQube'iga

Kontrollimiseks kasutame CPD-utiliiti – jscpd:

npx jscpd src

VueJS+TS projekti integreerimine SonarQube'iga

Koodiridade jaoks:

VueJS+TS projekti integreerimine SonarQube'iga

See vÔib tulevikus pluginade versioonides lahenduda SonarJS(TS). Soovin mÀrkida, et nad hakkavad jÀrk-jÀrgult neid kahte plugina kokku sulgema , Typescripti eest, mis, arvan, on Ôige.

NĂŒĂŒd tahaksin arutada katvuse teabe parandamise vĂ”imalust.

Kuni nÀeme katvust testide osas protsentides, kogu projekti ulatuses ja failide osas. Kuid on vÔimalus laiendada seda nÀitajat teabe koguse kaudu unit-testprojekti, samuti failide lÔikes.

On olemas raamatukogu, mis oskab Jest-aruande konvertida formaati Sonar:
ĂŒldine testandmed — https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

Installime selle raamatukogu oma projekti:

yarn add jest-sonar-reporter

Ja lisame selle konfiguratsiooni Jest:

package.json:



"testResultsProcessor": "jest-sonar-reporter"



NĂŒĂŒd teeme testi:

yarn test

PĂ€rast seda luuakse projekti juurese prĂŒki test-report.xml.

Kasutame seda konfiguratsioonis Sonar:

sonar-project.properties:



sonar.testExecutionReportPaths=test-report.xml



Ja taastame skÀnneri:

yarn run sonar

Vaata, mis on liideses muutunud Sonar:

VueJS+TS projekti integreerimine SonarQube'iga

Ja midagi ei ole muutunud. Asi on selles, et Sonar ei kĂ€sitle failide, mis on kirjeldatud Jest-aruandes, kui failide unit-testide. Selle olukorra parandamiseks kasutame konfiguratsiooniparameetrit Sonar sonar.tests, kus mÀÀrame selgelt testide kaustad (praegu on meil ainult ĂŒks):

sonar-project.properties:



sonar.tests=src/components/__tests__



Taastame skÀnneri:

yarn run sonar

Vaata, mis on liideses muutunud:

VueJS+TS projekti integreerimine SonarQube'iga

NĂŒĂŒd nĂ€eme meie unit-testide arvu ja klikkides sinna sisse, saame nĂ€ha selle arvu jaotust projekti failide vahel:

VueJS+TS projekti integreerimine SonarQube'iga

KokkuvÔte

Nii et rÀÀkisime pideva analĂŒĂŒsi tööriistast SonarQube. Edukas integreerimine sellesse projekti, mis on kirjutatud VueJs+TS. Oleme lahendanud mĂ”ned ĂŒhilduvusprobleemid. Oleme suurendanud testide katvuse nĂ€itaja informatiivsust. Selles artiklis kĂ€sitleme ainult ĂŒhte koodikvaliteedi kriteeriumi (vĂ”imalik, et ĂŒhte peamist), kuid SonarQube toetab ka teisi kvaliteedi kriteeriume, sealhulgas turvatestimist. Kuid mitte kĂ”ik need vĂ”imalused pole tĂ€ielikult saadaval community-versioonis. Üks huvitav ja kasulik funktsioon on integratsioonid SonarQube erinevate koodihalduse sĂŒsteemidega, nĂ€iteks nagu GitLab ja BitBucket. Et vĂ€ltida merge pull(merge) requestpeamine haru repo halvenenud katvuse korral. Kuid see on juba hoopis teise artikli teema.

PS: Kogu, mis on artiklis kirjas koodi kujul, on saadaval minu forgis.

Ainult registreeritud kasutajad saavad kĂŒsitluses osaleda. Logige sisse, palun.

Kasutate SonarQube platvormi:

  • 26,3%Jah5

  • 15,8%Ei3

  • 15,8%Olen kuulnud sellest platvormist ja tahan kasutada3

  • 10,5%Olen kuulnud sellest platvormist, aga ei soovi kasutada2

  • 0,0%Kasutangi muud platvormi0

  • 31,6%Kuulen sellest esmakordselt6

HÀÀletas 19 kasutajat. Tasakaalus 3 kasutajat.

Allikas: habr.com

Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne veebihosting DDoS kaitsega, VPS VDS serverid | ProHoster