VueJS+TS projekta integrācija ar SonarQube

Mēs aktÄ«vi izmantojam platformu savā darbā soundQube lai uzturētu koda kvalitāti augstā lÄ«menÄ«. Integrējot kādu no rakstÄ«tajiem projektiem VueJs+MaŔīnraksts, radās problēmas. Tāpēc es vēlos jums pastāstÄ«t sÄ«kāk, kā mums izdevās tos atrisināt.

VueJS+TS projekta integrācija ar SonarQube

Å ajā rakstā mēs runāsim, kā jau rakstÄ«ju iepriekÅ”, par SonarQube platformu. Nedaudz teorijas - kas tas vispār ir, tiem, kas par to dzird pirmo reizi:

soundQube (bijuÅ”ais Sonārs) ir atvērtā koda platforma nepārtrauktai pārbaudei un koda kvalitātes mērÄ«Å”anai.
Atbalsta koda analÄ«zi un kļūdu noteikÅ”anu saskaņā ar MISRA C, MISRA C++, MITER/CWE un CERT Secure Coding Standards noteikumiem. Tā var arÄ« atpazÄ«t kļūdas no OWASP Top 10 un CWE/SANS Top 25 programmÄ“Å”anas kļūdu sarakstiem.
Neskatoties uz to, ka platforma izmanto dažādus gatavus rÄ«kus, SonarQube samazina rezultātus lÄ«dz vienam informācijas panelim, saglabājot palaiÅ”anas vēsturi un tādējādi ļaujot jums redzēt vispārējo programmatÅ«ras kvalitātes izmaiņu tendenci izstrādes laikā.

Sīkāku informāciju var atrast vietnē oficiālā vietne

Tiek atbalstÄ«ts liels skaits programmÄ“Å”anas valodu. Spriežot pēc informācijas no iepriekÅ” norādÄ«tās saites, Ŕīs ir vairāk nekā 25 valodas. Lai atbalstÄ«tu noteiktu valodu, ir jāinstalē atbilstoÅ”ais spraudnis. Kopienas versijā ir iekļauts spraudnis darbam ar Javascript (ieskaitot typeсript), lai gan wiki saka pretējo. Aiz muguras Javascript spraudņu atbildes SonarJS, maŔīnrakstam SonarTS attiecÄ«gi.

Oficiālais klients tiek izmantots, lai nosūtītu pārklājuma informāciju sonarqube-skeneris, kas, izmantojot iestatījumus no config-fails, nosūta Ŕos datus serverim soundQube turpmākai konsolidācijai un apkopoŔanai.

Par Javascript tur ir npm iesaiņojums. Tātad, sāksim soli pa solim ievieÅ”anu soundQube Š² Vue-projekta izmantoÅ”ana MaŔīnraksts.

Lai izvietotu serveri soundQube izmantosim priekÅ”rocÄ«bas docker-komponēt.

sonārs.yaml:

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

Palaist:

docker-compose -f sonar.yml up

Pēc tam soundQube būs pieejams: http://localhost:9001 .

VueJS+TS projekta integrācija ar SonarQube
Tajā vēl nav projektu, un tas ir godÄ«gi. Mēs labosim Å”o situāciju. Es izmantoju oficiālo projekta piemēru VueJS+TS+Jest. Noliecam to pret sevi:

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

Vispirms mums jāinstalē klients soundQube, ko sauc sonārs-skenerispar npm ir iesaiņojums:

yarn add sonarqube-scanner

Un nekavējoties pievienojiet komandu skripti strādāt ar to.

package.json:

{
 ā€¦ 
   scripts: {
      ...
      "sonar": "sonar-scanner"
      ...
   },
 ā€¦
}

Tālāk, lai skeneris darbotos, ir jāiestata projekta iestatījumi īpaŔā failā. Sāksim ar pamatiem.

