VueJS+TS projekt integrációja a SonarQube-hoz

A munkánk során aktívan használjuk a platformot SonarQube a kódminőség magas színvonalának fenntartásához. Egyik projektünk integrálása során, amelyet VueJs+Typescript, problémák merültek fel. Ezért szeretném részletesebben bemutatni, hogyan sikerült ezeket megoldani.

VueJS+TS projekt integrációja a SonarQube-hoz

Ebben a cikkben, ahogy említettem, a SonarQube platformról lesz szó. Egy kis elmélet – mi is ez valójában, azok számára, akik először hallanak róla:

SonarQube (korábban Sonar) – egy nyílt forráskódú platform a folyamatos elemzés (angolul continuous inspection) és a kódminőség mérésére.
Támogatja a kód elemzését és a hibák keresését a MISRA C, MISRA C++, MITRE/CWE és CERT Secure Coding Standards programozási szabványainak előírásainak megfelelően. Ezen kívül képes az OWASP Top-10 és a CWE/SANS Top-25 programozási hibák listájából hibákat felderíteni.
Annak ellenére, hogy a platform különféle kész eszközöket használ, a SonarQube az eredményeket egyetlen információs panelre (angolul dashboard) összevonja, nyomon követve a futások történetét, ezáltal lehetővé téve, hogy lássuk a szoftver minőségének fejlődési tendenciáit a fejlesztés során.

További részletek elérhetők itt: hivatalos oldalon

Számos programozási nyelvet támogat. Az előző linken található információk szerint több mint 25 nyelvet. Egy adott nyelv támogatásához a megfelelő plugint kell telepíteni. A community verzióba beletartozik a plugin a Javascript (a typesсriptet is beleértve), bár a wikiben éppen az ellenkezője szerepel. A Javascript felelőse a plugin SonarJS, a Typescripté pedig SonarTS. vagy.

A lefedettségi adatok küldéséhez hivatalos klienst használunk sonarqube-scanner, amely a config-fájl beállításait használva küldi el ezeket az adatokat a szerverre SonarQube a további konszolidáció és aggregálás érdekében.

A Javascript tartalmaz npm-wrapper. Tehát kezdjük el lépésről lépésre bevezetni a SonarQube be. Vue-projektet, amely Typescript.

felhasználása. SonarQube A szerver telepítéséhez docker-compose.

a:

sonar.yaml

Indítás:

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

docker-compose -f sonar.yml up SonarQube Ezután elérhető lesz a cím alatt – http://localhost:9001 .

VueJS+TS projekt integrációja a SonarQube-hoz
Jelenleg nincsenek projektek, ami jogos. Ezen a helyzeten javítani fogunk. Alapként egy hivatalos példa projektet vettem a VueJS+TS+Jest. Klónozzuk le magunknak:

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

Először telepítenünk kell a klienst, amelynek neve SonarQubesonar-scanner van egy wrapper-e:problémát jelent npm yarn add sonarqube-scanner

És azonnal hozzáadunk egy parancsot a

használatához. scripts package.json:

csomag.json:

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

Ezután a szkenner működéséhez meg kell adni a projektbeállításokat egy speciális fájlban. Kezdjük az alapokkal.

sonar-project.properties:

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

sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Tesztalkalmazás (VueJS+TS)

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

  • sonar.host.url – cím Sonar’ja;
  • sonar.projectKey – a projekt egyedi azonosítója a szerveren Sonar’ja;
  • sonar.projectName – a neve, amely bármikor megváltoztatható, hiszen a projekt azonosítása a projectKey;
  • sonar.sources – a források mappája, általában ez src, de lehet bármilyen. Ez a mappa a gyökérmappához képest van megadva, ami a szkenner által indított mappa;
  • sonar.tests – paraméter, amely a korábbiakhoz tartozik. Ez az a mappa, ahol a tesztek találhatóak. Ebben a projektben nincs ilyen mappa, a teszt a tesztelendő komponens mellett található a ‘teszt‘ mappában, ezért most figyelmen kívül hagyjuk, és a következő paramétert használjuk;
  • sonar.test.inclusions – az útvonal a tesztekhez maszk használatával, több elem is felsorolható, amelyet vesszővel elválasztunk;
  • sonar.sourceEncoding – a forrásfájlok kódolása.

A szkenner első indításához minden készen áll, kivéve a fő előkészítő lépést: a tesztmotor indítása, amely információt generál a lefedettségről, amelyet ezután a szkenner fog használni.

De ehhez be kell állítani a tesztmotort, hogy generálja ezt az információt. Ebben a projektben a tesztmotor a Jest. A beállítása a fájl megfelelő szakaszában található. package.json.

