Π Π½Π°ΡΠ°ΡΠ° ΡΠ°Π±ΠΎΡΠ° Π°ΠΊΡΠΈΠ²Π½ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° SonarQube Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ΄Π° Π½Π° Π²ΠΈΡΠΎΠΊΠΎ Π½ΠΈΠ²ΠΎ. ΠΡΠΈ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° VueJs+Typescript, Π²ΡΠ·Π½ΠΈΠΊΠ½Π°Ρ Π° ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ. ΠΠ°ΡΠΎΠ²Π° Π±ΠΈΡ ΠΈΡΠΊΠ°Π» Π΄Π° ΡΠ°Π·ΠΊΠ°ΠΆΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ ΠΊΠ°ΠΊ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° Π³ΠΈ ΡΠ΅ΡΠΈΠΌ.

Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ΅ ΡΡΠ°Π½Π΅ Π΄ΡΠΌΠ°, ΠΊΠ°ΠΊΡΠΎ ΡΠΏΠΎΠΌΠ΅Π½Π°Ρ ΠΏΠΎ-Π³ΠΎΡΠ΅, Π·Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° SonarQube. ΠΠ°Π»ΠΊΠΎ ΡΠ΅ΠΎΡΠΈΡ β ΠΊΠ°ΠΊΠ²ΠΎ ΠΏΡΠ΅Π΄ΡΡΠ°Π²Π»ΡΠ²Π° Π²ΡΡΡΠ½ΠΎΡΡ Π·Π° ΡΠ΅Π·ΠΈ, ΠΊΠΎΠΈΡΠΎ Ρ ΡΡΠ²Π°Ρ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ:
SonarQube (Π±ΠΈΠ²Ρ Sonar) β ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° Ρ ΠΎΡΠ²ΠΎΡΠ΅Π½ ΠΊΠΎΠ΄ Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°Ρ Π°Π½Π°Π»ΠΈΠ· (Π°Π½Π³Π». continuous inspection) ΠΈ ΠΈΠ·ΠΌΠ΅ΡΠ²Π°Π½Π΅ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΠΊΠΎΠ΄Π°.
ΠΠΎΠ΄Π΄ΡΡΠΆΠ° Π°Π½Π°Π»ΠΈΠ· Π½Π° ΠΊΠΎΠ΄Π° ΠΈ ΡΡΡΡΠ΅Π½Π΅ Π½Π° Π³ΡΠ΅ΡΠΊΠΈ ΡΡΠ³Π»Π°ΡΠ½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π°ΡΠ° Π½Π° ΡΡΠ°Π½Π΄Π°ΡΡΠΈΡΠ΅ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ MISRA C, MISRA C++, MITRE/CWE ΠΈ CERT Secure Coding Standards. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ°Π·ΠΏΠΎΠ·Π½Π°Π²Π° Π³ΡΠ΅ΡΠΊΠΈ ΠΎΡ ΡΠΏΠΈΡΡΡΠΈΡΠ΅ OWASP Π’ΠΎΠΏ-10 ΠΈ CWE/SANS Π’ΠΎΠΏ-25 Π³ΡΠ΅ΡΠΊΠΈ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ΡΠΎ.
ΠΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π³ΠΎΡΠΎΠ²ΠΈ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠΈ, SonarQube ΠΎΠ±Π΅Π΄ΠΈΠ½ΡΠ²Π° ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠΈΡΠ΅ Π² Π΅Π΄ΠΈΠ½Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠΎΠ½Π½Π° ΡΠ°Π±Π»Π° (Π°Π½Π³Π». dashboard), Π²ΠΎΠ΄Π΅ΠΉΠΊΠΈ ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ³ΠΎΠ½ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π°ΠΉΠΊΠΈ Π΄Π° ΡΠ΅ Π²ΠΈΠ΄ΠΈ ΠΎΠ±ΡΠ°ΡΠ° ΡΠ΅Π½Π΄Π΅Π½ΡΠΈΡ Π² ΠΈΠ·ΠΌΠ΅Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎΡΠΎ Π½Π° ΡΠΎΡΡΡΠ΅ΡΠ° ΠΏΠΎ Π²ΡΠ΅ΠΌΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΠΊΠ°ΡΠ°.
ΠΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ Π½Π°ΠΌΠ΅ΡΠΈ Π½Π°
ΠΠΎΠ΄Π΄ΡΡΠΆΠ° Π³ΠΎΠ»ΡΠΌ Π±ΡΠΎΠΉ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ. Π‘ΠΏΠΎΡΠ΅Π΄ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° ΠΎΡ Π³ΠΎΡΠ½Π°ΡΠ° Π²ΡΡΠ·ΠΊΠ° β ΡΠΎΠ²Π° ΡΠ° ΠΏΠΎΠ²Π΅ΡΠ΅ ΠΎΡ 25 Π΅Π·ΠΈΠΊΠ°. ΠΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½ Π΅Π·ΠΈΠΊ Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° ΡΠ΅ ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ° ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΈΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½. Π ΠΎΠ±ΡΠ½ΠΎΡΡΡΠ° Π²Π΅ΡΡΠΈΡ Π²ΠΊΠ»ΡΡΠ²Π° ΠΏΠ»ΡΠ³ΠΈΠ½ Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ ΠΠ°ΡΠΈΡΡ DevOps ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΠΎΡΡΠΈ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. ΠΠΎΠ±ΡΠ° ΡΠ°Π±ΠΎΡΠ°! (Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ typesΡript), Π²ΡΠΏΡΠ΅ΠΊΠΈ ΡΠ΅ Π² wiki Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ΠΎ ΠΎΠ±ΡΠ°ΡΠ½ΠΎΡΠΎ. ΠΠ° ΠΠ°ΡΠΈΡΡ DevOps ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΠΎΡΡΠΈ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. ΠΠΎΠ±ΡΠ° ΡΠ°Π±ΠΎΡΠ°! ΠΎΡΠ³ΠΎΠ²Π°ΡΡ ΠΏΠ»ΡΠ³ΠΈΠ½ΡΡ SonarJS, Π·Π° Typescript SonarTS ΡΡΠΎΡΠ²Π΅ΡΠ½ΠΎ.
ΠΠ° ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡΡ ΠΊΠ»ΠΈΠ΅Π½Ρ sonarqube-scanner, ΠΊΠΎΠΉΡΠΎ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΉΠΊΠΈ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΠΎΡ config-ΡΠ°ΠΉΠ»Π°, ΠΈΠ·ΠΏΡΠ°ΡΠ° ΡΠ΅Π·ΠΈ Π΄Π°Π½Π½ΠΈ Π½Π° ΡΡΡΠ²Π΅ΡΠ° SonarQube Π·Π° ΠΏΠΎ-Π½Π°ΡΠ°ΡΡΡΠ½Π° ΠΊΠΎΠ½ΡΠΎΠ»ΠΈΠ΄Π°ΡΠΈΡ ΠΈ Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅.
ΠΠ° ΠΠ°ΡΠΈΡΡ DevOps ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΠΎΡΡΠΈ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. ΠΠΎΠ±ΡΠ° ΡΠ°Π±ΠΎΡΠ°! ΠΈΠΌΠ° . Π ΡΠ°ΠΊΠ°, Π·Π°ΠΏΠΎΡΠ²Π°ΠΌΠ΅ ΡΡΡΠΏΠΊΠ° ΠΏΠΎ ΡΡΡΠΏΠΊΠ° Π²Π½Π΅Π΄ΡΡΠ²Π°Π½Π΅ SonarQube Π² Vue-ΠΏΡΠΎΠ΅ΠΊΡ, ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Ρ Typescript.
ΠΠ° ΡΠ°Π·Π³ΡΡΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ° SonarQube ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ docker-compose.
sonar.yaml:
version: '1'
services:
simplesample-sonar:
image: sonarqube:lts
ports:
- 9001:9000
- 9092:9092
network_mode: bridgeΠ‘ΡΠ°ΡΡΠΈΡΠ°Π½Π΅:
docker-compose -f sonar.yml upΠ‘Π»Π΅Π΄ ΡΠΎΠ²Π° SonarQube ΡΠ΅ Π΅ Π΄ΠΎΡΡΡΠΏΠ΅Π½ Π½Π° Π°Π΄ΡΠ΅Ρ β .