sonārs-projekts.īpaŔības:

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 - adrese Sonārsā€œA;
  • sonar.projectKey ā€“ unikāls projekta identifikators serverÄ« Sonārsā€œA;
  • sonar.projectName ā€“ tā nosaukumu, to var mainÄ«t jebkurā laikā, jo projektu identificē pēc projekta atslēga;
  • sonārs.avoti ā€“ mape ar avotiem, parasti Ŕī src, bet var bÅ«t jebkas. Å Ä« mape ir iestatÄ«ta attiecÄ«bā pret saknes mapi, kas ir mape, no kuras tiek palaists skeneris;
  • sonārs.pārbaudes ā€“ parametrs, kas iet kopā ar iepriekŔējo. Å Ä« ir mape, kurā atrodas testi. Å ajā projektā Ŕādas mapes nav, un tests atrodas blakus testējamajam komponentam mapē 'pārbaude', tāpēc pagaidām to ignorēsim un izmantosim nākamo parametru;
  • sonar.test.inclusions ā€“ ceļŔ testiem, izmantojot masku, var bÅ«t vairāki elementi, kas atdalÄ«ti ar komatiem;
  • sonar.sourceEncoding - avota failu kodējums.

Pirmajai skenera palaiÅ”anai viss ir gatavs, izņemot galveno iepriekŔējo darbÄ«bu: paÅ”a testa dzinēja palaiÅ”anu, lai tas varētu Ä£enerēt informāciju par pārklājumu, ko skeneris vēlāk izmantos.

Bet, lai to izdarÄ«tu, jums ir jākonfigurē testa dzinējs, lai Ä£enerētu Å”o informāciju. Å ajā projektā testa dzinējs ir Jest. Un tā iestatÄ«jumi atrodas attiecÄ«gajā faila sadaļā pack.json.

Pievienosim Ŕos iestatījumus:

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

Tas ir, mēs uzstādām paÅ”u karogu, lai aprēķinātu pārklājumu un avotu (kopā ar izņēmumiem), uz kura pamata tas tiks veidots.

Tagad izpildīsim testu:

yarn test

Mēs redzēsim sekojoÅ”o:

VueJS+TS projekta integrācija ar SonarQube

Iemesls ir tāds, ka paŔā komponentā nav koda. Labosim Ŕo.

HelloWorld.vue:

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

Tas būs pietiekami, lai aprēķinātu segumu.

Pēc testa restartÄ“Å”anas mēs pārliecināsimies par to:

VueJS+TS projekta integrācija ar SonarQube

Ekrānā vajadzētu redzēt informāciju par pārklājumu, un projekta mapē tiks izveidota mape pārklājums ar testa pārklājuma informāciju universālā formātā LCOV (LTP GCOV paplaÅ”inājums).

Gcov ir brÄ«vi izplatÄ«ta utilÄ«ta koda pārklājuma pārbaudei. Gcov Ä£enerē precÄ«zu izpildes skaitu katram priekÅ”rakstam programmā un ļauj avota kodam pievienot anotācijas. Gcov ir standarta utilÄ«ta kā daļa no GCC pakotnes.
Lcov - gcov grafiskais interfeiss. Tas apkopo gcov failus vairākiem avota failiem un izveido HTML lapu kopu ar kodu un pārklājuma informāciju. Lapas tiek ģenerētas arī, lai atvieglotu navigāciju. Lcov atbalsta virkņu, funkciju un zaru pārklājumu.

Pēc pārbaužu pabeigÅ”anas informācija par pārklājumu tiks ievietota coverage/lcov.info.
Mums jāsaka Sonārs'No kurienes es to varu dabÅ«t? Tāpēc tā konfigurācijas failam pievienosim Ŕādas rindas. Bet ir viens punkts: projekti var bÅ«t daudzvalodu, tas ir, mapē src ir pirmkodi vairākām programmÄ“Å”anas valodām un piederÄ«bai vienai vai otrai, un, savukārt, konkrēta spraudņa izmantoÅ”anu nosaka tā paplaÅ”inājums. Un pārklājuma informāciju var glabāt dažādās vietās dažādām programmÄ“Å”anas valodām, tāpēc katrai valodai ir sava sadaļa Ŕīs iestatÄ«Å”anai. MÅ«su projekts izmanto MaŔīnraksts, tāpēc mums ir nepiecieÅ”ama iestatÄ«jumu sadaļa tikai tai:

sonārs-projekts.īpaŔības:

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