Adjuk hozzá ezeket a beállításokat:

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

Tehát megadjuk magát a fedettség számításának szükségességét és a forrást (kivétellel együtt), amelyek alapján ez létrejön.

Most futtassuk a tesztet:

yarn test

A következőket fogjuk látni:

VueJS+TS projekt integrációja a SonarQube-hoz

Az oka az, hogy magában a komponensben nincsen kód. Javítsuk ki ezt.

HelloWorld.vue:

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

Ez elegendő lesz a lefedettség számításához.

A teszt újraindítása után győződjünk meg erről:

VueJS+TS projekt integrációja a SonarQube-hoz

A képernyőn látnunk kell a lefedettségről szóló információt, a projekt mappájában pedig létrejön egy mappa coverage a tesztelések lefedettségi információival univerzális formátumban LCOV (LTP GCOV kiterjesztés).

Gcov — nyílt forráskódú segédprogram a kódlefedettség vizsgálatára. A Gcov pontosan megmutatja, hogy hány alkalommal hajtódik végre minden egyes utasítás a programban, és lehetővé teszi, hogy annotációkat adjunk a forráskódhoz. A Gcov a GCC csomag standard segédprogramjaként érhető el.
Lcov — grafikus felület a gcov számára. Összegyűjti a gcov fájlokat több forrásfájlból, és HTML-oldalcsomagot hoz létre a kód és a lefedettségi információk mellett. Továbbá navigációs oldalak is generálódnak. Az Lcov támogatja a sorok, funkciók és ágazások lefedettségét.

A tesztek végrehajtása után a lefedettségi információ a következő helyen található coverage/lcov.info.
Meg kell mondanunk Sonarhonnan szerezzük be. Ezért adjuk hozzá a következő sorokat a konfigurációs fájljához. Van egy apró megjegyzés: a projektek többnyelvűek lehetnek, ami azt jelenti, hogy a mappában src különböző programozási nyelvek forrásai találhatók, amelyekhez a megfelelő plugin használata a kiterjesztése alapján dől el. A lefedettségi információkat ezért különböző helyeken tárolhatják különböző programozási nyelvek számára, ezért minden programozási nyelv számára van egy beállítási rész. A projektünk Typescripthasználja, így szükség van a kifejezetten ehhez szükséges beállítási részre:

sonar-project.properties:

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

Minden készen áll az első szkenner indítására. Szeretném megjegyezni, hogy a projekt a Sonarautomatikusan létrejön az adott projekt szkenner első indításakor. A következő alkalommal az információk már felhalmozódnak, hogy láthassuk a projekt paramétereinek időbeli változásait.

Tehát használjuk az előzőleg létrehozott parancsot a package.json:

yarn run sonar 

Megjegyzés: a részletesebb naplózás érdekében a -X paraméter is használható.

Ha a szkenner indítása először történik, először a szkenner bináris állományát töltjük le. Ezt követően elindul és elkezdi átvizsgálni a Sonarszervert a telepített pluginek felderítése érdekében, így számítja ki a támogatott programozási nyelveket is. Ezenkívül más különböző paramétereket is betölt a működéséhez: quality profiles, active rules, metrics repository, server rules.

VueJS+TS projekt integrációja a SonarQube-hoz

VueJS+TS projekt integrációja a SonarQube-hoz

Megjegyzés: részletesebben ezekre nem fogunk kitérni a jelen cikk keretein belül, de mindig lehet a hivatalos forrásokhoz fordulni.

Ezután megkezdődik a mappa elemzése. src a támogatott programozási nyelvekhez tartozó forrásfájlok elérhetőségét vizsgálva (ha nem határoztunk meg kifejezetten egy konkrétat), majd a fájlok indexelését végrehajtva.

VueJS+TS projekt integrációja a SonarQube-hoz

Ezután további különböző elemzések következnek, amelyekre a cikkünkben nem térünk ki (például: lintelés, a kódduplikációk meghatározása stb.).

A szkenner munkájának végén a begyűjtött információk összesítése, archiválása és a szerverre való küldés történik.

Ezek után már megnézhetjük, hogy mi jött ki a webes felületen:

VueJS+TS projekt integrációja a SonarQube-hoz

Látható, hogy valami kialakult, és még fedettséget is mutat, de ez nem felel meg a Jest-jelentésünknek.

Nézzük meg részletesebben. Vessünk egy pillantást a projektre, kattintsunk a fedettség értékére, és "merüljünk" el a fájlok részletes jelentésében:

VueJS+TS projekt integrációja a SonarQube-hoz

