VueJS+TS projekta integrācija ar SonarQube

Savā darbā mēs aktÄ«vi izmantojam platformu SonarQube kvalitātes saglabāŔanai augstā lÄ«menÄ«. Integrējot kādu no projektiem, kas tika rakstÄ«ts uz VueJs+Typescript, radās problēmas. Tādēļ vēlētos sÄ«kāk pastāstÄ«t par to, kā izdevās tās atrisināt.

VueJS+TS projekta integrācija ar SonarQube

Å ajā rakstā bÅ«s runa, kā jau minēju iepriekÅ”, par platformu SonarQube. Nedaudz teorijas – kas tas Ä«sti ir tiem, kas par to dzird pirmo reizi:

SonarQube (buvusÄ« Sonar) — atvērtā koda platforma nepārtrauktai analÄ«zei (angļu val. continuous inspection) un koda kvalitātes mērīŔanai.
Atbalsta koda analÄ«zi un kļūdu meklēŔanu, pamatojoties uz programmēŔanas standartu MISRA C, MISRA C++, MITRE/CWE un CERT Secure Coding Standards. Tāpat spēj atpazÄ«t kļūdas no sarakstiem OWASP Top-10 un CWE/SANS Top-25 programmēŔanas kļūdām.
Lai arī platforma izmanto dažādus gatavus rīkus, SonarQube apvieno rezultātus vienā informācijas panelī (angļu val. dashboard), vedot skriptu vēsturi un ļaujot redzēt kopējo tendenci programmatūras kvalitātes izmaiņām izstrādes laikā.

Vairāk var uzzināt oficiālajā mājaslapā

Atbalsta lielu skaitu programmēŔanas valodu. Saskaņā ar informāciju no iepriekÅ” minētā linka — tas ir vairāk nekā 25 valodas. Lai atbalstÄ«tu konkrētu valodu, nepiecieÅ”ams uzstādÄ«t attiecÄ«go paplaÅ”inājumu. Kopienas versijā ietilpst paplaÅ”inājums darbam ar Javascript (ieskaitot typesсript), lai gan viki ir rakstÄ«ts pretēji. Par Javascript atbild paplaÅ”inājums SonarJS, par Typescript SonarTS atbilstoÅ”i.

Lai nosūtītu informāciju par segumu, tiek izmantots oficiālais klients sonarqube-scanner, kurŔ, izmantojot iestatījumus no config-faila, nosūta Ŕos datus uz serveri SonarQube turpmākai konsolidācijai un agregācijai.

Lai Javascript ir npm-apvalks.Tātad, sāksim soli pa solim īstenoŔanu SonarQube par Vue-projektam, kurŔ izmanto Typescript.

Lai izveidotu serveri SonarQube izmantosim docker-compose.

sonar.yaml:

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

PalaiŔana:

docker-compose -f sonar.yml up

Pēc tam SonarQube bÅ«s pieejams adresē – http://localhost:9001 .

VueJS+TS projekta integrācija ar SonarQube
PaÅ”laik tajā nav projektu, un tas ir taisnÄ«ba. Mēs labosim Å”o situāciju. Par pamatu es ņēmu oficiālo projekta piemēru VueJS+TS+Jest.Noklonēsim to pie sevis:

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

Vispirms mums jāuzstāda klients, SonarQubekas tiek saukts sonar-scanner, lai npm ir apvalks:

yarn add sonarqube-scanner

Un tūlīt pievienosim komandu scripts darbam ar to.

package.json:

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