Viss ir gatavs skenera pirmajai palaiÅ”anai. Gribu atzÄ«mēt, ka projekts ir Sonārse tiek izveidots automātiski, kad pirmo reizi palaižat skeneri konkrētam projektam. Turpmākajos laikos tiks uzkrāta informācija, lai redzētu projekta parametru izmaiņu dinamiku laika gaitā.

Tātad, izmantosim iepriekŔ izveidoto komandu pack.json:

yarn run sonar 

Piezīme: varat arī izmantot parametru -X sīkākai mežizstrādei.

Ja skeneris tika palaists pirmo reizi, vispirms tiks lejupielādēts paÅ”a skenera binārais fails. Pēc tam tas sāk un sāk skenēt serveri Sonārs'a instalētiem spraudņiem, tādējādi aprēķinot atbalstÄ«to valodu. Tiek ielādēti arÄ« dažādi citi tā darbÄ«bas parametri: kvalitātes profili, aktÄ«vie noteikumi, metrikas repozitorijs, servera noteikumi.

VueJS+TS projekta integrācija ar SonarQube

VueJS+TS projekta integrācija ar SonarQube

Piezīme: Šī raksta ietvaros mēs par tiem sīkāk nepakavēsimies, taču jūs vienmēr varat sazināties ar oficiālajiem avotiem.

Pēc tam sākas mapju analÄ«ze src par avota failu pieejamÄ«bu visās atbalstÄ«tajās valodās (ja konkrēta nav skaidri norādÄ«ta) ar to turpmāko indeksÄ“Å”anu.

VueJS+TS projekta integrācija ar SonarQube

Tālāk seko dažādas citas analÄ«zes, uz kurām mēs Å”ajā rakstā nepievērÅ”am uzmanÄ«bu (piemēram, dÄ«gÅ”ana, koda dublÄ“Å”anās noteikÅ”ana utt.).

Skenera darba paŔās beigās visa savāktā informācija tiek apkopota, arhivēta un nosÅ«tÄ«ta uz serveri.

Pēc tam mēs jau varam redzēt, kas notika tīmekļa saskarnē:

VueJS+TS projekta integrācija ar SonarQube

Kā redzam, kaut kas nostrādāja un pat rāda kaut kādu segumu, bet tas nesakrīt ar mūsējo Jest-Ziņot.

Izdomāsim. ApskatÄ«sim projektu sÄ«kāk, noklikŔķiniet uz pārklājuma vērtÄ«bas un ā€œiekļūsimā€ detalizētā faila atskaitē:

VueJS+TS projekta integrācija ar SonarQube

Šeit mēs redzam papildus galvenajai pārbaudītajai lietai HelloWorld.vue, ir arī fails galvenais.ts, kas sabojā visu pārklājuma ainu. Bet kā tad mēs to izslēdzām no seguma aprēķina. Jā, viss ir pareizi, bet tas bija līmenī Jest, bet skeneris to indeksēja, tāpēc tas nokļuva savos aprēķinos.

Labosim Ŕo:

sonārs-projekts.īpaŔības:

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

Vēlos precizēt: papildus Å”ajā parametrā norādÄ«tajām mapēm tiek pievienotas arÄ« visas parametrā norādÄ«tās mapes. sonar.test.inclusions.

Pēc skenera palaiÅ”anas mēs redzam pareizo informāciju:

VueJS+TS projekta integrācija ar SonarQube

VueJS+TS projekta integrācija ar SonarQube

ApskatÄ«sim nākamo punktu - KvalitatÄ«vi profili. IepriekÅ” es runāju par atbalstu Sonārsvairākās valodās vienlaikus. Tas ir tieÅ”i tas, ko mēs redzam. Bet mēs zinām, ka mÅ«su projekts ir ierakstÄ«ts TS, tad kāpēc noslogot skeneri ar nevajadzÄ«gām manipulācijām un pārbaudēm. Mēs iestatÄ«sim analÄ«zes valodu, pievienojot konfigurācijas failam vēl vienu parametru Sonārs'A:

sonārs-projekts.īpaŔības:

...
sonar.language=ts
...

Palaidīsim skeneri vēlreiz un redzēsim rezultātu:

VueJS+TS projekta integrācija ar SonarQube

Pārklājums bija pilnībā pazudis.

Ja skatāmies uz skenera žurnālu, mēs varam redzēt Ŕādu rindu:

VueJS+TS projekta integrācija ar SonarQube

Tas ir, mÅ«su projekta faili vienkārÅ”i netika indeksēti.

Situācija ir Ŕāda: oficiāli atbalstīts VueJs ir spraudnī SonarJSkurŔ ir atbildīgs par Javascript.

VueJS+TS projekta integrācija ar SonarQube

Bet Å”is atbalsts nav iekļauts spraudnÄ« SonarTS par TS, par ko kļūdu izsekotājā tika atvērta oficiāla biļete Sonārs'A:

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

Šeit ir dažas atbildes no viena no SonarQube izstrādātāju pārstāvjiem, kas apstiprina Ŕo faktu.

VueJS+TS projekta integrācija ar SonarQube

VueJS+TS projekta integrācija ar SonarQube

Bet mums viss strādāja, jūs iebilstat. Jā, tā ir, nedaudz pamēģināsim "uzlauzt".
Ja ir atbalsts .vue- faili Sonārs'ak, tad mēģināsim pateikt viņam, lai viņŔ tos uzskata par MaŔīnraksts.

Pievienosim parametru:

sonārs-projekts.īpaŔības:

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

Palaidīsim skeneri:

VueJS+TS projekta integrācija ar SonarQube

Un, voila, viss ir atgriezies normālā stāvoklÄ« un tikai ar vienu profilu MaŔīnraksts. Tas ir, mums izdevās problēmu atrisināt atbalstā VueJs+TS par soundQube.

Mēģināsim iet tālāk un nedaudz uzlabot pārklājuma informāciju.

Ko mēs lÄ«dz Å”im esam paveikuÅ”i:

  • pievienots projektam Sonārs-skeneris;
  • uzstādÄ«t Jest Ä£enerēt pārklājuma informāciju;
  • konfigurēts Sonārs-skeneris;
  • atrisināja atbalsta problēmu .vue- faili + MaŔīnraksts.

Papildus testa pārklājumam ir arÄ« citi interesanti noderÄ«gi koda kvalitātes kritēriji, piemēram, koda dublÄ“Å”anās un rindu skaits (iesaistÄ«ts ar koda sarežģītÄ«bu saistÄ«to koeficientu aprēķināŔanā).

PaÅ”reizējā spraudņa ievieÅ”anā darbam ar TS (SonarTS) nedarbosies CPD (kopÄ“Å”anas ielÄ«mÄ“Å”anas detektors) un koda rindu skaitÄ«Å”ana .vue- faili.

Lai izveidotu sintētisku koda dublÄ“Å”anas situāciju, vienkārÅ”i dublējiet komponenta failu ar citu nosaukumu un pievienojiet to kodam galvenais.ts fiktÄ«vu funkciju un dublēt to ar citu nosaukumu. Lai pārbaudÄ«tu dublÄ“Å”anos, kā norādÄ«ts .vueun iekŔā .ts - faili.

main.ts:

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

Lai to izdarītu, jums īslaicīgi jākomentē konfigurācijas rindiņa:

sonārs-projekts.īpaŔības:

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

Restartēsim skeneri kopā ar testÄ“Å”anu:

yarn test && yarn run sonar

Protams, mūsu pārklājums samazināsies, bet tagad tas mūs neinteresē.

Runājot par koda rindu dublÄ“Å”anu, mēs redzēsim:

VueJS+TS projekta integrācija ar SonarQube

Lai pārbaudītu, mēs izmantosim CPD- lietderība - jscpd:

npx jscpd src

VueJS+TS projekta integrācija ar SonarQube

Koda rindām:

VueJS+TS projekta integrācija ar SonarQube

Iespējams, tas tiks atrisināts nākamajās spraudņu versijās SonarJS(TS). Vēlos atzÄ«mēt, ka viņi pamazām sāk apvienot Å”os divus spraudņus vienā SonarJS, kas, manuprāt, ir pareizi.

Tagad es gribēju apsvērt iespēju uzlabot pārklājuma informāciju.