Itt az alapvető, vizsgált fájl mellett látjuk HelloWorld.vue, itt van egy main.ts, amely tönkreteszi az egész fedettségi képet. De hogy lehet ez, hiszen kizártuk őt a fedettségi számításból. Igen, ez igaz, de ez a szinten történt, Jest, de a szkenner indexálta, így bekerült a számításaikba.

Javítsuk ki ezt:

sonar-project.properties:

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

Szeretném megjegyezni: a megadott mappákon kívül minden olyan mappa is hozzáadódik, amely a paraméterben van megadva, sonar.test.inclusions.

A szkenner futtatása után már helyes információt látunk:

VueJS+TS projekt integrációja a SonarQube-hoz

VueJS+TS projekt integrációja a SonarQube-hoz

Nézzük meg a következő szempontot – Quality profiles. Korábban beszéltem róla, hogy a támogatás Sonartöbb programozási nyelv egyidejű alkalmazásához szükséges. Ezt pontosan most látjuk. De tudjuk, hogy a projektünk TSnyelven készült, ezért minek kínzani a szkennert felesleges manipulációkkal és ellenőrzésekkel. A nyelvet az elemzéshez úgy határozzuk meg, hogy egy új paramétert adunk hozzá a konfigurációs fájlhoz, Sonar:

sonar-project.properties:

...
sonar.language=ts
...

Újra futtassuk a szkennert és nézzük meg az eredményt:

VueJS+TS projekt integrációja a SonarQube-hoz

A fedettség teljesen eltűnt.

Ha megnézzük a szkenner naplóját, láthatjuk a következő sort:

VueJS+TS projekt integrációja a SonarQube-hoz

Ez azt jelenti, hogy a projektünk fájljai egyszerűen nem voltak indexálva.

A helyzet a következő: hivatalosan a támogatás VueJs támogatott a pluginban, SonarJS, amely a Javascript.

VueJS+TS projekt integrációja a SonarQube-hoz

-ért felelős, de ez a támogatás nem található meg a SonarTS. a TS-ban, amiről hivatalos tiket nyitottak a hibakövetőben. Sonar:

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

Itt van néhány válasz a SonarQube fejlesztői részéről, amely megerősíti ezt a tényt.

VueJS+TS projekt integrációja a SonarQube-hoz

VueJS+TS projekt integrációja a SonarQube-hoz

De mindenképpen minden jól működött, válaszolhat neki. Igen, így van, próbáljuk meg egy kicsit „hackelni”.
Ha van támogatás a .vue-fájlokhoz SonarHogyha így van, próbáljuk meg mondani neki, hogy tekintse őket úgy, mint Typescript.

Adjuk hozzá a paramétert:

sonar-project.properties:

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

Futtassuk a szkennerünket:

VueJS+TS projekt integrációja a SonarQube-hoz

És voilà, minden visszatért a régi kerékvágásba, és csak egy profilt használunk Typescript. Tehát sikerült megoldani a támogatási problémát VueJs+TS a SonarQube.

Próbáljuk tovább lépni és egy kicsit javítani az információt a lefedettségről.

Mit csináltunk eddig:

  • hoztunk a projekthez Sonar-szkennert;
  • beállítottuk Jest a lefedettséggel kapcsolatos információk generálásához;
  • konfiguráltuk Sonar-szkennert;
  • meglévő támogatási problémát .vue-fájlok + Typescript.

A tesztekkel való lefedettségen kívül más érdekes minőségi kritériumok is vannak, például a kódduplikáció és a sorok száma (részt vesz a kód komplexitásával kapcsolatos mutatók számításában) a projektben.

A plugin jelenlegi megvalósításában TS (SonarTS.) nem fog működni CPD (Másolat Másoló Detektor) és a kód sorok számának .vue-fájlok.

Egy szintetikus helyzet létrehozásához a kódduplikációval kapcsolatban, egyszerűen dublírozzuk a komponenst egy másik névvel, és a kódba is hozzáadunk main.ts egy üres funkciót, és dublírozzuk egy másik névvel. Azonban az itteni duplikációt ellenőrizzük .vue-ban, valamint a .ts A cím és a többi hálózati beállítás ezekhez a interfészekhez

main.ts:

...
funkció név(paraméter:string): void {
  console.log(paraméter);
}
...

Ehhez ideiglenesen ki kell kommentálni a konfigurációs sort:

sonar-project.properties:

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

Újraindítjuk a szkennert a teszteléssel együtt:

yarn test && yarn run sonar

Természetesen a lefedettség csökkenni fog, de most ez nem érdekel minket.

