Integration des VueJS+TS Projekts mit SonarQube

In unserer Arbeit nutzen wir aktiv die Plattform SonarQube zur Aufrechterhaltung der CodequalitĂ€t auf hohem Niveau. Bei der Integration eines Projekts, das in VueJs+Typescript, gab es Probleme. Deshalb möchte ich ausfĂŒhrlicher darĂŒber berichten, wie wir sie gelöst haben.

Integration des VueJS+TS Projekts mit SonarQube

In diesem Artikel geht es, wie ich bereits erwĂ€hnt habe, um die Plattform SonarQube. Ein bisschen Theorie — was ist das ĂŒberhaupt, fĂŒr diejenigen, die zum ersten Mal davon hören:

SonarQube (ehemals Sonar) — eine Open-Source-Plattform fĂŒr kontinuierliche Analyse (engl. continuous inspection) und Messung der CodequalitĂ€t.
Sie unterstĂŒtzt die Codeanalyse und die Fehlersuche gemĂ€ĂŸ den Regeln der Programmierstandards MISRA C, MISRA C++, MITRE/CWE und CERT Secure Coding Standards. Zudem kann sie Fehlertypen aus den OWASP Top-10 und CWE/SANS Top-25 Programmierfehlern erkennen.
Obwohl die Plattform verschiedene fertige Tools verwendet, fasst SonarQube die Ergebnisse in einem einheitlichen Dashboard zusammen, fĂŒhrt die Historie der DurchlĂ€ufe und ermöglicht es damit, die allgemeine Tendenz in der VerĂ€nderung der SoftwarequalitĂ€t wĂ€hrend der Entwicklung zu erkennen.

Detailliertere Informationen gibt es auf der offiziellen Website

Es werden eine Vielzahl von Programmiersprachen unterstĂŒtzt. Laut den Informationen im obigen Link sind es ĂŒber 25 Sprachen. Um eine bestimmte Sprache zu unterstĂŒtzen, muss das entsprechende Plugin installiert werden. In der Community-Version ist ein Plugin fĂŒr die Arbeit mit Javascript (einschließlich Typescript) enthalten, obwohl in der Wiki etwas anderes steht. FĂŒr Javascript verantwortet das Plugin SonarJS, fĂŒr Typescript SonarTS entsprechend.

Um Informationen ĂŒber die Abdeckung zu ĂŒbermitteln, wird der offizielle Client sonarqube-scanner, der die Einstellungen aus config-Datei verwendet, auf den Server SonarQube diese Daten zur weiteren Konsolidierung und Aggregation sendet.

FĂŒr Javascript einen npm-Wrapper. Und so beginnen wir die schrittweise Implementierung SonarQube in Vue-Projekt, das Typescript.

verwendet. SonarQube FĂŒr die Bereitstellung des Servers nutzen wir docker-compose.

sonar.yaml:

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

Start:

docker-compose -f sonar.yml up

Nach diesem Schritt SonarQube ist es unter der Adresse verfĂŒgbar – http://localhost:9001 .

Integration des VueJS+TS Projekts mit SonarQube
Aktuell sind keine Projekte vorhanden, und das ist gerechtfertigt. Wir werden diese Situation verbessern. Ich habe das offizielle Beispielprojekt fĂŒr VueJS+TS+Jestals Grundlage genommen. Wir klonen es lokal:

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

Zuerst mĂŒssen wir den Client installieren, SonarQube, der den Namen sonar-scanner, fĂŒr npm gibt es eine Wrapper:

yarn add sonarqube-scanner

Und sofort fĂŒgen wir den Befehl in scripts fĂŒr die Nutzung hinzu.

package.json:

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

}

Um den Scanner zu betreiben, mĂŒssen die Projekteinstellungen in einer speziellen Datei festgelegt werden. Beginnen wir mit den Grundlagen.

sonar-project.properties:

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

sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Testanwendung (VueJS+TS)

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

  • sonar.host.url – Adresse Sonar’a;
  • sonar.projectKey – eindeutige Kennung des Projekts auf dem Server Sonar’a;
  • sonar.projectName – dessen Bezeichnung, die jederzeit geĂ€ndert werden kann, da die Identifizierung des Projekts anhand des projectKey erfolgt;
  • sonar.sources – Ordner mit den Quelldateien, normalerweise ist das src, kann jedoch beliebig sein. Dieser Ordner wird relativ zum Wurzelverzeichnis festgelegt, von dem der Scanner gestartet wurde;
  • sonar.tests – Parameter, der mit dem vorherigen verbunden ist. Dies ist der Ordner, in dem sich die Tests befinden. In diesem Projekt gibt es keinen solchen Ordner, und der Test befindet sich neben der zu testenden Komponente im Ordner 'test‘, daher ignorieren wir ihn vorerst und verwenden den folgenden Parameter;
  • sonar.test.inclusions – Pfad fĂŒr die Tests unter Verwendung von Mustern, es können mehrere Elemente durch Kommas getrennt aufgefĂŒhrt werden;
  • sonar.sourceEncoding – Kodierung fĂŒr die Quelldateien.

FĂŒr den ersten Start des Scanners ist alles bereit, außer der wichtigsten vorhergehenden Aktion: dem Start der Test-Engine, um Informationen ĂŒber die Abdeckung zu generieren, die der Scanner spĂ€ter verwenden wird.

Aber dafĂŒr muss die Test-Engine so konfiguriert werden, dass diese Informationen generiert werden. In diesem Projekt ist die Test-Engine – das ist Jest. Und seine Einstellungen befinden sich im entsprechenden Abschnitt der Datei package.json.

FĂŒgen wir diese Einstellungen hinzu:

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

Das heißt, wir setzen das Flag fĂŒr die Notwendigkeit der Abdeckungsberechnung und die Quelle (einschließlich der Ausnahmen), auf deren Grundlage sie generiert wird.

Jetzt starten wir den Test:

yarn test

Wir werden Folgendes sehen:

Integration des VueJS+TS Projekts mit SonarQube

Der Grund ist, dass im eigentlichen Komponentene keinen Code gibt. Lassen Sie uns das beheben.

HelloWorld.vue:

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

Das wird ausreichend sein, um die Abdeckung zu berechnen.

Nach dem Neustart des Tests werden wir uns davon ĂŒberzeugen:

Integration des VueJS+TS Projekts mit SonarQube

Auf dem Bildschirm sollten wir Informationen zur Abdeckung sehen, und im Projektverzeichnis wird ein Ordner erstellt coverage mit Informationen zur Testabdeckung im universellen Format LCOV (LTP GCOV-Erweiterung).

Gcov — eine frei verbreitete Dienstprogramm zur Analyse der Codeabdeckung. Gcov erzeugt die genaue Anzahl der AusfĂŒhrungen fĂŒr jeden Operator im Programm und erlaubt es, Anmerkungen zum Quellcode hinzuzufĂŒgen. Gcov wird als Standard-Dienstprogramm im GCC-Paket geliefert.
Lcov — eine grafische BenutzeroberflĂ€che fĂŒr gcov. Es sammelt gcov-Dateien fĂŒr mehrere Quellcode-Dateien und erstellt ein Set von HTML-Seiten mit Code und Abdeckungsinformationen. Außerdem werden Seiten zur vereinfachten Navigation generiert. Lcov unterstĂŒtzt die Abdeckung von Zeilen, Funktionen und Verzweigungen.

Nach der AusfĂŒhrung der Tests wird die Abdeckungsinformation in coverage/lcov.info.
Wir mĂŒssen sagen Sonarwoher sie kommt. Daher fĂŒgen wir folgende Zeilen in die Konfigurationsdatei ein. Es gibt allerdings einen Punkt zu beachten: Projekte können mehrsprachig sein, das heißt, im Ordner src befinden sich Quellcodes fĂŒr mehrere Programmiersprachen, und die Zuordnung zu einer bestimmten Sprache sowie die Verwendung eines bestimmten Plugins wird durch die Dateierweiterung bestimmt. Zudem kann die Abdeckungsinformation an verschiedenen Orten fĂŒr verschiedene Programmiersprachen gespeichert werden, weshalb jeder Programmiersprache ein eigener Abschnitt zur Konfiguration bereitsteht. Unser Projekt verwendet Typescript, daher benötigen wir einen speziellen Einstellungsabschnitt fĂŒr ihn:

