VueJS+TS projekti integreerimine SonarQube'iga

Oma töös kasutame aktiivselt platvormi SonarQube koodi kvaliteedi hoidmiseks kĂ”rgel tasemel. Ühe esitatud projekti integreerimise kĂ€igus, mis on kirjutatud VueJs+Typescript, tekkisid probleemid. SeetĂ”ttu sooviksin rÀÀkida lĂ€hemalt, kuidas suudeti need lahendada.

VueJS+TS projekti integreerimine SonarQube'iga

Antud artiklis rÀÀgitakse, nagu eelnevalt mainitud, platvormist SonarQube. Veidi teooriat — mis see ĂŒldse 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 programmimise standardite MISRA C, MISRA C++, MITRE/CWE ja CERT Secure Coding Standards reeglitele. Samuti oskab tuvastada vigu OWASP Top-10 ja CWE/SANS Top-25 programmi vigade loenditest.
Hoolimata asjaolust, et platvorm kasutab erinevaid valmis tööriistu, koondab SonarQube tulemused ĂŒhele teabelehe (ingl. dashboard), hoides jooksuajaloo ja vĂ”imaldades seega nĂ€ha tarkvara kvaliteedi ĂŒldist suundumust arendamise kĂ€igus.

Edasi saate lugeda ametlikul kodulehe

Toetatakse suurt hulka programmeerimiskeeli. Ühelt lingilt vaadates — rohkem kui 25 keelt. Spetsiifilise keele toetamiseks on vajalik vastava plugina installimine. Community versioon sisaldab plugina, mis töötab Javascript (sealhulgas typesсript), kuigi vikis on kirjutatud vastupidist. Selle eest vastutab plugin Javascript SonarJS , Typescripti eestSonarTS Infode saatmiseks katvuse kohta kasutatakse ametlikku klienti vastavalt.

sonarqube-scanner , mis, kasutades seadistusiconfig failist, saadab need andmed serverisseedasi konsolideerimiseks ja aggregatsiooniks. SonarQube npm-moodul

Tooge Javascript on . Nii et alustame samm-sammult rakendamistVue SonarQube ja projekt, mis kasutabTypescripti Serveri seadistamiseks kasutame.

docker-compose SonarQube sonar.yaml version: '1' services: simplesample-sonar: image: sonarqube:lts ports: - 9001:9000 - 9092:9092 network_mode: bridge.

KĂ€ivitamine::

docker-compose -f sonar.yml up

PĂ€rast seda

on saadaval aadressil –

Praegu ei ole seal projekte ja see on tÔsi. Parandame seda olukorda. Aluseks vÔtsin ametliku nÀidisprojekti SonarQube VueJS+TS+Jest http://localhost:9001 .

VueJS+TS projekti integreerimine SonarQube'iga
. Kloneerime selle endale: git clone https://github.com/vuejs/vue-test-utils-typescript-example.gitEsmalt peame installima kliendi

, mis nimetatakse

sonar-scanner SonarQube, npm jaoks on olemas wrapper: yarn add sonarqube-scanner, jaoks npm on wrappers:

yarn add sonarqube-scanner

Ja lisame kohe meeskonna scripts selle töötamiseks.

package.json:

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

}

SeejÀrel, et skannimistööriist töötaks, peame mÀÀrama projekti seaded spetsiaalses failis. Alustame pÔhitest.

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 – kaust allikfailide jaoks, tavaliselt see on src, kuid see vĂ”ib olla mis tahes. See kaust mÀÀratakse suhte vĂ”rra juurkaustaga, millega skanner kĂ€ivitatakse;
  • sonar.tests – parameeter, mis koosneb eelnevatest. See on kaust, kus asuvad testid. Antud projektis ei ole sellist kausta, ja test asub lĂ€himasse kausta ‘test‘, seega ignoreerime seda ja kasutame jĂ€rgmisi parameetreid;
  • sonar.test.inclusions – tee testide jaoks, kasutades mustrit; neid vĂ”ib olla mitu, eraldatud koma abil;
  • sonar.sourceEncoding – koodimine allikafailide jaoks.

Esimese skannimise kÀivitamiseks on kÔik valmis, vÀlja arvatud pÔhieelse tegevuse: testimootori kÀivitamine, et genereerida teavet katvuse kohta, mida skanner hiljem kasutab.

