ΠΠΈΠ΅ Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° Π² Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° soundQube Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ Π½Π° Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°. ΠΡΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½ΠΈ Π² VueJs+Typescript, Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ°ΡΠΎΠ²Π° Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° Π²ΠΈ ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° Π³ΠΈ ΡΠ°Π·ΡΠ΅ΡΠΈΠΌ.
Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΠΌ, ΠΊΠ°ΠΊΡΠΎ ΠΏΠΈΡΠ°Ρ ΠΏΠΎ-Π³ΠΎΡΠ΅, Π·Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° SonarQube. ΠΠ°Π»ΠΊΠΎ ΡΠ΅ΠΎΡΠΈΡ - ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΡΠΎΠ²Π° ΠΊΠ°ΡΠΎ ΡΡΠ»ΠΎ, Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ ΡΡΠ²Π°Ρ Π·Π° Π½Π΅Π³ΠΎ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ:
soundQube (Π±ΠΈΠ²Ρ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ) Π΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°ΡΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°.
ΠΠΎΠ΄Π΄ΡΡΠΆΠ° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄ ΠΈ ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΡΡΠ³Π»Π°ΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ MISRA C, MISRA C++, MITER/CWE ΠΈ CERT Secure Coding Standards. ΠΠΎΠΆΠ΅ ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΎΡ ΡΠΏΠΈΡΡΠΊΠ° Π’ΠΎΠΏ 10 Π½Π° OWASP ΠΈ Π’ΠΎΠΏ 25 Π½Π° CWE/SANS Ρ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π³ΡΠ΅ΡΠΊΠΈ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ°ΠΊΡΠ°, ΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΠΎΡΠΎΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, SonarQube Π½Π°ΠΌΠ°Π»ΡΠ²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π΄ΠΎ Π΅Π΄Π½ΠΎ ΡΠ°Π±Π»ΠΎ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅, Π·Π°ΠΏΠ°Π·Π²Π°ΠΉΠΊΠΈ ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡΡΠ° ΠΈ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΡΠ΅ ΠΎΠ±ΡΠ°ΡΠ° ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡ Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈ Π² ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ°.
ΠΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎΡΡΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° Π½Π°ΠΌΠ΅ΡΠΈΡΠ΅ Π½Π°
ΠΠΎΠ΄Π΄ΡΡΠΆΠ°Ρ ΡΠ΅ Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ Π΅Π·ΠΈΡΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅. Π‘ΡΠ΄Π΅ΠΉΠΊΠΈ ΠΏΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° ΠΎΡ Π»ΠΈΠ½ΠΊΠ° ΠΏΠΎ-Π³ΠΎΡΠ΅, ΡΠΎΠ²Π° ΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 25 Π΅Π·ΠΈΠΊΠ°. ΠΠ° Π΄Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ Π΅Π·ΠΈΠΊ, ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΡΠ΅ ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡ ΠΏΠ»ΡΠ³ΠΈΠ½. ΠΠ΅ΡΡΠΈΡΡΠ° Π½Π° ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° Π²ΠΊΠ»ΡΡΠ²Π° ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° ΡΠ°Π±ΠΎΡΠ° Javascript (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ typeΡript), Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΡΠΈΠΊΠΈΡΠΎ ΠΊΠ°Π·Π²Π° ΠΎΠ±ΡΠ°ΡΠ½ΠΎΡΠΎ. ΠΡΠ·Π°Π΄ Javascript ΠΏΠ»ΡΠ³ΠΈΠ½ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ SonarJS, Π·Π° Typescript SonarTS ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ.
ΠΡΠΈΡΠΈΠ°Π»Π½ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π·Π° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ sonarqube-ΡΠΊΠ΅Π½Π΅Ρ, ΠΊΠΎΠΉΡΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΠΎΡ Π΄ΠΎΠ²Π΅ΡΠ΅Π½ΠΈΠΊ-file, ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡΡΠ²ΡΡΠ° soundQube Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΠΊΠΎΠ½ΡΠΎΠ»ΠΈΠ΄Π°ΡΠΈΡ ΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅.
ΠΠ° Javascript ΠΈΠΌΠ°
ΠΠ° Π΄Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠΈΡΠ΅ ΡΡΡΠ²ΡΡ soundQube Π΄Π° ΡΠ΅ Π²ΡΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π΄ΠΎΠΊΠ΅Ρ-Π½ΠΎΠ²ΠΎ ΡΡΠΎΠ±ΡΠ΅Π½ΠΈΠ΅.
ΡΠΎΠ½Π°Ρ.yaml:
version: '1'
services:
simplesample-sonar:
image: sonarqube:lts
ports:
- 9001:9000
- 9092:9092
network_mode: bridge
Π‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅:
docker-compose -f sonar.yml up
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° soundQube ΡΠ΅ Π±ΡΠ΄Π΅ Π½Π° ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ Π½Π°:
Π Π½Π΅Π³ΠΎ Π²ΡΠ΅ ΠΎΡΠ΅ Π½ΡΠΌΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΡΠΎΠ²Π° Π΅ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ. ΠΠΈΠ΅ ΡΠ΅ ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΠ·Π΅Ρ
ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΠΏΡΠΈΠΌΠ΅ΡΠ΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ Π·Π° VueJS+TS+Jest. ΠΠ΅ΠΊΠ° Π³ΠΎ Π½Π°Π²Π΅Π΄Π΅ΠΌ ΠΊΡΠΌ ΡΠ΅Π±Π΅ ΡΠΈ:
git clone https://github.com/vuejs/vue-test-utils-typescript-example.git
ΠΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° soundQubeΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΠ° ΡΠΎΠ½Π°Ρ-ΡΠΊΠ΅Π½Π΅ΡΠ·Π° NPM ΠΈΠΌΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°:
yarn add sonarqube-scanner
Π Π²Π΅Π΄Π½Π°Π³Π° Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ° ΠΊΡΠΌ ΡΠΊΡΠΈΠΏΡΠΎΠ²Π΅ Π΄Π° ΡΠ°Π±ΠΎΡΠΈ Ρ Π½Π΅Π³ΠΎ.
package.json:
{
β¦
scripts: {
...
"sonar": "sonar-scanner"
...
},
β¦
}
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π°, Π·Π° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ ΡΠΊΠ΅Π½Π΅ΡΡΡ, ΡΡΡΠ±Π²Π° Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΡΠ°ΠΉΠ». ΠΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΎΡΠ½ΠΎΠ²ΠΈΡΠ΅.
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 - Π°Π΄ΡΠ΅Ρ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ'A;
- sonar.projectKey β ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ'A;
- sonar.projectName β ΠΈΠΌΠ΅ΡΠΎ ΠΌΡ, ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΎ ΠΏΠΎ Π²ΡΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΏΡΠΎΠ΅ΠΊΡΡΡ ΡΠ΅ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΡΠΈΡΠ° Ρ projectKey;
- ΡΠΎΠ½Π°Ρ.ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ β ΠΏΠ°ΠΏΠΊΠ° Ρ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠΎΠ²Π° SRC, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ Π²ΡΠΈΡΠΊΠΎ. Π’Π°Π·ΠΈ ΠΏΠ°ΠΏΠΊΠ° Π΅ Π·Π°Π΄Π°Π΄Π΅Π½Π° ΡΠΏΡΡΠΌΠΎ ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΏΠ°ΠΏΠΊΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, ΠΎΡ ΠΊΠΎΡΡΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΡΠΊΠ΅Π½Π΅ΡΡΡ;
- ΡΠΎΠ½Π°Ρ.ΡΠ΅ΡΡΠΎΠ²Π΅ β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΠΉΡΠΎ Π²ΡΡΠ²ΠΈ Π² ΡΠ°Π½Π΄Π΅ΠΌ Ρ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ. Π’ΠΎΠ²Π° Π΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π½ΡΠΌΠ° ΡΠ°ΠΊΠ°Π²Π° ΠΏΠ°ΠΏΠΊΠ° ΠΈ ΡΠ΅ΡΡΡΡ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π΄ΠΎ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ°, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ΡΡΠ²Π° Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° 'ΡΠ΅ΡΡ', ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π°ΡΠ΅Π³Π° ΡΠ΅ Π³ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ;
- ΡΠΎΠ½Π°Ρ.ΡΠ΅ΡΡ.Π²ΠΊΠ»ΡΡΠ²Π°Π½ΠΈΡ β ΠΏΡΡ Π·Π° ΡΠ΅ΡΡΠΎΠ²Π΅ Ρ ΠΏΠΎΠΌΠΎΡΡΠ° Π½Π° ΠΌΠ°ΡΠΊΠ°, ΠΌΠΎΠΆΠ΅ Π΄Π° ΠΈΠΌΠ° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΡ Π·Π°ΠΏΠ΅ΡΠ°ΠΈ;
- sonar.sourceEncoding β ΠΊΠΎΠ΄ΠΈΡΠ°Π½Π΅ Π·Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ° ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ, Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄ΡΠ΅ΡΡΠ²Π°ΡΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅: ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΌΠΈΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π²ΠΈΠ³Π°ΡΠ΅Π», Π·Π° Π΄Π° ΠΌΠΎΠΆΠ΅ Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ, ΠΊΠΎΡΡΠΎ ΡΠΊΠ΅Π½Π΅ΡΡΡ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅.
ΠΠΎ Π·Π° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π° Π΄Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°ΡΠ΅ ΡΠ΅ΡΡΠΎΠ²Π°ΡΠ° ΠΌΠ°ΡΠΈΠ½Π° Π΄Π° Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ΡΡΠΎΠ²ΠΈΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» Π΅ ΠΈΠΌΠ°. Π Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΠΌΡ ΡΠ° Π² ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡ ΡΠ°Π·Π΄Π΅Π» Π½Π° ΡΠ°ΠΉΠ»Π° package.json.
ΠΠ΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ΅Π·ΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ:
"collectCoverage": true,
"collectCoverageFrom": [
"src/**/*",
"!src/main.ts",
"!src/App.vue",
"!src/**/*.d.*",
"!src/**/*__tests__*"
],
Π’ΠΎΠ΅ΡΡ, Π·Π°Π΄Π°Π²Π°ΠΌΠ΅ ΡΠ°ΠΌΠΈΡ ΡΠ»Π°Π³ Π·Π° Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎΡΡΡΠ° ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΠΊΠ° (Π·Π°Π΅Π΄Π½ΠΎ Ρ ΠΈΠ·ΠΊΠ»ΡΡΠ΅Π½ΠΈΡ), Π²ΡΠ· ΠΎΡΠ½ΠΎΠ²Π° Π½Π° ΠΊΠΎΠΉΡΠΎ ΡΠ΅ ΡΠ΅ ΡΠΎΡΠΌΠΈΡΠ°.
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ΅ΡΡΠ°:
yarn test
Π©Π΅ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΎΡΠΎ:
ΠΡΠΈΡΠΈΠ½Π°ΡΠ° Π΅, ΡΠ΅ Π² ΡΠ°ΠΌΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π½ΡΠΌΠ° ΠΊΠΎΠ΄. ΠΠ΅ΠΊΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°.
HelloWorld.vue:
...
methods: {
calc(n) {
return n + 1;
}
},
mounted() {
this.msg1 = this.msg + this.calc(1);
},
...
Π’ΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ Π΄ΠΎΡΡΠ°ΡΡΡΠ½ΠΎ Π·Π° ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ.
Π‘Π»Π΅Π΄ ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅ΡΡΠ° ΡΠ΅ ΡΠ΅ ΡΠ²Π΅ΡΠΈΠΌ Π² ΡΠΎΠ²Π°:
ΠΠ° Π΅ΠΊΡΠ°Π½Π° ΡΡΡΠ±Π²Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ ΠΈ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΏΠ°ΠΏΠΊΠ° ΠΎΠ±Ρ Π²Π°Ρ Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΡΠ΅ΡΡΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π² ΡΠ½ΠΈΠ²Π΅ΡΡΠ°Π»Π΅Π½ ΡΠΎΡΠΌΠ°Ρ LCOV (LTP GCOV ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅).
Gcov Π΅ ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ²Π°Π½Π° ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° Π·Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°. Gcov Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠΎΡΠ½ΠΈΡ Π±ΡΠΎΠΉ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΈΠ·ΡΠ°Π· Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΈ Π²ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄Π° Π΄ΠΎΠ±Π°Π²ΡΡΠ΅ Π°Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΊΡΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄. Gcov ΠΈΠ΄Π²Π° ΠΊΠ°ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π° ΠΏΠΎΠΌΠΎΡΠ½Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ° ΠΊΠ°ΡΠΎ ΡΠ°ΡΡ ΠΎΡ GCC ΠΏΠ°ΠΊΠ΅ΡΠ°.
Lcov - Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° gcov. Π’ΠΎΠΉ ΡΡΠ±ΠΈΡΠ° gcov ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° ΠΌΠ½ΠΎΠΆΠ΅ΡΡΠ²ΠΎ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ ΠΈ ΡΡΠ·Π΄Π°Π²Π° Π½Π°Π±ΠΎΡ ΠΎΡ HTML ΡΡΡΠ°Π½ΠΈΡΠΈ Ρ ΠΊΠΎΠ΄ ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ. Π‘ΡΡΠ°Π½ΠΈΡΠΈΡΠ΅ ΡΡΡΠΎ ΡΠ΅ Π³Π΅Π½Π΅ΡΠΈΡΠ°Ρ, Π·Π° Π΄Π° ΡΠ»Π΅ΡΠ½ΡΡ Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΡΠ°. Lcov ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° Π½ΠΈΠ·ΠΎΠ²Π΅, ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΏΡΠΈΠΊΠ»ΡΡΠ°Ρ, ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ°Π·ΠΏΠΎΠ»ΠΎΠΆΠ΅Π½Π° Π² coverage/lcov.info.
Π’ΡΡΠ±Π²Π° Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠΡΠΊΡΠ΄Π΅ ΠΌΠΎΠ³Π° Π΄Π° Π³ΠΎ Π²Π·Π΅ΠΌΠ°? ΠΠ°ΡΠΎΠ²Π° Π½Π΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΡΠΌ Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ». ΠΠΎ ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡΠ½ΠΈ, ΡΠΎΠ΅ΡΡ Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° SRC ΠΈΠΌΠ° ΠΈΠ·Ρ
ΠΎΠ΄Π½ΠΈ ΠΊΠΎΠ΄ΠΎΠ²Π΅ Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅Π·ΠΈΠΊΠ° Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡ ΠΊΡΠΌ Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³, Π° ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ ΠΏΠ»ΡΠ³ΠΈΠ½ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅. Π ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΅Π·ΠΈΡΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, ΡΠ°ΠΊΠ° ΡΠ΅ Π²ΡΠ΅ΠΊΠΈ Π΅Π·ΠΈΠΊ ΠΈΠΌΠ° ΡΠ²ΠΎΡ ΡΠΎΠ±ΡΡΠ²Π΅Π½Π° ΡΠ΅ΠΊΡΠΈΡ Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ° Π½Π° ΡΠΎΠ²Π°. ΠΠ°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΠΏΠΈΡΠ΅ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°, ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠΌΠ°ΠΌΠ΅ Π½ΡΠΆΠ΄Π° ΠΎΡ ΡΠ°Π·Π΄Π΅Π» Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΡΠ°ΠΌΠΎ Π·Π° Π½Π΅Π³ΠΎ:
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.info
ΠΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° ΠΏΡΡΠ²ΠΎΡΠΎ ΠΏΡΡΠΊΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ°. ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π΅ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ'e ΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π·Π° Π΄Π°Π΄Π΅Π½ ΠΏΡΠΎΠ΅ΠΊΡ. Π ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡΠ΅ Π²ΡΠ΅ΠΌΠ΅Π½Π° ΡΠ΅ ΡΠ΅ Π½Π°ΡΡΡΠΏΠ²Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π·Π° Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π²ΡΠ² Π²ΡΠ΅ΠΌΠ΅ΡΠΎ.
Π ΡΠ°ΠΊΠ°, Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΏΠΎ-ΡΠ°Π½ΠΎ Π² package.json:
yarn run sonar
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΌΠΎΠΆΠ΅ΡΠ΅ ΡΡΡΠΎ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° -X Π·Π° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½Π΅.
ΠΠΊΠΎ ΡΠΊΠ΅Π½Π΅ΡΡΡ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ, ΠΏΡΡΠ²ΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΠΈΠ·ΡΠ΅Π³Π»Π΅Π½ Π΄Π²ΠΎΠΈΡΠ½ΠΈΡΡ ΡΠ°ΠΉΠ» Π½Π° ΡΠ°ΠΌΠΈΡ ΡΠΊΠ΅Π½Π΅Ρ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΡΠ°ΡΡΠΈΡΠ° ΠΈ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΡΠΊΠ°Π½ΠΈΡΠ° ΡΡΡΠ²ΡΡΠ° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ'a Π·Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°Π½ΠΈ Π΄ΠΎΠ±Π°Π²ΠΊΠΈ, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΡ Π΅Π·ΠΈΠΊ. ΠΠ°ΡΠ΅ΠΆΠ΄Π°Ρ ΡΠ΅ ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΡΡΠ³ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° ΠΌΡ: ΠΊΠ°ΡΠ΅ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈ, Π°ΠΊΡΠΈΠ²Π½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°, Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ Π½Π° ΠΌΠ΅ΡΡΠΈΠΊΠΈ, ΡΡΡΠ²ΡΡΠ½ΠΈ ΠΏΡΠ°Π²ΠΈΠ»Π°.
ΠΠ°Π±Π΅Π»Π΅ΠΆΠΊΠ°: ΠΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠΏΠΈΡΠ°ΠΌΠ΅ Π½Π° ΡΡΡ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, Π½ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΡΠ²ΡΡΠΆΠ΅ΡΠ΅ Ρ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π·Π°ΠΏΠΎΡΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΡΡ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° SRC Π·Π° Π½Π°Π»ΠΈΡΠΈΠ΅ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ (Π°ΠΊΠΎ Π½Π΅ Π΅ ΠΈΠ·ΡΠΈΡΠ½ΠΎ ΠΏΠΎΡΠΎΡΠ΅Π½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½) ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ Π΅Π·ΠΈΡΠΈ, Ρ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΎΡΠΎ ΠΈΠΌ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½Π΅.
Π‘Π»Π΅Π΄Π²Π°Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π΄ΡΡΠ³ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈ, Π²ΡΡΡ Ρ ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ°ΠΌΠ΅ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π»ΠΈΠ½ΡΠΈΠ½Π³, ΠΎΡΠΊΡΠΈΠ²Π°Π½Π΅ Π½Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄ ΠΈ Π΄Ρ.).
Π ΡΠ°ΠΌΠΈΡ ΠΊΡΠ°ΠΉ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° ΡΡΠ»Π°ΡΠ° ΡΡΠ±ΡΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΡΠ΅ ΠΎΠ±ΠΎΠ±ΡΠ°Π²Π°, Π°ΡΡ ΠΈΠ²ΠΈΡΠ° ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° Π²Π΅ΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΡΠ»ΡΡΠΈΠ»ΠΎ Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:
ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π½Π΅ΡΠΎ ΡΠ°Π±ΠΎΡΠΈ ΠΈ Π΄ΠΎΡΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° Π½ΡΠΊΠ°ΠΊΠ²ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, Π½ΠΎ Π½Π΅ ΡΡΠ²ΠΏΠ°Π΄Π° Ρ Π½Π°ΡΠ΅ΡΠΎ ΠΈΠΌΠ°- Π΄ΠΎΠΊΠ»Π°Π΄.
ΠΠ΅ΠΊΠ° Π΄Π° Π³ΠΎ ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, ΡΡΠ°ΠΊΠ½Π΅ΡΠ΅ Π²ΡΡΡ Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ ΠΈ βΠΏΡΠΎΠΏΠ°Π΄Π½Π΅ΡΠ΅β Π² ΠΏΠΎΠ΄ΡΠΎΠ±Π΅Π½ ΡΠ°ΠΉΠ»ΠΎΠ² ΠΎΡΡΠ΅Ρ:
Π’ΡΠΊ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π² Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ, ΠΏΡΠ΅Π³Π»Π΅Π΄Π°Π½ ΡΠ°ΠΉΠ» HelloWorld.vue, ΠΈΠΌΠ° ΠΈ ΡΠ°ΠΉΠ» main.ts, ΠΊΠΎΠ΅ΡΠΎ ΡΠ°Π·Π²Π°Π»Ρ ΡΡΠ»Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ. ΠΠΎ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠ° Π³ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠΈΡ ΠΌΠ΅ ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ. ΠΠ°, Π²ΡΠΈΡΠΊΠΎ Π΅ ΡΠΎΡΠ½ΠΎ, Π½ΠΎ Π±Π΅ΡΠ΅ Π½Π° Π½ΠΈΠ²ΠΎ ΠΈΠΌΠ°, Π½ΠΎ ΡΠΊΠ΅Π½Π΅ΡΡΡ Π³ΠΎ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°, ΡΠ°ΠΊΠ° ΡΠ΅ ΡΠ΅ ΠΎΠ·ΠΎΠ²Π° Π² Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ.
ΠΠ΅ΠΊΠ° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ ΡΠΎΠ²Π°:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ ΠΏΠΎΡΡΠ½Π΅Π½ΠΈΠ΅: Π² Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΠΏΠ°ΠΏΠΊΠΈΡΠ΅, ΠΊΠΎΠΈΡΠΎ ΡΠ° ΠΏΠΎΡΠΎΡΠ΅Π½ΠΈ Π² ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ ΠΈ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΏΠΊΠΈ, ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡΠ° ΡΠΎΠ½Π°Ρ.ΡΠ΅ΡΡ.Π²ΠΊΠ»ΡΡΠ²Π°Π½ΠΈΡ.
Π‘Π»Π΅Π΄ ΠΊΠ°ΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°, Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΏΡΠ°Π²ΠΈΠ»Π½Π°ΡΠ° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ:
ΠΠ΅ΠΊΠ° Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠ°ΡΠ° ΡΠΎΡΠΊΠ° - ΠΠ°ΡΠ΅ΡΡΠ²Π΅Π½ΠΈ ΠΏΡΠΎΡΠΈΠ»ΠΈ. ΠΠΎ-Π³ΠΎΡΠ΅ Π³ΠΎΠ²ΠΎΡΠΈΡ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡΠ½Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅Π·ΠΈΠΊΠ° Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. Π’ΠΎΡΠ½ΠΎ ΡΠΎΠ²Π° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅. ΠΠΎ Π·Π½Π°Π΅ΠΌ, ΡΠ΅ Π½Π°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ TS, ΡΠ°ΠΊΠ° ΡΠ΅ Π·Π°ΡΠΎ Π΄Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°ΡΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ° Ρ Π½Π΅Π½ΡΠΆΠ½ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. Π©Π΅ Π·Π°Π΄Π°Π΄Π΅ΠΌ Π΅Π·ΠΈΠΊΠ° Π·Π° Π°Π½Π°Π»ΠΈΠ·, ΠΊΠ°ΡΠΎ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ°ΠΉΠ» Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠ:
sonar-project.properties:
...
sonar.language=ts
...
ΠΠ΅ΠΊΠ° ΠΏΡΡΠ½Π΅ΠΌ ΠΎΡΠ½ΠΎΠ²ΠΎ ΡΠΊΠ΅Π½Π΅ΡΠ° ΠΈ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°:
ΠΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π±Π΅ΡΠ΅ Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΈΠ·ΡΠ΅Π·Π½Π°Π»ΠΎ.
ΠΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π΄Π½Π΅Π²Π½ΠΈΠΊΠ° Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ΅Π΄:
Π’ΠΎΠ΅ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π½Π°ΡΠΈΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π±ΡΡ Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈ.
Π‘ΠΈΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ°: ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎ ΡΠ΅ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° VueJs Π΅ Π² ΠΏΠ»ΡΠ³ΠΈΠ½Π° SonarJSΠΊΠΎΠΉ Π΅ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠ΅Π½ Π·Π° Javascript.
ΠΠΎ ΡΠ°Π·ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π΅ Π΅ Π² ΠΏΠ»ΡΠ³ΠΈΠ½Π° SonarTS Π·Π° TS, Π·Π° ΠΊΠΎΠ΅ΡΠΎ Π±Π΅ΡΠ΅ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΎΡΠΈΡΠΈΠ°Π»Π΅Π½ Π±ΠΈΠ»Π΅Ρ Π² ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π·Π° ΠΏΡΠΎΡΠ»Π΅Π΄ΡΠ²Π°Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠ:
ΠΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° SonarQube, ΠΏΠΎΡΠ²ΡΡΠΆΠ΄Π°Π²Π°ΡΠΈ ΡΠΎΠ·ΠΈ ΡΠ°ΠΊΡ.
ΠΠΎ Π²ΡΠΈΡΠΊΠΎ Π½ΠΈ ΡΠ΅ ΠΏΠΎΠ»ΡΡΠΈ, Π²ΡΠ·ΡΠ°Π·ΡΠ²Π°ΡΠ΅ Π²ΠΈΠ΅. ΠΠ°, ΡΠ°ΠΊΠ° Π΅, Π½Π΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ ΠΌΠ°Π»ΠΊΠΎ βΡ
Π°ΠΊβ.
ΠΠΊΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ΄ΠΊΡΠ΅ΠΏΠ° .vue-ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠ, ΡΠΎΠ³Π°Π²Π° Π½Π΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΌΡ ΠΊΠ°ΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ ΡΠΌΡΡΠ° Π·Π° Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΠΏΠΈΡΠ΅ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
ΠΠ΅ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...
ΠΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:
Π, Π³ΠΎΡΠΎΠ²ΠΎ, Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ Π²ΡΡΡΠ° ΠΊΡΠΌ Π½ΠΎΡΠΌΠ°Π»Π½ΠΎΡΠΎ ΠΈ ΡΠ°ΠΌΠΎ Ρ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΠΈΠ» Π·Π° Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΠΏΠΈΡΠ΅ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°. Π’ΠΎΠ΅ΡΡ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Π² ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° VueJs+TS Π·Π° soundQube.
ΠΠ΅ΠΊΠ° ΡΠ΅ ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΠΌ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ ΠΈ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ ΠΌΠ°Π»ΠΊΠΎ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ.
ΠΠ°ΠΊΠ²ΠΎ ΡΠΌΠ΅ Π½Π°ΠΏΡΠ°Π²ΠΈΠ»ΠΈ Π΄ΠΎΡΠ΅Π³Π°:
- Π΄ΠΎΠ±Π°Π²Π΅Π½ΠΈ ΠΊΡΠΌ ΠΏΡΠΎΠ΅ΠΊΡΠ° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ-ΡΠΊΠ΅Π½Π΅Ρ;
- Π½Π°ΡΡΡΠΎΠΉΠ²Π°ΠΌ ΠΈΠΌΠ° Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅;
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Π½ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ-ΡΠΊΠ΅Π½Π΅Ρ;
- ΡΠ΅ΡΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° .vue-ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ + Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° ΠΏΠΈΡΠ΅ΡΠ° ΠΌΠ°ΡΠΈΠ½Π°.
Π Π΄ΠΎΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ ΠΊΡΠΌ ΡΠ΅ΡΡΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΈΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄Π° ΠΈ Π±ΡΠΎΡ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ (Π²ΠΊΠ»ΡΡΠ΅Π½ΠΈ Π² ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½ΡΠΈΡΠ΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π°) Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ TS (SonarTS) Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ CPD (Π΄Π΅ΡΠ΅ΠΊΡΠΎΡ Π·Π° ΠΊΠΎΠΏΠΈΡΠ°Π½Π΅ ΠΈ ΠΏΠΎΡΡΠ°Π²ΡΠ½Π΅) ΠΈ Π±ΡΠΎΠ΅Π½Π΅ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄ .vue-ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΡΠ΅ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ Π½Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄, ΠΏΡΠΎΡΡΠΎ Π΄ΡΠ±Π»ΠΈΡΠ°ΠΉΡΠ΅ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ½ΠΈΡ ΡΠ°ΠΉΠ» Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΈΠΌΠ΅ ΠΈ ΡΡΡΠΎ Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΊΡΠΌ ΠΊΠΎΠ΄Π° main.ts ΡΠΈΠΊΡΠΈΠ²Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Ρ Π΄ΡΠ±Π»ΠΈΡΠ°ΠΉΡΠ΅ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΈΠΌΠ΅. ΠΠ° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΡΠ΅ Π·Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅, ΠΊΠ°ΠΊΡΠΎ Π² .vue, ΠΈ Π² .ts -ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
main.ts:
...
function name(params:string): void {
console.log(params);
}
...
ΠΠ° Π΄Π° Π½Π°ΠΏΡΠ°Π²ΠΈΡΠ΅ ΡΠΎΠ²Π°, ΡΡΡΠ±Π²Π° Π²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ Π΄Π° ΠΊΠΎΠΌΠ΅Π½ΡΠΈΡΠ°ΡΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΡΠ΅Π΄:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
ΠΠ΅ΠΊΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ° Π·Π°Π΅Π΄Π½ΠΎ Ρ ΡΠ΅ΡΡΠ²Π°Π½Π΅ΡΠΎ:
yarn test && yarn run sonar
Π Π°Π·Π±ΠΈΡΠ° ΡΠ΅, ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π½ΠΈ ΡΠ΅ ΠΏΠ°Π΄Π½Π΅, Π½ΠΎ ΡΠ΅Π³Π° ΡΠΎΠ²Π° Π½Π΅ Π½ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΡΠ²Π°.
ΠΠΎ ΠΎΡΠ½ΠΎΡΠ΅Π½ΠΈΠ΅ Π½Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄, ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ:
ΠΠ° ΠΏΡΠΎΠ²Π΅ΡΠΊΠ° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ CPD-ΠΏΠΎΠ»Π΅Π·Π½ΠΎΡΡ β jscpd:
npx jscpd src
ΠΠ° ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄:
ΠΠΎΠΆΠ΅ Π±ΠΈ ΡΠΎΠ²Π° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΠ΅ΡΠ΅Π½ΠΎ Π² Π±ΡΠ΄Π΅ΡΠΈ Π²Π΅ΡΡΠΈΠΈ Π½Π° ΠΏΡΠΈΡΡΠ°Π²ΠΊΠΈ SonarJS(TS). ΠΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ ΡΠ΅ ΠΏΠΎΡΡΠ΅ΠΏΠ΅Π½Π½ΠΎ Π·Π°ΠΏΠΎΡΠ²Π°Ρ Π΄Π° ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π°Ρ ΡΠ΅Π·ΠΈ Π΄Π²Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π² Π΅Π΄ΠΈΠ½ SonarJS, ΠΊΠΎΠ΅ΡΠΎ ΡΠΏΠΎΡΠ΅Π΄ ΠΌΠ΅Π½ Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ.
Π‘Π΅Π³Π° ΠΈΡΠΊΠ°Ρ Π΄Π° ΠΎΠ±ΠΌΠΈΡΠ»Ρ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΡΠ° Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΡΠ²Π°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ.
ΠΠΎΡΠ΅Π³Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ΅ΡΡΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠΈ Π·Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ ΠΏΠΎ-ΡΠΏΠ΅ΡΠΈΠ°Π»Π½ΠΎ Π·Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅. ΠΠΎ Π΅ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ ΡΠΎΠ·ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π» Π΄Π° ΡΠ΅ ΡΠ°Π·ΡΠΈΡΠΈ Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π΅Π΄ΠΈΠ½ΠΈΡΠ°-ΡΠ΅ΡΡΠΎΠ²Π΅ Π·Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ ΠΈΠΌΠ°-ΠΏΡΠ΅ΠΎΠ±ΡΠ°Π·ΡΠ²Π°Π½Π΅ Π½Π° ΠΎΡΡΠ΅ΡΠ° Π²ΡΠ² ΡΠΎΡΠΌΠ°Ρ Π·Π° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠ:
ΠΎΠ±ΡΠΈ ΡΠ΅ΡΡΠΎΠ²ΠΈ Π΄Π°Π½Π½ΠΈ -
ΠΠ΅ΠΊΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π² Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ:
yarn add jest-sonar-reporter
Π Π³ΠΎ Π΄ΠΎΠ±Π°Π²Π΅ΡΠ΅ ΠΊΡΠΌ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° ΠΈΠΌΠ°:
package.json:
β¦
"testResultsProcessor": "jest-sonar-reporter"
β¦
Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ΅ΡΡΠ°:
yarn test
Π‘Π»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΡΠ°ΠΉΠ» Π² ΠΊΠΎΡΠ΅Π½Π° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° test-report.xml.
ΠΠ΅ΠΊΠ° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠ:
sonar-project.properties:
β¦
sonar.testExecutionReportPaths=test-report.xml
β¦
Π ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΉΡΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:
yarn run sonar
ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡβΠ:
Π Π½ΠΈΡΠΎ Π½Π΅ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ. Π€Π°ΠΊΡ Π΅, ΡΠ΅ Sonar Π½Π΅ ΡΡΠΈΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅, ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² Π΄ΠΎΠΊΠ»Π°Π΄Π° Π½Π° Jest, Π·Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ°-ΡΠ΅ΡΡΠΎΠ²Π΅. ΠΠ° Π΄Π° ΠΊΠΎΡΠΈΠ³ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ°ΡΠΈΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π₯ΠΈΠ΄ΡΠΎΠ»ΠΎΠΊΠ°ΡΠΎΡ ΡΠΎΠ½Π°Ρ.ΡΠ΅ΡΡΠΎΠ²Π΅, Π² ΠΊΠΎΠΉΡΠΎ ΠΈΠ·ΡΠΈΡΠ½ΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΏΠ°ΠΏΠΊΠΈΡΠ΅ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅ (Π·Π°ΡΠ΅Π³Π° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π°):
sonar-project.properties:
β¦
sonar.tests=src/components/__tests__
β¦
ΠΠ΅ΠΊΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:
yarn run sonar
ΠΠ΅ΠΊΠ° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:
Π‘Π΅Π³Π° Π²ΠΈΠ΄ΡΡ ΠΌΠ΅ Π±ΡΠΎΡ Π½Π° Π½Π°ΡΠΈΡΠ΅ Π΅Π΄ΠΈΠ½ΠΈΡΠ°-ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ ΡΠ»Π΅Π΄ Π½Π΅ΡΡΠΏΠ΅ΡΠ½ΠΎ ΡΡΠ°ΠΊΠ²Π°Π½Π΅ Π²ΡΡΡΠ΅ ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ²Π° ΡΠΈΡΠ»ΠΎ ΠΌΠ΅ΠΆΠ΄Ρ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:
ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ°ΠΊΠ°, ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½Ρ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°Ρ Π°Π½Π°Π»ΠΈΠ· soundQube. Π£ΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Ρ ΠΌΠ΅ Π² Π½Π΅Π³ΠΎ ΠΏΡΠΎΠ΅ΠΊΡ, Π½Π°ΠΏΠΈΡΠ°Π½ Π² VueJs+TS. ΠΠΎΠΏΡΠ°Π²Π΅Π½ΠΈ ΡΠ° Π½ΡΠΊΠΎΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ ΡΡΡ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ°. Π£Π²Π΅Π»ΠΈΡΠΈΡ ΠΌΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½ΠΎΡΠΎ ΡΡΠ΄ΡΡΠΆΠ°Π½ΠΈΠ΅ Π½Π° ΠΈΠ½Π΄ΠΈΠΊΠ°ΡΠΎΡΠ° Π·Π° ΡΠ΅ΡΡΠΎΠ²ΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈΡΠ΅ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠ΄Π° (ΠΌΠΎΠΆΠ΅ Π±ΠΈ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅), Π½ΠΎ soundQube ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° Π΄ΡΡΠ³ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ΡΡΠΎΠ²Π΅ Π·Π° Π±Π΅Π·ΠΎΠΏΠ°ΡΠ½ΠΎΡΡ. ΠΠΎ Π½Π΅ Π²ΡΠΈΡΠΊΠΈ ΠΎΡ ΡΠ΅Π·ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ ΡΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ Π½Π°Π»ΠΈΡΠ½ΠΈ Π² ΠΎΠ±ΡΠ½ΠΎΡΡ - Π²Π΅ΡΡΠΈΠΈ. ΠΠ΄Π½Π° ΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° soundQube Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ° Π·Π° ΠΊΠΎΠ΄ΠΎΠ²Π΅, ΠΊΠ°ΡΠΎ GitLab ΠΈ BitBucket. ΠΠ° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΡΠ²Π°Π½Π΅ Π·Π°ΡΠ²ΠΊΠ° Π·Π° ΠΈΠ·ΡΠ΅Π³Π»ΡΠ½Π΅ (ΡΠ»ΠΈΠ²Π°Π½Π΅) Π½Π° ΡΠ»ΠΈΠ²Π°Π½Π΅'a ΠΊΡΠΌ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ ΠΊΠ»ΠΎΠ½ Π½Π° Ρ ΡΠ°Π½ΠΈΠ»ΠΈΡΠ΅ΡΠΎ, ΠΊΠΎΠ³Π°ΡΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ Π΅ Π²Π»ΠΎΡΠ΅Π½ΠΎ. ΠΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΡΡΠΎΡΠΈΡ Π·Π° ΡΡΠ²ΡΠ΅ΠΌ ΡΠ°Π·Π»ΠΈΡΠ½Π° ΡΡΠ°ΡΠΈΡ.
PS: ΠΡΠΈΡΠΊΠΎ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΊΠΎΠ΄ Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π²
Π Π°Π½ΠΊΠ΅ΡΠ°ΡΠ° ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ°ΡΡΠ²Π°Ρ ΡΠ°ΠΌΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π»ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° SonarQube:
-
26,3%Π΄Π° 5
-
15,8%No3
-
15,8%Π§ΡΡ Π·Π° ΡΠ°Π·ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΈ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ3
-
10,5%Π§ΡΠ²Π°Π» ΡΡΠΌ Π·Π° ΡΠ°Π·ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΈ Π½Π΅ ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ2
-
0,0%ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ ΡΠ°Π·Π»ΠΈΡΠ½Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°0
-
31,6%ΠΠ° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ ΡΡΠ²Π°ΠΌ Π·Π° Π½Π΅Ρ6
19 ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π³Π»Π°ΡΡΠ²Π°Ρ
Π°. 3 ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΡΠ΅ Π²ΡΠ·Π΄ΡΡΠΆΠ°Ρ
Π°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: www.habr.com