A kód sorainak duplikálása szempontjából láthatjuk:

VueJS+TS projekt integrációja a SonarQube-hoz

Ellenőrzéshez használjuk a CPD-eszközt – jscpd:

npx jscpd src

VueJS+TS projekt integrációja a SonarQube-hoz

A kód sorokra:

VueJS+TS projekt integrációja a SonarQube-hoz

Lehetséges, hogy ez a plugin jövőbeli verzióiban megoldódik SonarJS(TS). Szeretném megjegyezni, hogy fokozatosan kezdik egyesíteni ezt a két plugint egybe, SonarJSami szerintem helyes.

Most szeretném megvitatni a lefedettségi információk javításának lehetőségét.

Jelenleg a teszteket százalékos arányban látjuk az egész projektben, és a fájlok szerint. De van lehetőség arra, hogy ezt a mutatót kiegészítsük a fájlt, amely a következő típusú:-tesztek számával a projekten belül, valamint a fájlok szempontjából.

Van egy könyvtárunk, amely tudja Jest-a jelentést konvertálni olyan formátumba, mint Sonar:
generic test data — https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

Telepítsük ezt a könyvtárat a projektünkbe:

yarn add jest-sonar-reporter

És adjuk hozzá a konfigurációhoz Jest:

csomag.json:

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

Most futtassuk a tesztet:

yarn test

Ezt követően a projekt gyökerében létrejön a fájl test-report.xml.

Hivatkozzunk rá a konfigurációban Sonar:

sonar-project.properties:

…
sonar.testExecutionReportPaths=test-report.xml
…

És indítsuk újra a szkennert:

yarn run sonar

Nézzük meg, mi változott a felületen Sonar:

VueJS+TS projekt integrációja a SonarQube-hoz

És semmi sem változott. A helyzet az, hogy a Sonar nem tekinti a Jest-jelentésben leírt fájlokat fájloknak fájlt, amely a következő típusú:-tesztekhez. Annak érdekében, hogy megoldjuk ezt a helyzetet, felhasználjuk a konfigurációs paramétert Sonar sonar.tests, amelyben egyértelműen megadjuk a tesztelési mappákat (jelenleg egy van):

sonar-project.properties:

…
sonar.tests=src/components/__tests__
…

Indítsuk újra a szkenNELŐT:

yarn run sonar

Nézzük meg, mi változott a felületen:

VueJS+TS projekt integrációja a SonarQube-hoz

Most láthatjuk a tesztjeink számát, és ha rákattintunk, megnézhetjük ezt a számot a projekt fájljai szerint: fájlt, amely a következő típusú:Tehát megvizsgáltuk a folyamatos elemző eszközt.

VueJS+TS projekt integrációja a SonarQube-hoz

Zárás

Sikeresen integráltuk vele a VueJs+Typescript alapú projektet. SonarQubeMegoldottunk néhány kompatibilitási problémát. Növeltük a tesztlefedettség információs mutatójának hatékonyságát. Ebben a cikkben csupán egy kódminőségi szempontot vizsgáltunk meg (valószínűleg az egyik legfontosabbat), de VueJs+TStámogat más minőségi szempontokat is, beleértve a biztonsági tesztelést. De nem minden lehetőség érhető el teljes mértékben SonarQube community -verzióban. Az egyik érdekes és hasznos lehetőség azkülönböző kódkezelő rendszerekkel (például GitLab és BitBucket) való integráció. Annak érdekében, hogy elkerüljük a SonarQube merge pull(merge) request a központi ágba, ha a lefedettség csökken. De ez már egy teljesen másik cikk története.Minden, ami a cikkben kód formájában le van írva, elérhető a

PS: forkomban Használja a SonarQube platformot:.

Csak a regisztrált felhasználók vehetnek részt a szavazáson. Kérem, jelentkezzen be., kérem.

Hallottam erről a platformról, és használni szeretném

  • 26,3%Igen5

  • 15,8%Nem3

  • 15,8%Hallottam erről a platformról, de nem akarom használni

  • 10,5%Használok egy másik platformot

  • 0,0%Először hallok róla

  • 31,6%19 felhasználó szavazott. 3 felhasználó tartózkodott.

A munkánk során aktívan használjuk a SonarQube platformot a kódminőség magas szinten tartására. Az egyik VueJs+Typescript alapú projekt integrálása során problémák merültek fel.

Forrás: habr.com

Megbízható hosting vásárlása weboldalak számára, DDoS védelemmel, VPS VDS szerverek. 🔥 Megbízható webtárhely vásárlása DDoS védelemmel, VPS VDS szerverek | ProHoster