Kuid selleks tuleb testimootor seadistada selle teabe genereerimiseks. Antud projektis on testimootor Jest. Ja selle seaded asuvad faili vastavas jaotises. package.json.

Lisame need seaded:

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

See tÀhendab, et mÀÀrame katvuse arvutamise vajaduse lipu ja allika (koos eranditega), mille alusel see moodustatakse.

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

yarn test

NÀhes jÀrgmist:

VueJS+TS projekti integreerimine SonarQube'iga

PÔhjus on selles, et komponentide koodis endas ei ole. Lahendame selle.

HelloWorld.vue:

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

Seda on katvuse arvutamiseks piisavalt.

PÀrast testi uuesti kÀivitamist veendume selles:

VueJS+TS projekti integreerimine SonarQube'iga

Ekraanil peaksime nÀgema katvuse teavet ning projekti kaustas luuakse kaust coverage teavet testide katvuse kohta universaalses formaadis LCOV (LTP GCOV laienemine).

Gcov — vabalt levitatav utiliit koodikattuvuse uurimiseks. Gcov genereerib tĂ€pse tĂ€itmisarvu iga programmi operaatori jaoks ja vĂ”imaldab lisada annotatsioone lĂ€htekoodile. Gcov tuleb standardse utiliidina GCC paketi koosseisus.
Lcov — gcov'i graafiline liides. See kogub mitme lĂ€htekoodi failiga gcov'i faile ja loob komplekti HTML-lehti koodi ja katvuse andmetega. Samuti genereeritakse navigeerimise lihtsustamiseks lehed. Lcov toetab ridade, funktsioonide ja harude katvust.

PĂ€rast testide sooritamist asub katvuse teave coverage/lcov.info.
Me peame ĂŒtlema Sonar’lt, kust seda vĂ”tta. SeetĂ”ttu lisame jĂ€rgmised read tema konfiguratsioonifaili. Kuid on ĂŒks asi: projektid vĂ”ivad olla mitmekeelsed, st kaustas src asuvad lĂ€htekoodid mitmete programmeerimiskeelte jaoks ja kuuluvus ĂŒhte vĂ”i teise ning vastavalt sellele kasutatakse teatud pluginaid, mÀÀratakse nende laiendi jĂ€rgi. Ja katvuse info vĂ”ib eri programmeerimiskeelte jaoks olla erinevates kohtades, seega on igale programmeerimiskeele jaoks oma seadistusosa. Meie projekt kasutab Serveri seadistamiseks kasutame, seega vajame seadistusosa just selle jaoks:

sonar-project.properties:

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

KĂ”ik on valmis skanneri esimeseks kĂ€ivitamiseks. Tahan mĂ€rkida, et projekt Sonar’s luuakse automaatselt esmakordsel skanneri sisselĂŒlitamisel selle projekti jaoks. JĂ€rgnevatel kordadel akumuleerub teave, et nĂ€ha projekti parameetrite muutumise dĂŒnaamikat ajas.

Seega kasutame varasemalt loodud kÀsklust package.json:

yarn run sonar 

MÀrkus: vÔib kasutada ka parameetrit -X kuna see vÔimaldab detailsemat logimist.

Kui skanner kĂ€ivitati esmakordselt, allalaaditakse esmalt skanneri binaarfail. SeejĂ€rel kĂ€ivitatakse see ja alustatakse serveri skaneerimist Sonar’lt installitud pluginate tuvastamiseks, arvutades seelĂ€bi toetatavad programmeerimiskeeled. Samuti laaditakse alla mitmed muud 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: millele me kĂ€esolevas artiklis sĂŒvitsi ei lasku, kuid alati on vĂ”imalik pöörduda ametlike allikate poole.

SeejĂ€rel algab kausta analĂŒĂŒsimine src kĂ”ikide toetatud programmeerimiskeelte lĂ€htefailide olemasolu tuvastamine (kui ei ole selgelt mÀÀratletud mĂ”nda konkreetset), millele jĂ€rgneb nende indekseerimine.

VueJS+TS projekti integreerimine SonarQube'iga

Edasi liikudes on mitmed erinevad analĂŒĂŒsid, millele me selles artiklis tĂ€helepanu ei pööra (nt sellised nagu: lintimine, koodeksemÀÀramise mÀÀramine jne).