sonar-project.properties:

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

Alles ist bereit fĂŒr den ersten Start des Scanners. Ich möchte darauf hinweisen, dass das Projekt in Sonarautomatisch beim ersten Start des Scanners fĂŒr dieses Projekt erstellt wird. Bei den folgenden AusfĂŒhrungen wird die Information bereits akkumuliert, um die Dynamik der VerĂ€nderungen der Projektparameter ĂŒber die Zeit sichtbar zu machen.

Lassen Sie uns also den Befehl verwenden, der zuvor in package.json:

yarn run sonar 

Hinweis: auch mit dem Parameter -X fĂŒr detailliertere Protokollierung genutzt werden kann.

Wenn der Scanner zum ersten Mal gestartet wurde, wird zunĂ€chst das BinĂ€rprogramm des Scanners heruntergeladen. Danach wird er gestartet und beginnt, den Server Sonarauf installierte Plugins zu prĂŒfen, wodurch die unterstĂŒtzten Programmiersprachen berechnet werden. Auch verschiedene andere Parameter fĂŒr seinen Betrieb werden heruntergeladen: QualitĂ€tsprofile, aktive Regeln, Metriken-Repository, Serverregeln.

Integration des VueJS+TS Projekts mit SonarQube

Integration des VueJS+TS Projekts mit SonarQube

Hinweis: im Rahmen dieses Artikels werden wir nicht nÀher darauf eingehen, aber es kann jederzeit auf offizielle Quellen verwiesen werden.

Anschließend beginnt die Analyse des Ordners src zum Vorhandensein von Quelldateien fĂŒr alle (es sei denn, es wurde ausdrĂŒcklich ein bestimmter angegeben) unterstĂŒtzten Programmiersprachen mit anschließender Indizierung.

Integration des VueJS+TS Projekts mit SonarQube

Hier folgen verschiedene andere Analysen, auf die wir in diesem Artikel nicht nÀher eingehen (zum Beispiel: Linting, Erkennung von Code-Duplikaten usw.).

Am Ende der Scannerarbeit erfolgt die Aggregation aller gesammelten Informationen, die Archivierung und der Versand an den Server.

Nach dem können wir sehen, was im Web-Interface herausgekommen ist:

Integration des VueJS+TS Projekts mit SonarQube

Wie zu sehen ist, ist etwas herausgekommen, und es zeigt sogar eine gewisse Abdeckung, aber sie entspricht nicht unserem Jest- Bericht.

Lass uns das klÀren. Schauen wir uns das Projekt im Detail an, klicken wir auf den Abdeckungswert und "tauchen wir" in den detaillierten Bericht der Dateien ein:

Integration des VueJS+TS Projekts mit SonarQube

Hier sehen wir neben der Haupt-, untersuchten Datei HelloWorld.vue, auch die Datei main.ts, die das gesamte Bild der Abdeckung stört. Aber wie kann das sein, wir haben sie aus der Abdeckung ausgeschlossen. Ja, das stimmt, aber das war auf der Ebene Jest, aber der Scanner hat sie indiziert, deshalb ist sie in seine Berechnungen eingeflossen.

Lass es uns beheben:

sonar-project.properties:

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

Ich möchte klarstellen: Neben den in diesem Parameter angegebenen Ordnern werden auch alle Ordner hinzugefĂŒgt, die im Parameter sonar.test.inclusions.

aufgefĂŒhrt sind. Nach dem Start des Scanners sehen wir bereits korrekte Informationen:

Integration des VueJS+TS Projekts mit SonarQube

Integration des VueJS+TS Projekts mit SonarQube

Betrachten wir den nĂ€chsten Punkt – QualitĂ€tsprofile. Ich habe oben erwĂ€hnt, dass mehrere Programmiersprachen gleichzeitig unterstĂŒtzt werden. Genau das sehen wir hier. Aber wir wissen, dass unser Projekt in SonarTS TS, geschrieben wurde, warum also den Scanner mit unnötigen Manipulationen und ÜberprĂŒfungen belasten? Die Sprache zur Analyse legen wir durch das HinzufĂŒgen eines weiteren Parameters in die Konfigurationsdatei fest Sonar:

sonar-project.properties:

...
sonar.language=ts
...