Tālāk, lai strādātu ar skaneru, ir nepiecieŔams norādīt projekta iestatījumus speciālā failā. Sāksim ar pamatiem.

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 – adrese Sonar’a;
  • sonar.projectKey – unikāls projekta identifikators serverÄ« Sonar’a;
  • sonar.projectName – tā nosaukums, ko var mainÄ«t jebkurā brÄ«dÄ«, jo projekta identifikācija notiek pēc projectKey;
  • sonar.sources – mape ar avotiem, parasti tas ir src, bet var bÅ«t jebkas. Å Ä« mape tiek noteikta attiecÄ«bā pret saknes mapē, no kuras tiek palaists skaneris;
  • sonar.tests – parametrs, kas iet kopā ar iepriekŔējo. Tā ir mape, kur atrodas testi. Å ajā projektā Ŕādas mapes nav, un tests atrodas blakus pārbaudāmajam komponentam mapē ā€˜testā€˜, tāpēc mēs to pagaidām ignorēsim un izmantosim nākamo parametru;
  • sonar.test.inclusions – ceļŔ testiem, izmantojot masku, var bÅ«t vairāki elementi, uzskaitÄ«ti ar komatu;
  • sonar.sourceEncoding – kodējums avota failiem.

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

Bet tam nepiecieÅ”ams konfigurēt testēŔanas dzinēju Ŕīs informācijas Ä£enerēŔanai. Å ajā projektā testēŔanas dzinējs ir Jest. Un tā iestatÄ«jumi atrodas atbilstoÅ”ajā faila sadaļā package.json.

Pievienosim Ŕos iestatījumus:

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

Tātad, mēs nosakām paÅ”u karogu nepiecieÅ”amÄ«bai aprēķināt pārklājumu un avotu (kopā ar izņēmumiem), uz kuru pamata tas tiks Ä£enerēts.

Tagad palaidīsim testu:

yarn test

Mēs redzēsim sekojoÅ”o:

VueJS+TS projekta integrācija ar SonarQube

Iemesls ir tajā, ka paŔā komponentā kā tādam nav koda. Labosim to.

HelloWorld.vue:

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

Tā būs pietiekami, lai aprēķinātu pārklājumu.

Pēc testu atkārtotas palaiÅ”anas pārliecināsimies par to:

VueJS+TS projekta integrācija ar SonarQube

Ekrānā mums jāredz informācija par pārklājumu, un projekta mapē tiks izveidota mape coverage ar informāciju par testēŔanas pārklājumiem vispārÄ«gā formātā LCOV (LTP GCOV paplaÅ”inājums).

Gcov — brÄ«vi izplatāma palÄ«grÄ«ka, lai izpētÄ«tu koda pārklājumu. Gcov Ä£enerē precÄ«zu izpildÄ«jumu skaitu katram operatoram programmā un ļauj pievienot anotācijas avota kodam. Gcov ir iekļauts kā standarta rÄ«ks GCC paketē.
Lcov — grafiskais interfeiss gcov. Tas apkopo gcov failus no vairākiem avota failiem un izveido komplektu HTML lapu ar kodu un pārklājuma informāciju. Tāpat tiek Ä£enerētas lapas navigācijas atviegloÅ”anai. Lcov atbalsta rindu, funkciju un novirzīŔanu pārklājumu.

Pēc testu izpildes informācija par pārklājumu tiks atrasta coverage/lcov.info.
Mums jānorāda Sonarno kurienes to iegÅ«t. Tāpēc pievienosim Ŕādas rindas tā konfigurācijas failā. Bet ir viens moments: projekti var bÅ«t daudzvalodÄ«gi, tas ir, mappē src atrodas avoti vairāku programmēŔanas valodu un piederÄ«ba pie kādas no tām, un lÄ«dz ar to izmantotā spraudņa izvēle tiek noteikta pēc tā paplaÅ”inājuma. Informācija par pārklājumu var bÅ«t glabāta dažādās vietās dažādām programmēŔanas valodām, tāpēc katrai PV nepiecieÅ”ama sava iestatÄ«jumu sadaļa. Mums projektā tiek izmantots Typescript, tāpēc mums nepiecieÅ”ama iestatÄ«jumu sadaļa tieÅ”i tai:

sonar-project.properties:

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