Skaneri töö lÔpus toimub kogu kogutud teabe agregatsioon, arhiveerimine ja selle saatmine serverisse.

PĂ€rast seda saame juba vaadata, mida veebiliideses saavutatud on:

VueJS+TS projekti integreerimine SonarQube'iga

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

KÀime asju lÀbi. Vaatame projekti lÀhemalt, klÔpsame katvuse vÀÀrtusel ja "sukeldume" detailreportsse failide kohta:

VueJS+TS projekti integreerimine SonarQube'iga

Siin nÀeme lisaks pÔhifailile, millega tegeleme, HelloWorld.vue, on olemas ka fail main.ts, mis rikkus kogu katvuse pildi. Aga kuidas see juhtus, me olime selle katvusest vÀlja jÀtnud. Jah, kÔik on Ôige, kuid see oli tasemel Jest, kuid skanner on selle indekseerinud, mistÔttu see sattus tema arvutustesse.

Parandame selle:

sonar-project.properties:

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

Tahaksin teha tÀpsustuse: peale nende kaustade, mis on selles parameetris mÀÀratud, 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

Arutame jĂ€rgmise punkti – Quality profiles. RÀÀkisin varem toe pakkumisest Sonarmitme programmikeele samal ajal. Just seda me nĂŒĂŒd nĂ€eme. Kuid me teame, et meie projekt on kirjutatud TS, seega miks koormata skannerit liigsete manipuleerimiste ja kontrollidega. AnalĂŒĂŒsimiseks mÀÀrame keele, lisades veel ĂŒhe parameetri konfiguratsioonifaili 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 logi, siis nÀeme jÀrgmist rida:

VueJS+TS projekti integreerimine SonarQube'iga

See tÀhendab, et meie projekti faile ei ole lihtsalt indekseeritud.

Olukord on jÀrgmine: ametlikult on tugi VueJs plugines olemas, mis vastutab , Typescripti eest, kuid selle tuge ei ole plugines Javascript.

VueJS+TS projekti integreerimine SonarQube'iga

, mille kohta on ametlik ticet bug-trackeris avatud. Infode saatmiseks katvuse kohta kasutatakse ametlikku klienti jaoks TSSiin on mĂ”ned vastused ĂŒhelt SonarQube arendajalt, kes kinnitab seda fakti. Sonar:

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

Aga meil on ju kĂ”ik töötanud, ĂŒtlete Te. Jah, see on tĂ”si, proovime natuke

VueJS+TS projekti integreerimine SonarQube'iga

VueJS+TS projekti integreerimine SonarQube'iga

„hĂ€kkerida“ Kui on tugi.
.vue -failidele-faile SonarKui nii on, proovime talle öelda, et ta vaataks neid kui Serveri seadistamiseks kasutame.

Lisame parameetri:

sonar-project.properties:

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

KÀivitame skÀnneri:

VueJS+TS projekti integreerimine SonarQube'iga

Ja voilĂ , kĂ”ik on tagasi oma kohtades, ja ainult ĂŒhe profiiliga Serveri seadistamiseks kasutame. See tĂ€hendab, et probleem toetuse osas on lahendatud VueJs+TS jaoks SonarQube.

Proovime minna edasi ja parandada katte teavet.

Mida oleme senini teinud:

  • oleme projekti lisanud Sonar-skĂ€nneri;
  • seadsime Jest katte teabe genereerimiseks;
  • konfigureerisime Sonar-skĂ€nneri;
  • lahendasime toetuse probleemi -failidele-failide + Serveri seadistamiseks kasutame.

Lisaks kattele testide kaudu on veel teisi huvitavaid kasulikke koodikvaliteedi kriteeriume, nÀiteks koodi dubleerimine ja ridade arv (osaleb koodi keerukuse koefitsientide arvutuses) projekti.

Praeguses plugina versioonis ei hakka TS (Infode saatmiseks katvuse kohta kasutatakse ametlikku klienti) töötama CPD (Copy Paste Detector) ja koodiridade arvutamine -failidele-failide.

Koodi dubleerimise sĂŒnteetilise olukorra loomiseks dubleerime lihtsalt komponendi faili teise nimega, lisame koodi main.ts tĂŒhifunktsiooni ja dubleerime selle teise nimega. Et kontrollida dubleerimist nii -failidele, kui ka .ts -failides.

main.ts:

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

Selleks on vajalik ajutiselt kommenteerida konfiguratsiooni rida:

sonar-project.properties:

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

KÀivitame skÀnneri koos testimisega:

yarn test && yarn run sonar

Meie katet langetatakse, kuid praegu pole see meid huvitav.

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

VÔib-olla lahendatakse see tulevaste pluginate versioonides SonarJS(TS). Tahan mÀrkida, et nad hakkavad jÀrk-jÀrgult need kaks plugina kokku sulandama , Typescripti eest, mis, arvan, on Ôige.

NĂŒĂŒd sooviks uurida katte teabe parandamise varianti.

Kuni nĂ€eme katte protsenti kogu projektis ja konkreetselt failides. Kuid on vĂ”imalus seda nĂ€itajat laiendada teabega testide arvu ĂŒksuse-katsete kohta projektis ning ka failide lĂ”ikes.

On olemas teek, mis oskab Jest-aruannet konverteerida formaati Sonar:
ĂŒldised testandmed — https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

Paigaldame selle teegi 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 juurde fail test-report.xml.

Kasutame seda konfiguratsioonis Sonar:

sonar-project.properties:



sonar.testExecutionReportPaths=test-report.xml



Ja kÀivitame skÀnneri uuesti:

yarn run sonar

Vaadake, mis on muutunud liideses Sonar:

VueJS+TS projekti integreerimine SonarQube'iga

Ja mitte midagi ei muutunud. Asi on selles, et Sonar ei kĂ€sitle Jest-raportis kirjeldatud faile kui testifailideks. ĂŒksuse-testimiseks. Selle olukorra parandamiseks kasutame konfiguratsiooniparametrit Sonar sonar.tests, kus mÀÀrame selgelt testide kaustad (meil on praegu ĂŒks):

sonar-project.properties:

...
sonar.tests=src/components/__tests__
...

KĂ€ivitame skanneri uuesti:

yarn run sonar

Vaadake, mis on muutunud liideses:

VueJS+TS projekti integreerimine SonarQube'iga

NĂŒĂŒd nĂ€eme meie ĂŒksuse-testide arvu ja klĂ”psates saame vaadata selle arvu jaotust projekti failides:

VueJS+TS projekti integreerimine SonarQube'iga

KokkuvÔte

Nii et oleme uurinud pideva analĂŒĂŒsi tööriista. SonarQubeOleme selle edukalt integreerinud projekti, mis on kirjutatud VueJs+TS. Lahendasime mĂ”ned ĂŒhilduvusprobleemid. Parandasime testide katvuse nĂ€itaja informatiivsust. Antud artiklis kĂ€sitlesime ainult ĂŒhte koodi kvaliteedi kriteeriumi (vĂ”ib-olla ĂŒhte peamist), kuid SonarQube toetab ka teisi kvaliteedi kriteeriume, sealhulgas turvakatsete tegemist. Kuid mitte kĂ”ik need vĂ”imalused ei ole tĂ€ielikult juurdepÀÀsetavad community-versioonis. Üks huvitav ja kasulik funktsioon on integreerimised SonarQube erinevate koodihalduse sĂŒsteemidega, nĂ€iteks sellistega nagu GitLab ja BitBucket. Et vĂ€ltida merge pull(merge) request'ipeamise reposi harusse, kui katvuse tase langeb. Kuid see on juba tĂ€iesti teise artikli teema.

PS: KÔik, mida artiklis kookirutena kirjeldati, on saadaval minu forgis. Kasutate platvormi SonarQube:.

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

Jah5

  • 26,3%Olen kuulnud sellest platvormist ja soovin seda kasutada3

  • 15,8%Ei3

  • 15,8%Olen kuulnud sellest platvormist ja ei soovi seda kasutada2

  • 10,5%Kasutame teist platvormi0

  • 0,0%Kuulen sellest esmakordselt6

  • 31,6%HÀÀletas 19 kasutajat. 3 kasutajat jĂ€id erapooletuks.

Samba 4.12.0 vÀljalase

Allikas: habr.com

Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid đŸ”„ Osta usaldusvÀÀrne hostimine veebilehtede jaoks DDoS-i kaitsega, VPS VDS serverid | ProHoster