LÄ«dz Å”im mēs varam redzēt testa pārklājumu procentuālā izteiksmē visam projektam un jo Ä«paÅ”i failiem. Bet ir iespējams paplaÅ”ināt Å”o rādÄ«tāju ar informāciju par daudzumu vienÄ«ba-testi projektam, kā arÄ« failu kontekstā.

Ir bibliotēka, kas var Jest-konvertēt pārskatu formātā Sonārs'A:
vispārīgi testa dati Sākot no https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

Instalēsim Å”o bibliotēku mÅ«su projektā:

yarn add jest-sonar-reporter

Un pievienojiet to konfigurācijai Jest:

package.json:

ā€¦
"testResultsProcessor": "jest-sonar-reporter"
ā€¦

Tagad izpildīsim testu:

yarn test

Pēc tam projekta saknē tiks izveidots fails test-report.xml.

Izmantosim to konfigurācijā Sonārs'A:

sonārs-projekts.īpaŔības:

ā€¦
sonar.testExecutionReportPaths=test-report.xml
ā€¦

Un restartējiet skeneri:

yarn run sonar

Apskatīsim, kas ir mainījies saskarnē Sonārs'A:

VueJS+TS projekta integrācija ar SonarQube

Un nekas nav mainÄ«jies. Fakts ir tāds, ka Sonar neuzskata Jest ziņojumā aprakstÄ«tos failus par failiem vienÄ«ba- testi. Lai Å”o situāciju labotu, mēs izmantojam konfigurācijas parametru Sonārs sonārs.pārbaudes, kurā mēs skaidri norādÄ«sim mapes ar testiem (mums pagaidām ir tikai viena):

sonārs-projekts.īpaŔības:

ā€¦
sonar.tests=src/components/__tests__
ā€¦

Restartēsim skeneri:

yarn run sonar

Apskatīsim, kas ir mainījies saskarnē:

VueJS+TS projekta integrācija ar SonarQube

Tagad mēs esam redzējuÅ”i mÅ«su numuru vienÄ«ba-testi un, ja neizdevās, noklikŔķinot iekŔā, mēs varam redzēt Ŕī skaitļa sadalÄ«jumu starp projekta failiem:

VueJS+TS projekta integrācija ar SonarQube

Secinājums

Tātad, mēs apskatÄ«jām nepārtrauktas analÄ«zes rÄ«ku soundQube. Mēs veiksmÄ«gi integrējām tajā uzrakstÄ«tu projektu VueJs+TS. Novērstas dažas saderÄ«bas problēmas. Palielinājām testa pārklājuma indikatora informācijas saturu. Å ajā rakstā mēs apskatÄ«jām tikai vienu no koda kvalitātes kritērijiem (varbÅ«t vienu no galvenajiem), bet soundQube atbalsta citus kvalitātes kritērijus, tostarp droŔības testÄ“Å”anu. Taču ne visas Ŕīs funkcijas ir pilnÄ«bā pieejamas kopiena- versijas. Viena no interesantām un noderÄ«gām funkcijām ir integrācija soundQube ar dažādām kodu repozitoriju pārvaldÄ«bas sistēmām, piemēram, GitLab un BitBucket. Lai novērstu sapludināŔanas vilkÅ”anas (apvienoÅ”anas) pieprasÄ«jumsā€œa uz galveno repozitorija filiāli, kad pārklājums ir pasliktināts. Bet Å”is ir stāsts pavisam citam rakstam.

PS: Viss, kas rakstā aprakstīts koda veidā, ir pieejams mana dakŔa.

Aptaujā var piedalīties tikai reģistrēti lietotāji. Ielogoties, lūdzu.

Vai izmantojat SonarQube platformu:

  • 26,3%Jā 5

  • 15,8%Nr.3

  • 15,8%Es dzirdēju par Å”o platformu un vēlos izmantot3

  • 10,5%Esmu dzirdējis par Å”o platformu un nevēlos to izmantot2

  • 0,0%Es izmantoju citu platformu0

  • 31,6%Pirmo reizi dzirdu par viņu6

Nobalsoja 19 lietotāji. 3 lietotāji atturējās.

Avots: www.habr.com

Pievieno komentāru