Lass uns den Scanner erneut starten und das Ergebnis ansehen:

Integration des VueJS+TS Projekts mit SonarQube

Die Abdeckung ist ganz verschwunden.

Wenn wir im Protokoll des Scanners nachsehen, können wir die folgende Zeile sehen:

Integration des VueJS+TS Projekts mit SonarQube

Das bedeutet, dass die Dateien unseres Projekts einfach nicht indiziert wurden.

Die Situation ist folgende: Die offizielle UnterstĂŒtzung fĂŒr VueJs besteht im Plugin SonarJS, das fĂŒr Javascript.

Integration des VueJS+TS Projekts mit SonarQube

verantwortlich ist. SonarTS fĂŒr TSAber diese UnterstĂŒtzung gibt es nicht im Plugin, was in einem offiziellen Ticket im Bug-Tracker vermerkt ist. Sonar:

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

Hier sind einige Antworten eines der Vertreter seitens der Entwickler von SonarQube, die diesen Fakt bestÀtigen.

Integration des VueJS+TS Projekts mit SonarQube

Integration des VueJS+TS Projekts mit SonarQube

Aber es hat doch alles bei uns funktioniert, werden Sie einwenden. Ja, das stimmt, lass uns versuchen, ein wenig zu "hacken"..
Wenn es UnterstĂŒtzung fĂŒr .vue-Dateien gibt. Sonardann lassen Sie uns versuchen, ihm zu sagen, dass er diese als Typescript.

FĂŒgen wir einen Parameter hinzu:

sonar-project.properties:

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

Lassen Sie uns den Scanner starten:

Integration des VueJS+TS Projekts mit SonarQube

Und voila, alles ist wieder beim alten, und mit einem Profil nur fĂŒr Typescript. Das heißt, wir haben das Problem mit der UnterstĂŒtzung VueJs+TS fĂŒr SonarQube.

Lassen Sie uns weitergehen und die Abdeckungsinformationen ein wenig verbessern.

Was haben wir bis jetzt getan:

  • wir haben im Projekt hinzugefĂŒgt Sonar-Scanner;
  • haben wir konfiguriert Jest um Abdeckungsinformationen zu erstellen;
  • haben wir konfiguriert Sonar-Scanner;
  • haben das Problem mit der UnterstĂŒtzung gelöst .vue-Dateien + Typescript.

Neben der Testabdeckung gibt es noch andere interessante QualitĂ€tskriterien fĂŒr den Code, wie z.B. Code-Duplikation und die Anzahl der Zeilen (die bei der Berechnung von Faktoren, die mit der Code-KomplexitĂ€t zusammenhĂ€ngen, berĂŒcksichtigt werden).

In der aktuellen Implementierung des Plugins funktioniert TS (SonarTS) nicht CPD (Copy Paste Detector) und die ZĂ€hlung der Codezeilen .vue-Dateien.

Um eine synthetische Situation zur Code-Duplikation zu schaffen, duplizieren wir einfach die Komponentendatei mit einem anderen Namen und fĂŒgen auch im Code main.ts eine Platzhalterfunktion hinzu und duplizieren sie mit einem anderen Namen. Um die Duplikation sowohl in .vue, als auch in .ts -Dateien.

main.ts:

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

Dazu mĂŒssen wir vorĂŒbergehend die Zeile mit der Konfiguration auskommentieren:

sonar-project.properties:

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

Lassen Sie uns den Scanner zusammen mit den Tests neu starten:

yarn test && yarn run sonar

NatĂŒrlich wird unsere Abdeckung sinken, aber das interessiert uns jetzt nicht.

Im Hinblick auf die Duplikation der Codezeilen sehen wir:

Integration des VueJS+TS Projekts mit SonarQube

FĂŒr die PrĂŒfung verwenden wir CPD-Utility – jscpd:

npx jscpd src

Integration des VueJS+TS Projekts mit SonarQube

FĂŒr Codezeilen:

Integration des VueJS+TS Projekts mit SonarQube

Vielleicht wird das in zukĂŒnftigen Versionen der Plugins SonarJS(TS)gelöst. Ich möchte anmerken, dass sie allmĂ€hlich beginnen, diese beiden Plugins zu einem zu verschmelzen SonarJS, was ich denke, ist richtig.