Viss ir gatavs pirmā skenera palaiÅ”anai. Vēlos atzÄ«mēt, ka projekts Sonartiks izveidots automātiski, palaižot skeneri Å”im projektam pirmo reizi. Nākamajās reizēs informācija jau tiks uzkrāta, lai redzētu parametru izmaiņu dinamiku laika gaitā.

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

yarn run sonar 

Piezīme: varat arī izmantot parametru -X lai iegūtu detalizētāku žurnālu.

Ja skeneris tikko tika palaists pirmo reizi, vispirms tiks lejupielādēts paÅ”a skenera binārais fails. Pēc tam tas tiek palaists un sāk skanēt serveri SonarattiecÄ«bā uz instalētajiem spraudņiem, tādējādi aprēķinot atbalstÄ«tās PV. Tāpat tiek lejupielādēti citi dažādi parametri tā darbÄ«bai: quality profiles, active rules, metrics repository, server rules.

VueJS+TS projekta integrācija ar SonarQube

VueJS+TS projekta integrācija ar SonarQube

PiezÄ«me: par to sÄ«ki nepārtrauksim Å”ajā rakstā, bet vienmēr varat vērsties pie oficiālajiem avotiem.

Tālāk sākas mapes analÄ«ze src par visu atbalstÄ«to programmēŔanas valodu (ja nav skaidri norādÄ«ta kāda konkrēta) sākotnējo failu pieejamÄ«bas pārbaude ar to turpmāku indeksāciju.

VueJS+TS projekta integrācija ar SonarQube

Tālāk seko dažādi citi analÄ«zes veidi, uz kuriem Å”ajā rakstā nenonākam (piemēram, tādi kā: linting, koda dublēŔanās noteikÅ”ana u. c.).

Skeneru darbu noslēdzot, notiek apkopotās informācijas agregācija, arhivēŔana un nosÅ«tīŔana uz serveri.

Pēc tam mēs varam apskatīt, kas ir iznācis tīmekļa interfeisā:

VueJS+TS projekta integrācija ar SonarQube

Kā redzam, kas ir iznācis, un tas pat rāda kaut kādu pārklājumu, bet tas neatbilst mūsu Jest-ziņojumam.

IeskatÄ«simies tuvāk. ApskatÄ«sim projektu sÄ«kāk, noklikŔķināsim uz pārklājuma vērtÄ«bas un "iekritÄ«sim" detalizētajā ziņojumā par failiem:

VueJS+TS projekta integrācija ar SonarQube

Å eit mēs redzam, ka papildus galvenajam pētÄ«tajam failam HelloWorld.vue, klātesoÅ”s ir arÄ« fails main.ts, kurÅ” arÄ« bojā visu pārklājuma ainu. Bet kā tad tā, mēs to izslēdzām no pārklājuma aprēķina. Jā, viss ir pareizi, bet tas notika lÄ«menÄ« Jest, taču skeneris to ir indeksējis, tāpēc tas iekļuvis tā aprēķinos.

Labosim to:

sonar-project.properties:

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

Vēlos izdarÄ«t precizējumu: papildus tām mapēm, kas norādÄ«tas Å”ajā parametrā, tiek pievienotas arÄ« visas mapes, kuras uzskaitÄ«tas parameterā sonar.test.inclusions.

Pēc skenera palaiÅ”anas redzam jau korektu informāciju:

VueJS+TS projekta integrācija ar SonarQube

VueJS+TS projekta integrācija ar SonarQube

ApskatÄ«sim nākamo jautājumu – Kvalitātes profili. Es iepriekÅ” minēju par vairāku programmēŔanas valodu atbalstu. SonarTo mēs tieÅ”i novērojam. Bet mēs zinām, ka projekts ir uzrakstÄ«ts TS, kāpēc tad lieki apgrÅ«tināt skeneri ar nevajadzÄ«gām manipulācijām un pārbaudēm. AnalÄ«zes valodu norādÄ«sim, pievienojot vēl vienu parametru konfigurācijas failā Sonar:

sonar-project.properties:

...
sonar.language=ts
...

Atkal palaidīsim skeneri un apskatīsim rezultātu:

VueJS+TS projekta integrācija ar SonarQube

Pārklājums ir pilnībā zudis.

Ja aplÅ«kosim skenera žurnālu, tad varam redzēt sekojoÅ”o rindu:

VueJS+TS projekta integrācija ar SonarQube

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

Situācija ir Ŕāda: oficiālais atbalsts VueJs ir pieejams spraudnī SonarJS, kas atbild par Javascript.

VueJS+TS projekta integrācija ar SonarQube

Bet Ŕī atbalsta nav spraudnÄ« SonarTS lai TS, par ko ir izveidots oficiāls biļete kļūdu izsekoÅ”anas sistēmā Sonar:

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

Šeit ir daži atbildes no viena no SonarQube izstrādātājiem, kas apstiprina Ŕo faktu.

VueJS+TS projekta integrācija ar SonarQube

VueJS+TS projekta integrācija ar SonarQube

Bet mums taču viss bija kārtībā, uzsāksiet jūs. Jā, tā ir, mēģināsim nedaudz "uzhakat".
Ja ir atbalsts .vue-failiem Sonartad tad, tadā, lÅ«dzu, mēģināsim pateikt viņam, lai viņŔ tos apsver kā Typescript.

Pievienosim parametru:

sonar-project.properties:

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

Palaižam skaneri:

VueJS+TS projekta integrācija ar SonarQube

Un, voilĆ , viss ir atgriezies pie ierastā, un ar vienu profilu tikai Typescript. Tas nozÄ«mē, ka izdevās atrisināt problēmu ar atbalstu VueJs+TS lai SonarQube.

Mēģināsim iet tālāk un nedaudz uzlabot informāciju par segumu.

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

  • pievienojām projektam Sonar-skaneri;
  • konfigurējām Jest seguma informācijas Ä£enerēŔanai;
  • konfigurējām Sonar-skaneri;
  • atrisinājām atbalsta problēmu .vue-failiem + Typescript.

Bez testu seguma ir citi interesanti kvalitātes kritēriji, piemēram, kodu dublēŔanās un rindu skaits (piedalās koeficientu, kas saistÄ«ti ar koda sarežģītÄ«bu, aprēķināŔanā) projektā.

PaÅ”reizējā spraudņa realizācijā, lai strādātu ar TS (SonarTS) nedarbosies CPD (Copy Paste Detector) un koda rindu skaitīŔana .vue-failiem.

Lai izveidotu sintētisku situāciju dublēŔanās gadÄ«jumā, vienkārÅ”i dublēsim komponenta failu ar citu nosaukumu, arÄ« pievienosim kodam main.ts tukÅ”u funkciju un dublēsim to ar citu nosaukumu. Lai pārbaudÄ«tu dublēŔanos, kā .vue, tā arÄ« .ts -failiem.

main.ts:

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

Tam nepiecieÅ”ams uz laiku noņemt konfigurācijas rindu:

sonar-project.properties:

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

Pārstartēsim skaneri kopā ar testēŔanu:

yarn test && yarn run sonar

Mēs, protams, zaudēsim segumu, bet Å”obrid tas mÅ«s neuztrauc.

DublējoÅ”o koda rindu skatÄ«jumā redzēsim:

VueJS+TS projekta integrācija ar SonarQube

Pārbaudei izmantosim CPD-rÄ«ku – jscpd:

npx jscpd src

VueJS+TS projekta integrācija ar SonarQube

Par koda rindām:

VueJS+TS projekta integrācija ar SonarQube

Visticamāk, tas tiks atrisināts nākotnes spraudņu versijās SonarJS(TS). Vēlos norādÄ«t, ka viņi pakāpeniski sāk apvienot Å”os divus spraudņus vienā SonarJS, kas, manuprāt, ir pareizi.

Tagad vēlētos apskatīt iespēju uzlabot seguma informāciju.

PaÅ”laik mēs redzam testu segumu procentos visā projektā un pēc failiem specifiski. Bet ir iespēja paplaÅ”ināt Å”o rādÄ«tāju ar informāciju par unit-testiem projektā, kā arÄ« failu griezumā.

Ir bibliotēka, kas spēj Jest-ziņojumu konvertēt formātā, kas piemērots Sonar:
generic test data — https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

UzstādÄ«sim Å”o bibliotēku savā projektā:

yarn add jest-sonar-reporter

Un pievienosim to konfigurācijai Jest:

package.json:

…
"testResultsProcessor": "jest-sonar-reporter"
…

Tagad veiksim testu:

yarn test

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

Ieslēgsim to konfigurācijā Sonar:

sonar-project.properties:

…
sonar.testExecutionReportPaths=test-report.xml
…

Un pārstartēsim skaneri:

yarn run sonar

Apskatīsim, kas mainījies interfeisā Sonar:

VueJS+TS projekta integrācija ar SonarQube

Un nekas nav mainÄ«jies. Problēma ir tā, ka Sonar neuzskata failus, kas aprakstÄ«ti Jest ziņojumā, par failiem unit-testiem. Lai novērstu Å”o situāciju, izmantosim konfigurācijas parametru Sonar sonar.tests, kurā skaidri norādÄ«sim testu mapes (paÅ”laik mums ir tikai viena):

sonar-project.properties:

…
sonar.tests=src/components/__tests__
…

Pārstartēsim skeneri:

yarn run sonar

Apskatīsim, kas mainījies interfeisā:

VueJS+TS projekta integrācija ar SonarQube

Tagad mēs redzam mÅ«su unit-testu skaitu un, noklikŔķinot, varam aplÅ«kot tā sadalÄ«jumu projekta failos:

VueJS+TS projekta integrācija ar SonarQube

Secinājums

Tātad, mēs izskatÄ«jām rÄ«ku nepārtrauktai analÄ«zei SonarQube. VeiksmÄ«gi integrējām tajā projektu, kas rakstÄ«ts VueJs+TS. Atrisinājām dažas saderÄ«bas problēmas. Palielinājām informācijas sniegÅ”anas kvalitāti par testēŔanas segumu. Å ajā rakstā mēs apskatÄ«jām tikai vienu no programmatÅ«ras kvalitātes kritērijiem (iespējams, vienu no galvenajiem), bet SonarQube atbalsta arÄ« citus kvalitātes kritērijus, tostarp droŔības testēŔanu. Taču ne visas Ŕīs iespējas pilnÄ«bā pieejamas community-versijā. Viens no interesantākajiem un noderÄ«gākajiem risinājumiem ir integrācijas SonarQube ar dažādām koda versiju kontroles sistēmām, piemēram, tādām kā GitLab un BitBucket. Lai novērstu merge pull(merge) requestuz galveno repozitorija zaru, ja segÅ”anās samazinās. Taču Ŕī ir jau pavisam cita raksta stāsts.

PS: Viss, kas rakstīts Ŕajā rakstā kodā, ir pieejams manā forķī.

Tikai reģistrētie lietotāji var piedalīties aptaujā. Pieteikties, lūdzu.

Vai Jūs izmantojat SonarQube platformu:

  • 26,3%Jā5

  • 15,8%Nē3

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

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

  • 0,0%Es izmantoju citu platformu0

  • 31,6%Es pirmo reizi dzirdu par to6

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

Avots: habr.com

Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem šŸ”„ Iegādājieties uzticamu tÄ«mekļa hostingu ar DDoS aizsardzÄ«bu, VPS VDS serveriem | ProHoster