ΠΠ°ΡΠ΅Π³Π° Π² Π½Π΅Π³ΠΎ Π½ΡΠΌΠ° ΠΏΡΠΎΠ΅ΠΊΡΠΈ ΠΈ ΡΠΎΠ²Π° Π΅ ΡΠΏΡΠ°Π²Π΅Π΄Π»ΠΈΠ²ΠΎ. Π©Π΅ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ°ΡΠΈΡ. ΠΠ° ΠΎΡΠ½ΠΎΠ²Π° Π²Π·Π΅Ρ
ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ-ΠΏΡΠΈΠΌΠ΅Ρ Π·Π° VueJS+TS+Jest. Π©Π΅ Π³ΠΎ ΠΊΠ»ΠΎΠ½ΠΈΡΠ°ΠΌΠ΅ Π½Π° Π½Π°ΡΠΈΡ ΠΊΠΎΠΌΠΏΡΡΡΡ:
git clone https://github.com/vuejs/vue-test-utils-typescript-example.gitΠΡΡΠ²ΠΎ ΡΡΡΠ±Π²Π° Π΄Π° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΠΊΠ»ΠΈΠ΅Π½ΡΠ° SonarQube, ΠΊΠΎΠΉΡΠΎ ΡΠ΅ Π½Π°ΡΠΈΡΠ° sonar-scanner, Π·Π° npm ΠΈΠΌΠ° ΠΎΠ±Π²ΠΈΠ²ΠΊΠ°:
yarn add sonarqube-scannerΠ Π²Π΅Π΄Π½Π°Π³Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΊΠΎΠΌΠ°Π½Π΄Π° Π² scripts Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ Π½Π΅Π³ΠΎ.
package.json:
{
β¦
scripts: {
...
"sonar": "sonar-scanner"
...
},
β¦
}Π‘Π»Π΅Π΄Π²Π°, Π·Π° Π΄Π° ΡΡΠ½ΠΊΡΠΈΠΎΠ½ΠΈΡΠ° ΡΠΊΠ΅Π½Π΅ΡΠ°, Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π·Π°Π΄Π°Π΄Π΅ΡΠ΅ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π² ΡΠΏΠ΅ΡΠΈΠ°Π»Π΅Π½ ΡΠ°ΠΉΠ». ΠΠ΅ΠΊΠ° Π·Π°ΠΏΠΎΡΠ½Π΅ΠΌ Ρ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅.
sonar-project.properties:
sonar.host.url=http://localhost:9001
sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Π’Π΅ΡΡΠΎΠ²ΠΎ ΠΡΠΈΠ»ΠΎΠΆΠ΅Π½ΠΈΠ΅ (VueJS+TS)
sonar.sources=src
# sonar.tests=
sonar.test.inclusions=src/**/*tests*/**
sonar.sourceEncoding=UTF-8- sonar.host.url β Π°Π΄ΡΠ΅Ρ SonarβΠ°;
- sonar.projectKey β ΡΠ½ΠΈΠΊΠ°Π»Π΅Π½ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΎΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Π½Π° ΡΡΡΠ²ΡΡΠ° SonarβΠ°;
- sonar.projectName β Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ Π½Π°Π·Π²Π°Π½ΠΈΠ΅, ΡΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π±ΡΠ΄Π΅ ΠΏΡΠΎΠΌΠ΅Π½Π΅Π½ΠΎ ΠΏΠΎ Π²ΡΡΠΊΠΎ Π²ΡΠ΅ΠΌΠ΅, ΡΡΠΉ ΠΊΠ°ΡΠΎ ΠΈΠ΄Π΅Π½ΡΠΈΡΠΈΠΊΠ°ΡΠΈΡΡΠ° Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° ΠΏΠΎ projectKey;
- sonar.sources β ΠΏΠ°ΠΏΠΊΠ° Ρ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄, ΠΎΠ±ΠΈΠΊΠ½ΠΎΠ²Π΅Π½ΠΎ ΡΠΎΠ²Π° Π΅ src, Π½ΠΎ ΠΌΠΎΠΆΠ΅ Π΄Π° Π΅ Π²ΡΡΠΊΠ°ΠΊΠ²Π°. Π’Π°Π·ΠΈ ΠΏΠ°ΠΏΠΊΠ° ΡΠ΅ Π·Π°Π΄Π°Π²Π° ΡΠΏΡΡΠΌΠΎ ΠΊΠΎΡΠ΅Π½ΠΎΠ²Π°ΡΠ° ΠΏΠ°ΠΏΠΊΠ°, ΠΊΠΎΡΡΠΎ Π΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, ΠΎΡ ΠΊΠΎΡΡΠΎ Π΅ ΡΡΠ°ΡΡΠΈΡΠ°Π½ ΡΠΊΠ΅Π½Π΅ΡΡΡ;
- sonar.tests β ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΠΊΠΎΠΉΡΠΎ Π²ΡΡΠ²ΠΈ Π² ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ Ρ ΠΏΡΠ΅Π΄ΠΈΡΠ½ΠΈΡ. Π’ΠΎΠ²Π° Π΅ ΠΏΠ°ΠΏΠΊΠ°ΡΠ°, Π² ΠΊΠΎΡΡΠΎ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ Π½ΡΠΌΠ° ΡΠ°ΠΊΠ°Π²Π° ΠΏΠ°ΠΏΠΊΠ°, Π° ΡΠ΅ΡΡΡΡ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ° Π΄ΠΎ ΡΠ΅ΡΡΠ²Π°Π½ΠΈΡ ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ Π² ΠΏΠ°ΠΏΠΊΠ° βtestβ, Π·Π°ΡΠΎΠ²Π° Π·Π°ΡΠ΅Π³Π° ΡΠ΅ Π³ΠΎ ΠΈΠ³Π½ΠΎΡΠΈΡΠ°ΠΌΠ΅ ΠΈ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π½ΠΈΡ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ;
- sonar.test.inclusions β ΠΏΡΡ Π·Π° ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ Π½Π° ΠΌΠ°ΡΠΊΠ°, ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅Π»Π΅ΠΌΠ΅Π½ΡΠ°, ΡΠ°Π·Π΄Π΅Π»Π΅Π½ΠΈ ΡΡΡ Π·Π°ΠΏΠ΅ΡΠ°Ρ;
- sonar.sourceEncoding β ΠΊΠΎΠ΄ΠΈΡΠΎΠ²ΠΊΠ° Π·Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡΠ΅ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ° ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π²ΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ, ΠΎΡΠ²Π΅Π½ ΠΎΡΠ½ΠΎΠ²Π½ΠΎΡΠΎ ΠΏΡΠ΅Π΄Π²Π°ΡΠΈΡΠ΅Π»Π½ΠΎ Π΄Π΅ΠΉΡΡΠ²ΠΈΠ΅: ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°ΠΌΠΈΡ ΡΠ΅ΡΡΠΎΠ² Π΄Π²ΠΈΠ³Π°ΡΠ΅Π», Π·Π° Π΄Π° ΡΡΡΡΠ°Π²ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, ΠΊΠΎΡΡΠΎ Π²ΠΏΠΎΡΠ»Π΅Π΄ΡΡΠ²ΠΈΠ΅ ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΡΠΊΠ΅Π½Π΅ΡΡΡ.
ΠΠΎ Π·Π° ΡΠΎΠ²Π° Π΅ Π½Π΅ΠΎΠ±Ρ ΠΎΠ΄ΠΈΠΌΠΎ Π΄Π° Π½Π°ΡΡΡΠΎΠΈΡΠ΅ ΡΠ΅ΡΡΠΎΠ²ΠΈΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠ°Π·ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ. Π ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ ΡΠ΅ΡΡΠΎΠ²ΠΈΡΡ Π΄Π²ΠΈΠ³Π°ΡΠ΅Π» β ΡΠΎΠ²Π° Π΅ Jest. Π Π½Π°ΡΡΡΠΎΠΉΠΊΠΈΡΠ΅ ΠΌΡ ΡΠ΅ Π½Π°ΠΌΠΈΡΠ°Ρ Π² ΡΡΠΎΡΠ²Π΅ΡΠ½Π°ΡΠ° ΡΠ°ΡΡ Π½Π° ΡΠ°ΠΉΠ»Π° 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 extension).
Gcov β ΡΠ²ΠΎΠ±ΠΎΠ΄Π½ΠΎ ΡΠ°Π·ΠΏΡΠΎΡΡΡΠ°Π½ΡΠ΅ΠΌΠ° ΡΡΠΈΠ»ΠΈΡΠ° Π·Π° ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½Π΅ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄Π°. Gcov Π³Π΅Π½Π΅ΡΠΈΡΠ° ΡΠΎΡΠ½ΠΎΡΠΎ ΠΊΠΎΠ»ΠΈΡΠ΅ΡΡΠ²ΠΎ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΡ Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΎΠΏΠ΅ΡΠ°ΡΠΎΡ Π² ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ°ΡΠ° ΠΈ ΠΏΠΎΠ·Π²ΠΎΠ»ΡΠ²Π° Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° Π°Π½ΠΎΡΠ°ΡΠΈΠΈ ΠΊΡΠΌ ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈΡ ΠΊΠΎΠ΄. Gcov ΡΠ΅ ΠΏΡΠ΅Π΄Π»Π°Π³Π° ΠΊΠ°ΡΠΎ ΡΡΠ°Π½Π΄Π°ΡΡΠ½Π° ΡΡΠΈΠ»ΠΈΡΠ° Π² ΠΏΠ°ΠΊΠ΅ΡΠ° GCC.
Lcov β Π³ΡΠ°ΡΠΈΡΠ΅Π½ ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡ Π·Π° gcov. Π’ΠΎΠΉ ΡΡΠ±ΠΈΡΠ° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ gcov Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΡΠ°ΠΉΠ»Π° Ρ ΠΈΠ·Ρ ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ ΠΈ ΡΡΠ·Π΄Π°Π²Π° ΠΊΠΎΠΌΠΏΠ»Π΅ΠΊΡ HTML ΡΡΡΠ°Π½ΠΈΡΠΈ Ρ ΠΊΠΎΠ΄Π° ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅. ΠΠ΅Π½Π΅ΡΠΈΡΠ°Ρ ΡΠ΅ ΠΈ ΡΡΡΠ°Π½ΠΈΡΠΈ Π·Π° ΡΠ»Π΅ΡΠ½ΡΠ²Π°Π½Π΅ Π½Π° Π½Π°Π²ΠΈΠ³Π°ΡΠΈΡΡΠ°. Lcov ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅, ΡΡΠ½ΠΊΡΠΈΠΈ ΠΈ ΡΠ°Π·ΠΊΠ»ΠΎΠ½Π΅Π½ΠΈΡ.
Π‘Π»Π΅Π΄ ΠΈΠ·ΠΏΡΠ»Π½Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΡΠ΅ Π±ΡΠ΄Π΅ Π² coverage/lcov.info.
Π’ΡΡΠ±Π²Π° Π΄Π° ΠΊΠ°ΠΆΠ΅ΠΌ SonarΠΎΡΠΊΡΠ΄Π΅ Π΄Π° Ρ Π²Π·Π΅ΠΌΠ΅ΠΌ. ΠΠ°ΡΠΎΠ²Π° ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡΠ΅ ΡΠ΅Π΄ΠΎΠ²Π΅ Π² Π½Π΅Π³ΠΎΠ²ΠΈΡ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΡΠ°ΠΉΠ». ΠΠΎ ΠΈΠΌΠ° Π΅Π΄ΠΈΠ½ ΠΌΠΎΠΌΠ΅Π½Ρ: ΠΏΡΠΎΠ΅ΠΊΡΠΈΡΠ΅ ΠΌΠΎΠ³Π°Ρ Π΄Π° Π±ΡΠ΄Π°Ρ ΠΌΠ½ΠΎΠ³ΠΎΠ΅Π·ΠΈΡΠ½ΠΈ, Ρ.Π΅. Π² ΠΏΠ°ΠΏΠΊΠ°ΡΠ° src ΠΈΠΌΠ° ΠΈΠ·Ρ
ΠΎΠ΄Π΅Π½ ΠΊΠΎΠ΄ Π·Π° Π½ΡΠΊΠΎΠ»ΠΊΠΎ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΠΊΠ° ΠΈ ΠΏΡΠΈΠ½Π°Π΄Π»Π΅ΠΆΠ½ΠΎΡΡΡΠ° ΠΊΡΠΌ Π΄Π°Π΄Π΅Π½ ΠΈΠ»ΠΈ Π΄ΡΡΠ³ Π΅Π·ΠΈΠΊ, Π° ΠΎΡ ΡΠ²ΠΎΡ ΡΡΡΠ°Π½Π° ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°Π½Π΅ΡΠΎ Π½Π° Π΄Π°Π΄Π΅Π½ ΠΏΠ»ΡΠ³ΠΈΠ½ ΡΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Ρ ΠΎΡ Π½Π΅Π³ΠΎΠ²ΠΎΡΠΎ ΡΠ°Π·ΡΠΈΡΠ΅Π½ΠΈΠ΅. ΠΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΌΠΎΠΆΠ΅ Π΄Π° ΡΠ΅ ΡΡΡ
ΡΠ°Π½ΡΠ²Π° Π½Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΌΠ΅ΡΡΠ° Π·Π° ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΡΠΎΠ³ΡΠ°ΠΌΠ½ΠΈ Π΅Π·ΠΈΡΠΈ, Π·Π°ΡΠΎΠ²Π° Π·Π° Π²ΡΠ΅ΠΊΠΈ ΠΠ ΠΈΠΌΠ° ΡΠ²ΠΎΠΉ ΡΠ°Π·Π΄Π΅Π» Π·Π° Π½Π°ΡΡΡΠΎΠΉΠΊΠ°. ΠΠ°ΡΠΈΡΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° Typescript, ΡΠ»Π΅Π΄ΠΎΠ²Π°ΡΠ΅Π»Π½ΠΎ Π½ΠΈ Π΅ Π½Π΅ΠΎΠ±Ρ
ΠΎΠ΄ΠΈΠΌ ΡΠ°Π·Π΄Π΅Π» Ρ Π½Π°ΡΡΡΠΎΠΉΠΊΠΈ ΠΈΠΌΠ΅Π½Π½ΠΎ Π·Π° Π½Π΅Π³ΠΎ:
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.infoΠΡΠΈΡΠΊΠΎ Π΅ Π³ΠΎΡΠΎΠ²ΠΎ Π·Π° ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ°. ΠΡΠΊΠ°ΠΌ Π΄Π° ΠΎΡΠ±Π΅Π»Π΅ΠΆΠ°, ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π² SonarΡΠ΅ ΡΡΠ·Π΄Π°Π²Π° Π°Π²ΡΠΎΠΌΠ°ΡΠΈΡΠ½ΠΎ ΠΏΡΠΈ ΠΏΡΡΠ²ΠΎΡΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π·Π° ΡΠΎΠ·ΠΈ ΠΏΡΠΎΠ΅ΠΊΡ. ΠΡΠΈ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠΈ ΡΠ»ΡΡΠ°ΠΈ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π²Π΅ΡΠ΅ ΡΠ΅ ΡΠ΅ Π½Π°ΡΡΡΠΏΠ²Π°, Π·Π° Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ Π΄ΠΈΠ½Π°ΠΌΠΈΠΊΠ°ΡΠ° Π½Π° ΠΏΡΠΎΠΌΠ΅Π½ΠΈΡΠ΅ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° Ρ Π²ΡΠ΅ΠΌΠ΅ΡΠΎ.
Π ΡΠ°ΠΊΠ°, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠΌΠ°Π½Π΄Π°ΡΠ°, ΡΡΠ·Π΄Π°Π΄Π΅Π½Π° ΠΏΠΎ-ΡΠ°Π½ΠΎ Π² package.json:
yarn run sonar ΠΠ΅Π»Π΅ΠΆΠΊΠ°: ΠΌΠΎΠΆΠ΅ ΡΡΡΠΎ Π΄Π° ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π° ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ -X Π·Π° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π»ΠΎΠ³Π²Π°Π½Π΅.
ΠΠΊΠΎ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π΅ Π±ΠΈΠ»ΠΎ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ, ΠΏΡΡΠ²ΠΎ ΡΠ΅ ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΠΈ Π±ΠΈΠ½Π°ΡΠ½ΠΈΡΡ ΡΠ°ΠΉΠ» Π½Π° ΡΠ°ΠΌΠΈΡ ΡΠΊΠ΅Π½Π΅Ρ. Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΡΠΎΠΉ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ° ΠΈ Π·Π°ΠΏΠΎΡΠ²Π° Π΄Π° ΡΠΊΠ°Π½ΠΈΡΠ° ΡΡΡΠ²ΡΡΠ° SonarΠ·Π° Π½Π°Π»ΠΈΡΠ½ΠΈ ΠΏΠ»ΡΠ³ΠΈΠ½ΠΈ, ΠΊΠ°ΡΠΎ ΠΏΠΎ ΡΠΎΠ·ΠΈ Π½Π°ΡΠΈΠ½ ΠΈΠ·ΡΠΈΡΠ»ΡΠ²Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈΡΠ΅ ΠΠ. Π‘ΡΡΠΎ ΡΠ°ΠΊΠ° ΡΠ΅ ΠΈΠ·ΡΠ΅Π³Π»ΡΡ ΠΈ Π΄ΡΡΠ³ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΠΈ Π·Π° Π½Π΅Π³ΠΎΠ²Π°ΡΠ° ΡΠ°Π±ΠΎΡΠ°: quality profiles, active rules, metrics repository, server rules.


ΠΠ΅Π»Π΅ΠΆΠΊΠ°: Π½ΡΠΌΠ° Π΄Π° ΡΠ΅ ΡΠΏΠΈΡΠ°ΠΌΠ΅ ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ Π½Π° ΡΡΡ Π² ΡΠ°ΠΌΠΊΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ, Π½ΠΎ Π²ΠΈΠ½Π°Π³ΠΈ ΠΌΠΎΠΆΠ΅ΡΠ΅ Π΄Π° ΡΠ΅ ΠΎΠ±ΡΡΠ½Π΅ΡΠ΅ ΠΊΡΠΌ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΈΡΠ΅ ΠΈΠ·ΡΠΎΡΠ½ΠΈΡΠΈ.
ΠΠ°ΡΠ°ΡΡΠΊ Π·Π°ΠΏΠΎΡΠ²Π° Π°Π½Π°Π»ΠΈΠ·ΡΡ Π½Π° ΠΏΠ°ΠΏΠΊΠ°ΡΠ° src ΠΎΡΠ½ΠΎΡΠ½ΠΎ Π½Π°Π»ΠΈΡΠΈΠ΅ΡΠΎ Π½Π° ΠΈΠ·Ρ ΠΎΠ΄Π½ΠΈ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ Π·Π° Π²ΡΠΈΡΠΊΠΈ (ΠΎΡΠ²Π΅Π½ Π°ΠΊΠΎ Π½Π΅ Π΅ ΠΏΠΎΡΠΎΡΠ΅Π½ ΠΊΠΎΠ½ΠΊΡΠ΅ΡΠ΅Π½) ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ°Π½ΠΈ Π΅Π·ΠΈΡΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅, Ρ ΠΏΠΎΡΠ»Π΅Π΄Π²Π°ΡΠ° ΠΈΠ½Π΄Π΅ΠΊΡΠ°ΡΠΈΡ.

Π‘Π»Π΅Π΄Π²Π°Ρ Π΄ΡΡΠ³ΠΈ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ Π°Π½Π°Π»ΠΈΠ·ΠΈ, Π½Π° ΠΊΠΎΠΈΡΠΎ Π½Π΅ ΡΠ΅ ΡΠΎΠΊΡΡΠΈΡΠ°ΠΌΠ΅ Π² ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ (Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ: Π»ΠΈΠ½ΡΠΈΠ½Π³, ΠΎΠΏΡΠ΅Π΄Π΅Π»ΡΠ½Π΅ Π½Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½ ΠΊΠΎΠ΄ ΠΈ Ρ.Π½.).
Π ΡΠ°ΠΌΠΈΡ ΠΊΡΠ°ΠΉ Π½Π° ΡΠ°Π±ΠΎΡΠ°ΡΠ° Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° ΡΠ΅ ΠΈΠ·Π²ΡΡΡΠ²Π° Π°Π³ΡΠ΅Π³ΠΈΡΠ°Π½Π΅ Π½Π° ΡΡΠ»Π°ΡΠ° ΡΡΠ±ΡΠ°Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ, Π°ΡΡ ΠΈΠ²ΠΈΡΠ°Π½Π΅ ΠΈ ΠΈΠ·ΠΏΡΠ°ΡΠ°Π½Π΅ Π½Π° ΡΡΡΠ²ΡΡΠ°.
Π‘Π»Π΅Π΄ ΡΠΎΠ²Π° ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ Π² ΡΠ΅Π± ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:

ΠΠ°ΠΊΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, Π½Π΅ΡΠΎ Π΅ ΠΏΠΎΠ»ΡΡΠ΅Π½ΠΎ ΠΈ Π΄ΠΎΡΠΈ ΠΏΠΎΠΊΠ°Π·Π²Π° ΠΈΠ·Π²Π΅ΡΡΠ½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, Π½ΠΎ ΡΠΎ Π½Π΅ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π½Π° Π½Π°ΡΠΈΡ Jest-ΠΎΡΡΠ΅Ρ.
ΠΠ΅ΠΊΠ° ΡΠ°Π·Π±Π΅ΡΠ΅ΠΌ. ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ° ΠΏΠΎ-ΠΏΠΎΠ΄ΡΠΎΠ±Π½ΠΎ, Π΄Π° ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ Π²ΡΡΡ Ρ ΡΡΠΎΠΉΠ½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΈ "Π΄Π° Π½Π°Π²Π»Π΅Π·Π΅ΠΌ" Π² Π΄Π΅ΡΠ°ΠΉΠ»Π΅Π½ ΠΎΡΡΠ΅Ρ Π·Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅:

Π’ΡΠΊ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅, ΠΎΡΠ²Π΅Π½ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡ, ΠΈΠ·ΡΠ»Π΅Π΄Π²Π°Π½ΠΈΡ ΡΠ°ΠΉΠ» HelloWorld.vue, ΠΏΡΠΈΡΡΡΡΠ²Π° ΠΈ ΡΠ°ΠΉΠ» main.ts, ΠΊΠΎΠΉΡΠΎ ΡΠ°Π·Π²Π°Π»Ρ ΡΡΠ»ΠΎΡΡΠ½Π°ΡΠ° ΠΊΠ°ΡΡΠΈΠ½Π° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅. ΠΠΎ ΠΊΠ°ΠΊ ΡΠ°ΠΊΠ°, Π½ΠΈΠ΅ Π³ΠΎ ΠΈΠ·ΠΊΠ»ΡΡΠ²Π°Ρ ΠΌΠ΅ ΠΎΡ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡΡΠ° Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅. ΠΠ°, Π½Π°ΠΏΡΠ»Π½ΠΎ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ, Π½ΠΎ ΡΠΎΠ²Π° Π±Π΅ΡΠ΅ Π½Π° Π½ΠΈΠ²ΠΎ Jest, Π½ΠΎ ΡΠΊΠ΅Π½Π΅ΡΡΡ Π³ΠΎ Π΅ ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π», Π·Π°ΡΠΎΠ²Π° ΡΠΎΠΉ ΠΏΠΎΠΏΠ°Π΄Π° Π² Π½Π΅Π³ΠΎΠ²ΠΈΡΠ΅ ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡ.
ΠΠ΅ΠΊΠ° Π³ΠΎ ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...ΠΡΠΊΠ°ΠΌ Π΄Π° Π½Π°ΠΏΡΠ°Π²Ρ ΡΡΠΎΡΠ½Π΅Π½ΠΈΠ΅: ΠΎΡΠ²Π΅Π½ ΠΏΠ°ΠΏΠΊΠΈΡΠ΅, Π·Π°Π΄Π°Π΄Π΅Π½ΠΈ Π² ΡΠΎΠ·ΠΈ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ, ΡΡΡΠΎ ΡΠ΅ Π΄ΠΎΠ±Π°Π²ΡΡ Π²ΡΠΈΡΠΊΠΈ ΠΏΠ°ΠΏΠΊΠΈ, ΠΈΠ·Π±ΡΠΎΠ΅Π½ΠΈ Π² ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ sonar.test.inclusions.
Π‘Π»Π΅Π΄ ΡΡΠ°ΡΡΠΈΡΠ°Π½Π΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ° Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ Π²Π΅ΡΠ΅ ΠΊΠΎΡΠ΅ΠΊΡΠ½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ:


ΠΠ΅ΠΊΠ° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌΠ΅ ΡΠ»Π΅Π΄Π²Π°ΡΠΈΡ ΠΌΠΎΠΌΠ΅Π½Ρ β Quality profiles. ΠΠ°Π·Π°Ρ ΠΏΠΎ-Π³ΠΎΡΠ΅ Π·Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° SonarΠ½ΡΠΊΠΎΠ»ΠΊΠΎ Π΅Π·ΠΈΡΠΈ Π·Π° ΠΏΡΠΎΠ³ΡΠ°ΠΌΠΈΡΠ°Π½Π΅ Π΅Π΄Π½ΠΎΠ²ΡΠ΅ΠΌΠ΅Π½Π½ΠΎ. ΠΠΌΠ΅Π½Π½ΠΎ ΡΠΎΠ²Π° ΠΈ Π½Π°Π±Π»ΡΠ΄Π°Π²Π°ΠΌΠ΅. ΠΠΎ Π·Π½Π°Π΅ΠΌ, ΡΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΡΡ Π½ΠΈ Π΅ Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° TS, Π·Π°ΡΠΎΠ²Π° Π·Π°ΡΠΎ Π΄Π° Π½Π°ΡΠΎΠ²Π°ΡΠ²Π°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ° Ρ ΠΈΠ·Π»ΠΈΡΠ½ΠΈ ΠΌΠ°Π½ΠΈΠΏΡΠ»Π°ΡΠΈΠΈ ΠΈ ΠΏΡΠΎΠ²Π΅ΡΠΊΠΈ. ΠΠ·ΠΈΠΊΡΡ Π·Π° Π°Π½Π°Π»ΠΈΠ· ΡΠ΅ Π·Π°Π΄Π°Π΄Π΅ΠΌ Ρ Π΄ΠΎΠ±Π°Π²ΡΠ½Π΅ Π½Π° ΠΎΡΠ΅ Π΅Π΄ΠΈΠ½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Π²ΡΠ² ΡΠ°ΠΉΠ»Π° Π·Π° ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡ Sonar:
sonar-project.properties:
...
sonar.language=ts
...ΠΡΠ½ΠΎΠ²ΠΎ ΡΠ΅ ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ° ΠΈ ΡΠ΅ Π²ΠΈΠ΄ΠΈΠΌ ΡΠ΅Π·ΡΠ»ΡΠ°ΡΠ°:

ΠΠΎΠΊΡΠΈΡΠΈΠ΅ ΠΈΠ·ΡΠ΅Π·Π½Π° Π½Π°ΠΏΡΠ»Π½ΠΎ.
ΠΠΊΠΎ ΠΏΠΎΠ³Π»Π΅Π΄Π½Π΅ΠΌ Π² Π»ΠΎΠ³ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΡΠΊΠ΅Π½Π΅ΡΠ°, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄Π½ΠΈΡ ΡΠ΅Π΄:
![]()
Π’ΠΎΠ΅ΡΡ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° Π½Π°ΡΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΏΡΠΎΡΡΠΎ Π½Π΅ Π±ΡΡ Π° ΠΈΠ½Π΄Π΅ΠΊΡΠΈΡΠ°Π½ΠΈ.
Π‘ΠΈΡΡΠ°ΡΠΈΡΡΠ° Π΅ ΡΠ»Π΅Π΄Π½Π°ΡΠ°: ΠΎΡΠΈΡΠΈΠ°Π»Π½Π° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π½Π° VueJs ΠΈΠΌΠ° Π² ΠΏΠ»ΡΠ³ΠΈΠ½Π° SonarJS, ΠΊΠΎΠΉΡΠΎ ΠΎΡΠ³ΠΎΠ²Π°ΡΡ Π·Π° ΠΠ°ΡΠΈΡΡ DevOps ΠΏΠ°ΠΉΠΏΠ»Π°ΠΉΠ½ ΠΏΠΎΡΡΠΈ Π΅ Π³ΠΎΡΠΎΠ² Π·Π° ΠΏΠΎΠ»Π·Π²Π°Π½Π΅. ΠΠΎΠ±ΡΠ° ΡΠ°Π±ΠΎΡΠ°!.

ΠΠΎ ΡΠ°Π·ΠΈ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π»ΠΈΠΏΡΠ²Π° Π² ΠΏΠ»ΡΠ³ΠΈΠ½Π° SonarTS Π·Π° TS, Π·Π° ΠΊΠΎΠ΅ΡΠΎ Π΅ Π·Π°Π²Π΅Π΄Π΅Π½ΠΎ ΠΎΡΠΈΡΠΈΠ°Π»Π½ΠΎ ΡΠΈΠΊΠ΅Ρ Π² ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ½ΠΈΡ ΡΡΠ΅ΠΊΠ΅Ρ. Sonar:
ΠΡΠΎ Π½ΡΠΊΠΎΠΈ ΠΎΡ ΠΎΡΠ³ΠΎΠ²ΠΎΡΠΈΡΠ΅ Π½Π° Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΏΡΠ΅Π΄ΡΡΠ°Π²ΠΈΡΠ΅Π»ΠΈΡΠ΅ Π½Π° ΡΠ°Π·ΡΠ°Π±ΠΎΡΡΠΈΡΠΈΡΠ΅ Π½Π° SonarQube, ΠΏΠΎΡΠ²ΡΡΠ΄Π²Π°ΡΠΈ ΡΠΎΠ·ΠΈ ΡΠ°ΠΊΡ.


ΠΠΎ Π²ΡΠΈΡΠΊΠΎ ΡΠ°Π±ΠΎΡΠΈ Π΄ΠΎΠ±ΡΠ΅ ΠΈ ΡΠ΅ Π²ΡΠ·ΡΠ°Π·ΠΈΡΠ΅. ΠΠ°, ΡΠ°ΠΊΠ° Π΅, Π½Π΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° βΠΏΠΎΡ
Π°ΠΊΠ΅ΡΠΈΠΌβ.
ΠΠΊΠΎ ΠΈΠΌΠ° ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ° Π·Π° .vue -ΡΠ°ΠΉΠ»ΠΎΠ²Π΅-ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ SonarΠΈ Π·Π°ΡΠΎΠ²Π° Π½Π΅ΠΊΠ° Π΄Π° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΌΡ ΠΊΠ°ΠΆΠ΅ΠΌ Π΄Π° Π³ΠΈ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΠΊΠ°ΡΠΎ Typescript.
ΠΠ° Π΄ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...ΠΠ΅ΠΊΠ° ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:

Π Π΅ΡΠΎ, Π²ΡΠΈΡΠΊΠΎ ΡΠ΅ Π²ΡΡΠ½Π° Π² Π½ΠΎΡΠΌΠ°Π»Π½ΠΈΡ Ρ ΠΎΠ΄, ΠΈ Ρ Π΅Π΄ΠΈΠ½ ΠΏΡΠΎΡΠΈΠ» ΡΠ°ΠΌΠΎ Π·Π° Typescript. Π’ΠΎΠ΅ΡΡ ΡΡΠΏΡΡ ΠΌΠ΅ Π΄Π° ΡΠ΅ΡΠΈΠΌ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° VueJs+TS Π·Π° SonarQube.
ΠΠ΅ΠΊΠ° ΠΎΠΏΠΈΡΠ°ΠΌΠ΅ Π΄Π° ΠΎΡΠΈΠ΄Π΅ΠΌ ΠΏΠΎ-Π΄Π°Π»Π΅Ρ ΠΈ ΠΌΠ°Π»ΠΊΠΎ Π΄Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠΈΠΌ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅.
ΠΠ°ΠΊΠ²ΠΎ Π½Π°ΠΏΡΠ°Π²ΠΈΡ ΠΌΠ΅ Π΄ΠΎ ΠΌΠΎΠΌΠ΅Π½ΡΠ°:
- Π΄ΠΎΠ±Π°Π²ΠΈΡ ΠΌΠ΅ Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° Sonar-ΡΠΊΠ΅Π½Π΅Ρ;
- Π½Π°ΡΡΡΠΎΠΈΡ ΠΌΠ΅ Jest Π·Π° Π³Π΅Π½Π΅ΡΠΈΡΠ°Π½Π΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅;
- ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠΈΡΠ°Ρ ΠΌΠ΅ Sonar-ΡΠΊΠ΅Π½Π΅Ρ;
- ΡΠ΅ΡΠΈΡ ΠΌΠ΅ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠ° Ρ ΠΏΠΎΠ΄Π΄ΡΡΠΆΠΊΠ°ΡΠ° Π½Π° -ΡΠ°ΠΉΠ»ΠΎΠ²Π΅-ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ + Typescript.
ΠΡΠ²Π΅Π½ ΡΠ΅ΡΡΠΎΠ²ΠΎΡΠΎ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅, ΠΈΠΌΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠ΄Π°, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ, Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ Π½Π° ΠΊΠΎΠ΄ ΠΈ Π±ΡΠΎΡΡ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ΡΠ΅ (ΡΡΠ°ΡΡΠ²Π°Ρ Π² ΠΈΠ·ΡΠΈΡΠ»Π΅Π½ΠΈΡΡΠ° Π½Π° ΠΊΠΎΠ΅ΡΠΈΡΠΈΠ΅Π½ΡΠΈΡΠ΅, ΡΠ²ΡΡΠ·Π°Π½ΠΈ ΡΡΡ ΡΠ»ΠΎΠΆΠ½ΠΎΡΡΡΠ° Π½Π° ΠΊΠΎΠ΄Π°) Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°.
Π ΡΠ΅ΠΊΡΡΠ°ΡΠ° ΡΠ΅Π°Π»ΠΈΠ·Π°ΡΠΈΡ Π½Π° ΠΏΠ»ΡΠ³ΠΈΠ½Π° Π·Π° ΡΠ°Π±ΠΎΡΠ° Ρ TS (SonarTS) Π½ΡΠΌΠ° Π΄Π° ΡΠ°Π±ΠΎΡΠΈ CPD (Copy Paste Detector) ΠΈ Π±ΡΠΎΠ΅Π½Π΅ΡΠΎ Π½Π° ΡΠ΅Π΄ΠΎΠ²Π΅ ΠΊΠΎΠ΄Π° -ΡΠ°ΠΉΠ»ΠΎΠ²Π΅-ΡΠ°ΠΉΠ»ΠΎΠ²Π΅.
ΠΠ° Π΄Π° ΡΡΠ·Π΄Π°Π΄Π΅ΠΌ ΡΠΈΠ½ΡΠ΅ΡΠΈΡΠ½Π° ΡΠΈΡΡΠ°ΡΠΈΡ Π·Π° Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ Π½Π° ΠΊΠΎΠ΄, ΠΏΡΠΎΡΡΠΎ Π΄ΡΠ±Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ°ΠΉΠ»Π° Π½Π° ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½ΡΠ° Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΈΠΌΠ΅, ΡΡΡΠΎ ΡΠ°ΠΊΠ° Π΄ΠΎΠ±Π°Π²ΡΠΌΠ΅ Π² ΠΊΠΎΠ΄Π° main.ts ΠΏΡΠ°Π·Π½Π° ΡΡΠ½ΠΊΡΠΈΡ ΠΈ Ρ Π΄ΡΠ±Π»ΠΈΡΠ°ΠΌΠ΅ Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΎ ΠΈΠΌΠ΅. ΠΠ° Π΄Π° ΠΏΡΠΎΠ²Π΅ΡΠΈΠΌ Π΄ΡΠ±Π»ΠΈΡΠ°Π½Π΅ΡΠΎ, ΠΊΠ°ΠΊΡΠΎ Π² -ΡΠ°ΠΉΠ»ΠΎΠ²Π΅, ΡΠ°ΠΊΠ° ΠΈ Π² .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, ΠΊΠΎΠ΅ΡΠΎ, ΠΌΠΈΡΠ»Ρ, Π΅ ΠΏΡΠ°Π²ΠΈΠ»Π½ΠΎ.
Π‘Π΅Π³Π° ΠΈΡΠΊΠ°ΠΌ Π΄Π° ΡΠ°Π·Π³Π»Π΅Π΄Π°ΠΌ Π²Π°ΡΠΈΠ°Π½Ρ Π·Π° ΠΏΠΎΠ΄ΠΎΠ±ΡΠ΅Π½ΠΈΠ΅ Π½Π° ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡΡΠ° Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅.
ΠΠΎΠΊΠ°ΡΠΎ Π²ΠΈΠΆΠ΄Π°ΠΌΠ΅ ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ ΠΎΡ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ Π² ΠΏΡΠΎΡΠ΅Π½ΡΠ½ΠΎ ΠΈΠ·ΡΠ°ΠΆΠ΅Π½ΠΈΠ΅, Π½Π° ΡΠ΅Π»ΠΈΡ ΠΏΡΠΎΠ΅ΠΊΡ ΠΈ Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π² ΡΠ°ΡΡΠ½ΠΎΡΡ. ΠΠΎ ΠΈΠΌΠ° Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ Π΄Π° ΡΠ°Π·ΡΠΈΡΠΈΠΌ ΡΠΎΠ·ΠΈ ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π» Ρ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΡ Π·Π° Π±ΡΠΎΡ Π½Π° unit-ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ ΠΏΠΎ ΠΏΡΠΎΠ΅ΠΊΡΠ°, ΠΊΠ°ΠΊΡΠΎ ΠΈ Π² ΠΊΠΎΠ½ΡΠ΅ΠΊΡΡΠ° Π½Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅.
ΠΠΌΠ° Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ°, ΠΊΠΎΡΡΠΎ ΠΌΠΎΠΆΠ΅ Jest-Π΄Π° ΠΊΠΎΠ½Π²Π΅ΡΡΠΈΡΠ° ΠΎΡΡΠ΅ΡΠ° Π² ΡΠΎΡΠΌΠ°Ρ Π·Π° Sonar:
generic test data β .
ΠΠ΅ΠΊΠ° ΠΈΠ½ΡΡΠ°Π»ΠΈΡΠ°ΠΌΠ΅ ΡΠ°Π·ΠΈ Π±ΠΈΠ±Π»ΠΈΠΎΡΠ΅ΠΊΠ° Π² ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠΈ:
yarn add jest-sonar-reporterΠ Π΄Π° Ρ Π΄ΠΎΠ±Π°Π²ΠΈΠΌ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Jest:
package.json:
...
"testResultsProcessor": "jest-sonar-reporter"
...Π‘Π΅Π³Π° Π½Π΅ΠΊΠ° ΠΈΠ·ΠΏΡΠ»Π½ΠΈΠΌ ΡΠ΅ΡΡ:
yarn testΠ‘Π»Π΅Π΄ ΠΊΠΎΠ΅ΡΠΎ Π² ΠΊΠΎΡΠ΅Π½ΠΎΠ²Π°ΡΠ° Π΄ΠΈΡΠ΅ΠΊΡΠΎΡΠΈΡ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ° ΡΠ΅ Π±ΡΠ΄Π΅ ΡΡΠ·Π΄Π°Π΄Π΅Π½ ΡΠ°ΠΉΠ» test-report.xml.
ΠΠ΅ΠΊΠ° Π³ΠΎ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ Π² ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΡΡΠ° Sonar:
sonar-project.properties:
...
sonar.testExecutionReportPaths=test-report.xml
...Π Π΄Π° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:
yarn run sonarΠΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ° Sonar:

Π Π½ΠΈΡΠΎ Π½Π΅ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ. Π‘ΡΠ°Π²Π° Π²ΡΠΏΡΠΎΡ, ΡΠ΅ Sonar Π½Π΅ ΡΠ°Π·Π³Π»Π΅ΠΆΠ΄Π° ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅, ΠΎΠΏΠΈΡΠ°Π½ΠΈ Π² Jest ΠΎΡΡΠ΅ΡΠΈΡΠ΅, ΠΊΠ°ΡΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ unit-ΡΠ΅ΡΡΠΎΠ²Π΅. ΠΠ° Π΄Π° ΠΏΠΎΠΏΡΠ°Π²ΠΈΠΌ ΡΠ°Π·ΠΈ ΡΠΈΡΡΠ°ΡΠΈΡ, ΡΠ΅ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌΠ΅ ΠΊΠΎΠ½ΡΠΈΠ³ΡΡΠ°ΡΠΈΠΎΠ½Π΅Π½ ΠΏΠ°ΡΠ°ΠΌΠ΅ΡΡΡ Sonar sonar.tests, Π² ΠΊΠΎΠΉΡΠΎ ΡΡΠ½ΠΎ ΡΠ΅ ΠΏΠΎΡΠΎΡΠΈΠΌ ΠΏΠ°ΠΏΠΊΠΈΡΠ΅ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅ΡΠ΅ (Π² ΠΌΠΎΠΌΠ΅Π½ΡΠ° ΠΈΠΌΠ°ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄Π½Π°):
sonar-project.properties:
β¦
sonar.tests=src/components/__tests__
β¦ΠΠ΅ΠΊΠ° ΡΠ΅ΡΡΠ°ΡΡΠΈΡΠ°ΠΌΠ΅ ΡΠΊΠ΅Π½Π΅ΡΠ°:
yarn run sonarΠΠ° Π²ΠΈΠ΄ΠΈΠΌ ΠΊΠ°ΠΊΠ²ΠΎ ΡΠ΅ Π΅ ΠΏΡΠΎΠΌΠ΅Π½ΠΈΠ»ΠΎ Π² ΠΈΠ½ΡΠ΅ΡΡΠ΅ΠΉΡΠ°:

Π‘Π΅Π³Π° Π²ΠΈΠ΄ΡΡ ΠΌΠ΅ Π±ΡΠΎΡ Π½Π° Π½Π°ΡΠΈΡΠ΅ unit-ΡΠ΅ΡΡΠΎΠ²Π΅ ΠΈ, Π°ΠΊΠΎ ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ Π²ΡΡΡ Ρ Π½Π΅Π³ΠΎ, ΠΌΠΎΠΆΠ΅ΠΌ Π΄Π° Π²ΠΈΠ΄ΠΈΠΌ ΡΠ°Π·ΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ΡΠΎ Π½Π° ΡΠΎΠ²Π° ΡΠΈΡΠ»ΠΎ ΠΏΠΎ ΡΠ°ΠΉΠ»ΠΎΠ²Π΅ΡΠ΅ Π½Π° ΠΏΡΠΎΠ΅ΠΊΡΠ°:

ΠΠ°ΠΊΠ»ΡΡΠ΅Π½ΠΈΠ΅
Π ΡΠ°ΠΊΠ°, ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΠΈΠ½ΡΡΡΡΠΌΠ΅Π½ΡΠ° Π·Π° Π½Π΅ΠΏΡΠ΅ΠΊΡΡΠ½Π°Ρ Π°Π½Π°Π»ΠΈΠ· SonarQube. Π£ΡΠΏΠ΅ΡΠ½ΠΎ ΠΈΠ½ΡΠ΅Π³ΡΠΈΡΠ°Ρ ΠΌΠ΅ ΠΏΡΠΎΠ΅ΠΊΡΠ°, Π½Π°ΠΏΠΈΡΠ°Π½ Π½Π° VueJs+TS. Π Π΅ΡΠΈΡ ΠΌΠ΅ ΠΎΠΏΡΠ΅Π΄Π΅Π»Π΅Π½ΠΈ ΠΏΡΠΎΠ±Π»Π΅ΠΌΠΈ Ρ ΡΡΠ²ΠΌΠ΅ΡΡΠΈΠΌΠΎΡΡΡΠ°. ΠΠΎΠ²ΠΈΡΠΈΡ ΠΌΠ΅ ΠΈΠ½ΡΠΎΡΠΌΠ°ΡΠΈΠ²Π½ΠΎΡΡΡΠ° Π½Π° ΠΏΠΎΠΊΠ°Π·Π°ΡΠ΅Π»Ρ Π·Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ Ρ ΡΠ΅ΡΡΠΎΠ²Π΅. Π ΡΠ°Π·ΠΈ ΡΡΠ°ΡΠΈΡ ΡΠ°Π·Π³Π»Π΅Π΄Π°Ρ ΠΌΠ΅ ΡΠ°ΠΌΠΎ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈΡΠ΅ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ Π½Π° ΠΊΠΎΠ΄Π° (Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎ Π΅ Π΅Π΄ΠΈΠ½ ΠΎΡ ΠΎΡΠ½ΠΎΠ²Π½ΠΈΡΠ΅), Π½ΠΎ SonarQube ΠΏΠΎΠ΄Π΄ΡΡΠΆΠ° ΠΈ Π΄ΡΡΠ³ΠΈ ΠΊΡΠΈΡΠ΅ΡΠΈΠΈ Π·Π° ΠΊΠ°ΡΠ΅ΡΡΠ²ΠΎ, Π²ΠΊΠ»ΡΡΠΈΡΠ΅Π»Π½ΠΎ ΡΠ΅ΡΡΠ²Π°Π½Π΅ Π·Π° ΡΠΈΠ³ΡΡΠ½ΠΎΡΡ. ΠΠΎ Π½Π΅ Π²ΡΠΈΡΠΊΠΈΡΠ΅ ΡΠ΅Π·ΠΈ Π²ΡΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡΠΈ ΡΠ° Π½Π°ΠΏΡΠ»Π½ΠΎ Π΄ΠΎΡΡΡΠΏΠ½ΠΈ Π² community-Π²Π΅ΡΡΠΈΡΡΠ°. ΠΠ΄Π½Π° ΠΎΡ ΠΈΠ½ΡΠ΅ΡΠ΅ΡΠ½ΠΈΡΠ΅ ΠΈ ΠΏΠΎΠ»Π΅Π·Π½ΠΈ ΡΡΠ½ΠΊΡΠΈΠΈ Π΅ ΠΈΠ½ΡΠ΅Π³ΡΠ°ΡΠΈΡΡΠ° SonarQube Ρ ΡΠ°Π·Π»ΠΈΡΠ½ΠΈ ΡΠΈΡΡΠ΅ΠΌΠΈ Π·Π° ΡΠΏΡΠ°Π²Π»Π΅Π½ΠΈΠ΅ Π½Π° ΠΊΠΎΠ΄ΠΎΠ²ΠΈΡΠ΅ ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΠΈ, ΠΊΠ°ΡΠΎ Π½Π°ΠΏΡΠΈΠΌΠ΅Ρ GitLab ΠΈ BitBucket. ΠΠ° Π΄Π° ΠΏΡΠ΅Π΄ΠΎΡΠ²ΡΠ°ΡΠΈΠΌ merge pull(merge) request'Π° Π² ΠΎΡΠ½ΠΎΠ²Π½Π°ΡΠ° ΠΊΠ»ΠΎΠ½ Π½Π° ΡΠ΅ΠΏΠΎΠ·ΠΈΡΠΎΡΠΈΡ ΠΏΡΠΈ Π΄Π΅Π³ΡΠ°Π΄Π°ΡΠΈΡ Π½Π° ΠΏΠΎΠΊΡΠΈΡΠΈΠ΅ΡΠΎ. ΠΠΎ ΡΠΎΠ²Π° Π΅ ΠΈΡΡΠΎΡΠΈΡ Π½Π° ΡΡΠ²ΡΠ΅ΠΌ Π΄ΡΡΠ³Π° ΡΡΠ°ΡΠΈΡ.
PS: ΠΡΠΈΡΠΊΠΎ, ΠΊΠΎΠ΅ΡΠΎ Π΅ ΠΎΠΏΠΈΡΠ°Π½ΠΎ Π² ΡΡΠ°ΡΠΈΡΡΠ° ΠΏΠΎΠ΄ ΡΠΎΡΠΌΠ°ΡΠ° Π½Π° ΠΊΠΎΠ΄, Π΅ Π΄ΠΎΡΡΡΠΏΠ½ΠΎ Π² .
Π‘Π°ΠΌΠΎ ΡΠ΅Π³ΠΈΡΡΡΠΈΡΠ°Π½ΠΈ ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΠΌΠΎΠ³Π°Ρ Π΄Π° ΡΡΠ°ΡΡΠ²Π°Ρ Π² Π°Π½ΠΊΠ΅ΡΠ°ΡΠ°. , ΠΌΠΎΠ»Ρ.
ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΡΠ΅ Π»ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°ΡΠ° SonarQube:
26,3%ΠΠ°5
15,8%ΠΠ΅3
15,8%Π§ΡΠ²Π°Π» ΡΡΠΌ Π·Π° ΡΠ°Π·ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΈ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ3
10,5%Π§ΡΠ²Π°Π» ΡΡΠΌ Π·Π° ΡΠ°Π·ΠΈ ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ° ΠΈ Π½Π΅ ΠΈΡΠΊΠ°ΠΌ Π΄Π° Ρ ΠΈΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ2
0,0%ΠΠ·ΠΏΠΎΠ»Π·Π²Π°ΠΌ Π΄ΡΡΠ³Π° ΠΏΠ»Π°ΡΡΠΎΡΠΌΠ°0
31,6%Π§ΡΠ²Π°ΠΌ Π·Π° Π½Π΅Ρ Π·Π° ΠΏΡΡΠ²ΠΈ ΠΏΡΡ6
19 ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ Π³Π»Π°ΡΡΠ²Π°Ρ
Π°. 3 ΠΏΠΎΡΡΠ΅Π±ΠΈΡΠ΅Π»ΠΈ ΡΠ΅ Π²ΡΠ·Π΄ΡΡΠΆΠ°Ρ
Π°.
ΠΠ·ΡΠΎΡΠ½ΠΈΠΊ: habr.com