Jetzt möchten wir die Möglichkeit zur Verbesserung der Abdeckungsinformationen betrachten.

Bis jetzt sehen wir die Testabdeckung in Prozent ĂŒber das gesamte Projekt und spezifisch fĂŒr die Dateien. Aber es gibt die Möglichkeit, diesen Wert mit Informationen ĂŒber die Anzahl der Unit-Tests im Projekt zu erweitern, sowie im Hinblick auf die Dateien.

Es gibt eine Bibliothek, die in der Lage ist, Jest-Reporte in das Format fĂŒr Sonar:
generic test data — https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

Lassen Sie uns diese Bibliothek in unser Projekt integrieren:

yarn add jest-sonar-reporter

Und fĂŒgen wir es in die Konfiguration ein Jest:

package.json:



"testResultsProcessor": "jest-sonar-reporter"



FĂŒhren wir jetzt den Test durch:

yarn test

Nach dem wird im Wurzelverzeichnis des Projekts eine Datei erstellt test-report.xml.

Nutzen Sie sie in der Konfiguration Sonar:

sonar-project.properties:



sonar.testExecutionReportPaths=test-report.xml



Und starten Sie den Scanner neu:

yarn run sonar

Lassen Sie uns sehen, was sich in der OberflÀche geÀndert hat. Sonar:

Integration des VueJS+TS Projekts mit SonarQube

Und es hat sich nichts geĂ€ndert. Das liegt daran, dass Sonar Dateien, die im Jest-Bericht beschrieben sind, nicht als Testdateien betrachtet. Unit-Tests. Um diese Situation zu beheben, verwenden wir den Konfigurationsparameter Sonar sonar.tests, in dem wir die Ordner mit den Tests ausdrĂŒcklich angeben (wir haben derzeit nur einen):

sonar-project.properties:



sonar.tests=src/components/__tests__



Starten wir den Scanner neu:

yarn run sonar

Lassen Sie uns sehen, was sich in der OberflÀche geÀndert hat:

Integration des VueJS+TS Projekts mit SonarQube

Jetzt haben wir die Anzahl unserer Unit-Tests gesehen und können, indem wir darauf klicken, die Verteilung dieser Zahl auf die Projektdateien einsehen:

Integration des VueJS+TS Projekts mit SonarQube

Fazit

Also haben wir ein Tool fĂŒr die kontinuierliche Analyse betrachtet. SonarQubeWir haben es erfolgreich mit einem Projekt integriert, das in VueJs+TSgeschrieben wurde. Einige KompatibilitĂ€tsprobleme wurden gelöst. Wir haben die Aussagekraft der Testabdeckungskennzahl erhöht. In diesem Artikel haben wir nur eines der QualitĂ€tskriterien fĂŒr Code betrachtet (möglicherweise eines der wichtigsten), aber SonarQube unterstĂŒtzt auch andere QualitĂ€tskriterien, einschließlich Sicherheitstests. Doch nicht alle diese Funktionen sind in vollem Umfang in der Community-Version verfĂŒgbar. Eine der interessanten und nĂŒtzlichen Funktionen sind die Integrationen SonarQube mit verschiedenen Code-Repository-Management-Systemen, wie zum Beispiel GitLab und BitBucket. Um zu verhindern, dass Merge Pull-Requestin den Hauptzweig des Repositories bei einer Abnahme der Abdeckung integriert wird. Aber das ist eine ganz andere Geschichte.

PS: Alles, was in diesem Artikel in Form von Code beschrieben wird, ist in meinem Fork verfĂŒgbar..

Nur registrierte Benutzer können an der Umfrage teilnehmen. Bitte einloggen.

Nutzen Sie die Plattform SonarQube:

  • 26,3%Ja5

  • 15,8%Nein3

  • 15,8%Ich habe von dieser Plattform gehört und möchte sie verwenden3

  • 10,5%Ich habe von dieser Plattform gehört, möchte sie aber nicht verwenden2

  • 0,0%Ich nutze eine andere Plattform0

  • 31,6%Ich höre zum ersten Mal davon6

19 Benutzer haben abgestimmt. 3 Benutzer haben sich enthalten.

Quelle: habr.com

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster