Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π’ своСй Ρ€Π°Π±ΠΎΡ‚Π΅ ΠΌΡ‹ Π°ΠΊΡ‚ΠΈΠ²Π½ΠΎ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΡƒ SonarQube для поддСрТания качСства ΠΊΠΎΠ΄Π° Π½Π° высоком ΡƒΡ€ΠΎΠ²Π½Π΅. ΠŸΡ€ΠΈ ΠΈΠ½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΠΈ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ΠΎΠ², написанном Π½Π° VueJs+Typescript, Π²ΠΎΠ·Π½ΠΈΠΊΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡ‹. ΠŸΠΎΡΡ‚ΠΎΠΌΡƒ Ρ…ΠΎΡ‚Π΅Π» Π±Ρ‹ Ρ€Π°ΡΡΠΊΠ°Π·Π°Ρ‚ΡŒ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½Π΅ΠΉ ΠΎ Ρ‚ΠΎΠΌ, ΠΊΠ°ΠΊ ΡƒΠ΄Π°Π»ΠΎΡΡŒ ΠΈΡ… Ρ€Π΅ΡˆΠΈΡ‚ΡŒ.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π’ Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ Ρ€Π΅Ρ‡ΡŒ ΠΏΠΎΠΉΠ΄Π΅Ρ‚, ΠΊΠ°ΠΊ писал Π²Ρ‹ΡˆΠ΅, ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ΅ SonarQube. НСмного Ρ‚Π΅ΠΎΡ€ΠΈΠΈ β€” Ρ‡Ρ‚ΠΎ это Ρ‚Π°ΠΊΠΎΠ΅ Π²ΠΎΠΎΠ±Ρ‰Π΅, для Ρ‚Π΅Ρ…, ΠΊΡ‚ΠΎ ΡΠ»Ρ‹ΡˆΠΈΡ‚ ΠΎ Π½Π΅ΠΉ Π²ΠΏΠ΅Ρ€Π²Ρ‹Π΅:

SonarQube (Π±Ρ‹Π²ΡˆΠΈΠΉ Sonar) β€” ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° с ΠΎΡ‚ΠΊΡ€Ρ‹Ρ‚Ρ‹ΠΌ исходным ΠΊΠΎΠ΄ΠΎΠΌ для Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° (Π°Π½Π³Π». continuous inspection) ΠΈ измСрСния качСства ΠΊΠΎΠ΄Π°.
ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ Π°Π½Π°Π»ΠΈΠ· ΠΊΠΎΠ΄Π° ΠΈ поиск ошибок согласно ΠΏΡ€Π°Π²ΠΈΠ»Π°ΠΌ стандартов программирования MISRA C, MISRA C++, MITRE/CWE ΠΈ CERT Secure Coding Standards. А Ρ‚Π°ΠΊΠΆΠ΅ ΡƒΠΌΠ΅Π΅Ρ‚ Ρ€Π°ΡΠΏΠΎΠ·Π½Π°Π²Π°Ρ‚ΡŒ ошибки ΠΈΠ· списков OWASP Π’ΠΎΠΏ-10 ΠΈ CWE/SANS Π’ΠΎΠΏ-25 ошибок программирования.
НСсмотря Π½Π° Ρ‚ΠΎ, Ρ‡Ρ‚ΠΎ ΠΏΠ»Π°Ρ‚Ρ„ΠΎΡ€ΠΌΠ° ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π³ΠΎΡ‚ΠΎΠ²Ρ‹Π΅ инструмСнты, SonarQube сводит Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚Ρ‹ ΠΊ Π΅Π΄ΠΈΠ½ΠΎΠΉ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΎΠ½Π½ΠΎΠΉ ΠΏΠ°Π½Π΅Π»ΠΈ (Π°Π½Π³Π». dashboard), вСдя ΠΈΡΡ‚ΠΎΡ€ΠΈΡŽ ΠΏΡ€ΠΎΠ³ΠΎΠ½ΠΎΠ² ΠΈ позволяя Ρ‚Π΅ΠΌ самым ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΎΠ±Ρ‰ΡƒΡŽ Ρ‚Π΅Π½Π΄Π΅Π½Ρ†ΠΈΡŽ измСнСния качСства ΠΏΡ€ΠΎΠ³Ρ€Π°ΠΌΠΌΠ½ΠΎΠ³ΠΎ обСспСчСния Π² Ρ…ΠΎΠ΄Π΅ Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚ΠΊΠΈ.

Π‘ΠΎΠ»Π΅Π΅ ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ ΠΌΠΎΠΆΠ½ΠΎ ΡƒΠ·Π½Π°Ρ‚ΡŒ Π½Π° ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎΠΌ сайтС

ΠŸΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅Ρ‚ΡΡ большоС количСство языков программирования. Будя ΠΏΠΎ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΈΠ· ссылки Π²Ρ‹ΡˆΠ΅ β€” это Π±ΠΎΠ»Π΅Π΅ 25 языков. Для ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½ΠΎΠ³ΠΎ языка Π½Π΅ΠΎΠ±Ρ…ΠΎΠ΄ΠΈΠΌΠΎ ΡƒΡΡ‚Π°Π½ΠΎΠ²ΠΈΡ‚ΡŒ ΡΠΎΠΎΡ‚Π²Π΅Ρ‚ΡΡ‚Π²ΡƒΡŽΡ‰ΠΈΠΉ ΠΏΠ»Π°Π³ΠΈΠ½. Π’ community-Π²Π΅Ρ€ΡΠΈΡŽ Π²Ρ…ΠΎΠ΄ΠΈΡ‚ ΠΏΠ»Π°Π³ΠΈΠ½ для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с Javascript (Π² Ρ‚ΠΎΠΌ числС typesсript), хотя Π² wiki написано ΠΎΠ±Ρ€Π°Ρ‚Π½ΠΎΠ΅. Π—Π° Javascript ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ ΠΏΠ»Π°Π³ΠΈΠ½ SonarJS, Π·Π° Typescript SonarTS соотвСтствСнно.

Для ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠΈ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅Ρ‚ΡΡ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ ΠΊΠ»ΠΈΠ΅Π½Ρ‚ sonarqube-scanner, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ, ΠΈΡΠΏΠΎΠ»ΡŒΠ·ΡƒΡ настройки ΠΈΠ· config-Ρ„Π°ΠΉΠ»Π°, отправляСт эти Π΄Π°Π½Π½Ρ‹Π΅ Π½Π° сСрвСр SonarQube для дальнСйшСй консолидации ΠΈ агрСгирования.

Для Javascript Π΅ΡΡ‚ΡŒ npm-ΠΎΠ±Π΅Ρ€Ρ‚ΠΊΠ°. Π˜Ρ‚Π°ΠΊ, Π½Π°Ρ‡ΠΈΠ½Π°Π΅ΠΌ пошаговоС Π²Π½Π΅Π΄Ρ€Π΅Π½ΠΈΠ΅ 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 Π±ΡƒΠ΄Π΅Ρ‚ доступСн ΠΏΠΎ адрСсу – http://localhost:9001 .

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с 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=Test Application (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

Π£Π²ΠΈΠ΄ΠΈΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅Π΅:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

ΠŸΡ€ΠΈΡ‡ΠΈΠ½Π° Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Π² самом ΠΊΠΎΠΌΠΏΠΎΠ½Π΅Π½Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ‚Π°ΠΊΠΎΠ²ΠΎΠ³ΠΎ, ΠΊΠΎΠ΄Π° Π½Π΅Ρ‚. Π˜ΡΠΏΡ€Π°Π²ΠΈΠΌ это.

HelloWorld.vue:

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

Π­Ρ‚ΠΎΠ³ΠΎ Π±ΡƒΠ΄Π΅Ρ‚ достаточно для расчСта покрытия.

ПослС пСрСзапуска тСста убСдимся Π² этом:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

На экранС ΠΌΡ‹ Π΄ΠΎΠ»ΠΆΠ½Ρ‹ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ, Π° Π² ΠΏΠ°ΠΏΠΊΠ΅ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° Π±ΡƒΠ΄Π΅Ρ‚ создана ΠΏΠ°ΠΏΠΊΠ° coverage с ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ тСстами Π² ΡƒΠ½ΠΈΠ²Π΅Ρ€ΡΠ°Π»ΡŒΠ½ΠΎΠΌ Ρ„ΠΎΡ€ΠΌΠ°Ρ‚Π΅ 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.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

ΠŸΡ€ΠΈΠΌΠ΅Ρ‡Π°Π½ΠΈΠ΅: ΠΏΠΎΠ΄Ρ€ΠΎΠ±Π½ΠΎ Π½Π° Π½ΠΈΡ… ΠΌΡ‹ ΠΎΡΡ‚Π°Π½Π°Π²Π»ΠΈΠ²Π°Ρ‚ΡŒΡΡ Π½Π΅ Π±ΡƒΠ΄Π΅ΠΌ Π² Ρ€Π°ΠΌΠΊΠ°Ρ… Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠΈ, Π½ΠΎ всСгда ΠΌΠΎΠΆΠ½ΠΎ ΠΎΠ±Ρ€Π°Ρ‚ΠΈΡ‚ΡŒΡΡ Π² ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹Π΅ источники.

Π”Π°Π»Π΅Π΅ начинаСтся Π°Π½Π°Π»ΠΈΠ· ΠΏΠ°ΠΏΠΊΠΈ src Π½Π° ΠΏΡ€Π΅Π΄ΠΌΠ΅Ρ‚ наличия исходных Ρ„Π°ΠΉΠ»ΠΎΠ² для всСх (Ссли Π½Π΅ Π·Π°Π΄Π°Π½ явно ΠΊΠ°ΠΊΠΎΠΉ-Ρ‚ΠΎ ΠΊΠΎΠ½ΠΊΡ€Π΅Ρ‚Π½Ρ‹ΠΉ) ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΈΠ²Π°Π΅ΠΌΡ‹Ρ… ЯП, с ΠΏΠΎΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π΅ΠΉ ΠΈΡ… индСксациСй.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π”Π°Π»Π΅Π΅ ΠΈΠ΄ΡƒΡ‚ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ Ρ€Π°Π·Π»ΠΈΡ‡Π½Ρ‹Π΅ Π°Π½Π°Π»ΠΈΠ·Ρ‹, Π½Π° ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Ρ… ΠΌΡ‹ Π½Π΅ заостряСм Π²Π½ΠΈΠΌΠ°Π½ΠΈΠ΅ Π² Π΄Π°Π½Π½ΠΎΠΉ ΡΡ‚Π°Ρ‚ΡŒΠ΅ (Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Ρ‚Π°ΠΊΠΈΠ΅ ΠΊΠ°ΠΊ: Π»ΠΈΠ½Ρ‚ΠΈΠ½Π³, ΠΎΠΏΡ€Π΅Π΄Π΅Π»Π΅Π½ΠΈΠ΅ дублирования ΠΊΠΎΠ΄Π° ΠΈ Ρ‚Π΄).

Π’ самом ΠΊΠΎΠ½Ρ†Π΅ Ρ€Π°Π±ΠΎΡ‚Ρ‹ сканСра происходит Π°Π³Ρ€Π΅Π³ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ всСй собранной ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ, Π°Ρ€Ρ…ΠΈΠ²ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΈ ΠΎΡ‚ΠΏΡ€Π°Π²ΠΊΠ° Π΅Π΅ Π½Π° сСрвСр.

ПослС этого ΠΌΡ‹ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠΆΠ΅ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Ρ‡Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ Π² вэб-интСрфСйсС:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Как Π²ΠΈΠ΄ΠΈΠΌ, Ρ‡Ρ‚ΠΎ-Ρ‚ΠΎ ΠΏΠΎΠ»ΡƒΡ‡ΠΈΠ»ΠΎΡΡŒ, ΠΈ Π΄Π°ΠΆΠ΅ ΠΏΠΎΠΊΠ°Π·Ρ‹Π²Π°Π΅Ρ‚ ΠΊΠ°ΠΊΠΎΠ΅-Ρ‚ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, Π½ΠΎ ΠΎΠ½ΠΎ Π½Π΅ соотвСтствуСт Π½Π°ΡˆΠ΅ΠΌΡƒ Jest-ΠΎΡ‚Ρ‡Π΅Ρ‚Ρƒ.

Π”Π°Π²Π°ΠΉΡ‚Π΅ Ρ€Π°Π·Π±ΠΈΡ€Π°Ρ‚ΡŒΡΡ. ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ Π½Π° ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Π±ΠΎΠ»Π΅Π΅ Π΄Π΅Ρ‚Π°Π»ΡŒΠ½ΠΎ, ΠΊΠ»ΠΈΠΊΠ½Π΅ΠΌ ΠΏΠΎ Π·Π½Π°Ρ‡Π΅Π½ΠΈΡŽ покрытия, ΠΈ "провалимся" Π² Π΄Π΅Ρ‚Π°Π»ΠΈΠ·ΠΈΡ€ΠΎΠ²Π°Π½Π½Ρ‹ΠΉ ΠΎΡ‚Ρ‡Π΅Ρ‚ ΠΏΠΎ Ρ„Π°ΠΉΠ»Π°ΠΌ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π—Π΄Π΅ΡΡŒ ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠΌΠΈΠΌΠΎ основного, исслСдуСмого Ρ„Π°ΠΉΠ»Π° HelloWorld.vue, присутствуСт ΠΈ Ρ„Π°ΠΉΠ» main.ts, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΈ ΠΏΠΎΡ€Ρ‚ΠΈΡ‚ всю ΠΊΠ°Ρ€Ρ‚ΠΈΠ½Ρƒ покрытия. Но ΠΊΠ°ΠΊ ΠΆΠ΅ Ρ‚Π°ΠΊ, ΠΌΡ‹ Π΅Π³ΠΎ ΠΈΡΠΊΠ»ΡŽΡ‡Π°Π»ΠΈ ΠΈΠ· расчСта покрытия. Π”Π°, всС ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ, Π½ΠΎ это Π±Ρ‹Π»ΠΎ Π½Π° ΡƒΡ€ΠΎΠ²Π½Π΅ Jest, Π½ΠΎ сканСр Π΅Π³ΠΎ проиндСксировал, поэтому ΠΎΠ½ ΠΏΠΎΠΏΠ°Π» Π² Π΅Π³ΠΎ расчСты.

Π”Π°Π²Π°ΠΉΡ‚Π΅ исправим это:

sonar-project.properties:

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

Π₯очСтся ΡΠ΄Π΅Π»Π°Ρ‚ΡŒ ΡƒΡ‚ΠΎΡ‡Π½Π΅Π½ΠΈΠ΅: ΠΏΠΎΠΌΠΈΠΌΠΎ Ρ‚Π΅Ρ… ΠΏΠ°ΠΏΠΎΠΊ, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ Π·Π°Π΄Π°Π½Ρ‹ Π² Π΄Π°Π½Π½ΠΎΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅, Ρ‚Π°ΠΊΠΆΠ΅ Π΄ΠΎΠ±Π°Π²Π»ΡΡŽΡ‚ΡΡ всС ΠΏΠ°ΠΏΠΊΠΈ, пСрСчислСнныС Π² ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π΅ sonar.test.inclusions.

ПослС запуска сканСра Π²ΠΈΠ΄ΠΈΠΌ ΡƒΠΆΠ΅ ΠΊΠΎΡ€Ρ€Π΅ΠΊΡ‚Π½ΡƒΡŽ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π Π°Π·Π±Π΅Ρ€Π΅ΠΌ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΠΈΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚ – Quality profiles. Π― Π³ΠΎΠ²ΠΎΡ€ΠΈΠ» Π²Ρ‹ΡˆΠ΅ ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ Sonar’ом нСсколько ЯП ΠΎΠ΄Π½ΠΎΠ²Ρ€Π΅ΠΌΠ΅Π½Π½ΠΎ. Π’ΠΎΡ‚ это ΠΊΠ°ΠΊ Ρ€Π°Π· ΠΌΡ‹ ΠΈ наблюдаСм. Но ΠΌΡ‹ Π·Π½Π°Π΅ΠΌ, Ρ‡Ρ‚ΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Ρƒ нас написан Π½Π° TS, поэтому Π·Π°Ρ‡Π΅ΠΌ Π½Π°ΠΏΡ€ΡΠ³Π°Ρ‚ΡŒ сканСр лишними манипуляциями ΠΈ ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠ°ΠΌΠΈ. Π―Π·Ρ‹ΠΊ для Π°Π½Π°Π»ΠΈΠ·Π° Π·Π°Π΄Π°Π΄ΠΈΠΌ Ρ‡Π΅Ρ€Π΅Π· Π΄ΠΎΠ±Π°Π²Π»Π΅Π½ΠΈΠ΅ Π΅Ρ‰Π΅ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€Π° Π² Ρ„Π°ΠΉΠ» ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Sonar’а:

sonar-project.properties:

...
sonar.language=ts
...

Π‘Π½ΠΎΠ²Π° запустим сканСр ΠΈ посмотрим Ρ€Π΅Π·ΡƒΠ»ΡŒΡ‚Π°Ρ‚:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

ΠŸΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ ΠΏΡ€ΠΎΠΏΠ°Π»ΠΎ вовсС.

Если посмотрим Π² Π»ΠΎΠ³ сканСра, Ρ‚ΠΎ ΠΌΠΎΠΆΠ΅ΠΌ ΡƒΠ²ΠΈΠ΄Π΅Ρ‚ΡŒ ΡΠ»Π΅Π΄ΡƒΡŽΡ‰ΡƒΡŽ строчку:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π’ΠΎ Π΅ΡΡ‚ΡŒ Ρ„Π°ΠΉΠ»Ρ‹ нашСго ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° просто Π½Π΅ Π±Ρ‹Π»ΠΈ проиндСксированы.

Битуация ΡΠ»Π΅Π΄ΡƒΡŽΡ‰Π°Ρ: ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½ΠΎ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° VueJs Π΅ΡΡ‚ΡŒ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ SonarJS, ΠΊΠΎΡ‚ΠΎΡ€Ρ‹ΠΉ ΠΎΡ‚Π²Π΅Ρ‡Π°Π΅Ρ‚ Π·Π° Javascript.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Но этой ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ Π½Π΅Ρ‚ Π² ΠΏΠ»Π°Π³ΠΈΠ½Π΅ SonarTS для TS, ΠΎ Ρ‡Π΅ΠΌ Π·Π°Π²Π΅Π΄Π΅Π½ ΠΎΡ„ΠΈΡ†ΠΈΠ°Π»ΡŒΠ½Ρ‹ΠΉ Ρ‚ΠΈΠΊΠ΅Ρ‚ Π² Π±Π°Π³-Ρ‚Ρ€Π΅ΠΊΠ΅Ρ€Π΅ Sonar’а:

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

Π’ΠΎΡ‚ Π½Π΅ΠΊΠΎΡ‚ΠΎΡ€Ρ‹Π΅ ΠΎΡ‚Π²Π΅Ρ‚Ρ‹ ΠΎΠ΄Π½ΠΎΠ³ΠΎ ΠΈΠ· прСдставитСлСй со стороны Ρ€Π°Π·Ρ€Π°Π±ΠΎΡ‚Ρ‡ΠΈΠΊΠΎΠ² SonarQube, ΠΏΠΎΠ΄Ρ‚Π²Π΅Ρ€ΠΆΠ΄Π°ΡŽΡ‰ΠΈΠΉ этот Ρ„Π°ΠΊΡ‚.

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Но Ρƒ нас ΠΆΠ΅ всС Ρ€Π°Π±ΠΎΡ‚Π°Π»ΠΎ, Π²ΠΎΠ·Ρ€Π°Π·ΠΈΡ‚Π΅ Π’Ρ‹. Π”Π°, Ρ‚Π°ΠΊ ΠΈ Π΅ΡΡ‚ΡŒ, Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ β€œΠΏΠΎΡ…Π°ΠΊΠ΅Ρ€ΠΈΡ‚ΡŒβ€.
Если Π΅ΡΡ‚ΡŒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ° .vue-Ρ„Π°ΠΉΠ»ΠΎΠ² Sonar’ом, Ρ‚ΠΎ Π΄Π°Π²Π°ΠΉΡ‚Π΅ ΠΏΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΡΠΊΠ°Π·Π°Ρ‚ΡŒ Π΅ΠΌΡƒ Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΎΠ½ ΠΈΡ… рассматривал ΠΊΠ°ΠΊ Typescript.

Π”ΠΎΠ±Π°Π²ΠΈΠΌ ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€:

sonar-project.properties:

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

Запустим сканСр:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

И, вуаля, всС Π²Π΅Ρ€Π½ΡƒΠ»ΠΎΡΡŒ Π½Π° ΠΊΡ€ΡƒΠ³ΠΈ своя, ΠΈ с ΠΎΠ΄Π½ΠΈΠΌ ΠΏΡ€ΠΎΡ„ΠΈΠ»Π΅ΠΌ Ρ‚ΠΎΠ»ΡŒΠΊΠΎ для Typescript. Π’ΠΎ Π΅ΡΡ‚ΡŒ ΡƒΠ΄Π°Π»ΠΎΡΡŒ Ρ€Π΅ΡˆΠΈΡ‚ΡŒ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ Π² ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠ΅ VueJs+TS для SonarQube.

ΠŸΠΎΠΏΡ€ΠΎΠ±ΡƒΠ΅ΠΌ ΠΏΠΎΠΉΡ‚ΠΈ дальшС ΠΈ Π½Π΅ΠΌΠ½ΠΎΠ³ΠΎ ΡƒΠ»ΡƒΡ‡ΡˆΠΈΠΌ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΡŽ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ.

Π§Ρ‚ΠΎ ΠΆΠ΅ ΠΌΡ‹ сдСлали Π½Π° Π΄Π°Π½Π½Ρ‹ΠΉ ΠΌΠΎΠΌΠ΅Π½Ρ‚:

  • Π΄ΠΎΠ±Π°Π²ΠΈΠ»ΠΈ Π² ΠΏΡ€ΠΎΠ΅ΠΊΡ‚ Sonar-сканСр;
  • настроили Jest для формирования ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ;
  • сконфигурировали Sonar-сканСр;
  • Ρ€Π΅ΡˆΠΈΠ»ΠΈ ΠΏΡ€ΠΎΠ±Π»Π΅ΠΌΡƒ ΠΏΠΎΠ΄Π΄Π΅Ρ€ΠΆΠΊΠΈ .vue-Ρ„Π°ΠΉΠ»ΠΎΠ² + Typescript.

ΠšΡ€ΠΎΠΌΠ΅ покрытия тСстами Π΅ΡΡ‚ΡŒ Π΄Ρ€ΡƒΠ³ΠΈΠ΅ интСрСсныС ΠΏΠΎΠ»Π΅Π·Π½Ρ‹Π΅ ΠΊΡ€ΠΈΡ‚Π΅Ρ€ΠΈΠΈ качСства ΠΊΠΎΠ΄Π°, Π½Π°ΠΏΡ€ΠΈΠΌΠ΅Ρ€, Π΄ΡƒΠ±Π»ΠΈΡ€ΠΎΠ²Π°Π½ΠΈΠ΅ ΠΊΠΎΠ΄Π° ΠΈ количСство строк (участвуСт Π² расчСтС коэффициСнтов, связанных со ΡΠ»ΠΎΠΆΠ½ΠΎΡΡ‚ΡŒΡŽ ΠΊΠΎΠ΄Π°) ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°.

Π’ Ρ‚Π΅ΠΊΡƒΡ‰Π΅ΠΉ Ρ€Π΅Π°Π»ΠΈΠ·Π°Ρ†ΠΈΠΈ ΠΏΠ»Π°Π³ΠΈΠ½Π° для Ρ€Π°Π±ΠΎΡ‚Ρ‹ с TS (SonarTS) Π½Π΅ Π±ΡƒΠ΄Π΅Ρ‚ Ρ€Π°Π±ΠΎΡ‚Π°Ρ‚ΡŒ CPD (Copy Paste Detector) ΠΈ подсчСт строк ΠΊΠΎΠ΄Π° .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

Π£ нас ΠΊΠΎΠ½Π΅Ρ‡Π½ΠΎ ΡƒΠΏΠ°Π΄Π΅Ρ‚ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅, Π½ΠΎ сСйчас Π½Π°ΠΌ это Π½Π΅ интСрСсно.

Π’ Ρ€Π°Π·Ρ€Π΅Π·Π΅ дублирования строк ΠΊΠΎΠ΄Π° ΡƒΠ²ΠΈΠ΄ΠΈΠΌ:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Для ΠΏΡ€ΠΎΠ²Π΅Ρ€ΠΊΠΈ Π²ΠΎΡΠΏΠΎΠ»ΡŒΠ·ΡƒΠ΅ΠΌΡΡ CPD-ΡƒΡ‚ΠΈΠ»ΠΈΡ‚ΠΎΠΉ – jscpd:

npx jscpd src

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Для строк ΠΊΠΎΠ΄Π°:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π’ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎ, это Ρ€Π΅ΡˆΠΈΡ‚ΡΡ Π² Π±ΡƒΠ΄ΡƒΡ‰ΠΈΡ… вСрсиях ΠΏΠ»Π°Π³ΠΈΠ½ΠΎΠ² SonarJS(TS). Π₯ΠΎΡ‡Ρƒ Π·Π°ΠΌΠ΅Ρ‚ΠΈΡ‚ΡŒ, Ρ‡Ρ‚ΠΎ ΠΎΠ½ΠΈ постСпСнно Π½Π°Ρ‡ΠΈΠ½Π°ΡŽΡ‚ ΡΠ»ΠΈΠ²Π°Ρ‚ΡŒ эти Π΄Π²Π° ΠΏΠ»Π°Π³ΠΈΠ½Π° Π² ΠΎΠ΄ΠΈΠ½ SonarJS, Ρ‡Ρ‚ΠΎ, Π΄ΡƒΠΌΠ°ΡŽ, ΠΏΡ€Π°Π²ΠΈΠ»ΡŒΠ½ΠΎ.

Π’Π΅ΠΏΠ΅Ρ€ΡŒ Ρ…ΠΎΡ‚Π΅Π»ΠΎΡΡŒ Ρ€Π°ΡΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ Π²Π°Ρ€ΠΈΠ°Π½Ρ‚ ΡƒΠ»ΡƒΡ‡ΡˆΠ΅Π½ΠΈΡ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠΈ ΠΎ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠΈ.

Пока ΠΌΡ‹ Π²ΠΈΠ΄ΠΈΠΌ ΠΏΠΎΠΊΡ€Ρ‹Ρ‚ΠΈΠ΅ тСстами Π² ΠΏΡ€ΠΎΡ†Π΅Π½Ρ‚Π½ΠΎΠΌ ΠΎΡ‚Π½ΠΎΡˆΠ΅Π½ΠΈΠΈ, ΠΏΠΎ всСму ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, ΠΈ ΠΏΠΎ Ρ„Π°ΠΉΠ»Π°ΠΌ Π² частности. Но Π΅ΡΡ‚ΡŒ Π²ΠΎΠ·ΠΌΠΎΠΆΠ½ΠΎΡΡ‚ΡŒ Ρ€Π°ΡΡˆΠΈΡ€ΠΈΡ‚ΡŒ этот ΠΏΠΎΠΊΠ°Π·Π°Ρ‚Π΅Π»ΡŒ ΠΈΠ½Ρ„ΠΎΡ€ΠΌΠ°Ρ†ΠΈΠ΅ΠΉ ΠΎ количСствС unit-тСстов ΠΏΠΎ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Ρƒ, Π° Ρ‚Π°ΠΊΠΆΠ΅ Π² Ρ€Π°Π·Ρ€Π΅Π·Π΅ Ρ„Π°ΠΉΠ»ΠΎΠ².

Π•ΡΡ‚ΡŒ Π±ΠΈΠ±Π»ΠΈΠΎΡ‚Π΅ΠΊΠ°, которая ΡƒΠΌΠ΅Π΅Ρ‚ Jest-Ρ€Π΅ΠΏΠΎΡ€Ρ‚ ΠΊΠΎΠ½Π²Π΅Ρ€Ρ‚ΠΈΡ€ΠΎΠ²Π°Ρ‚ΡŒ Π² Ρ„ΠΎΡ€ΠΌΠ°Ρ‚ для Sonar’а:
generic test data β€” https://docs.sonarqube.org/display/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’а:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

И Π½ΠΈΡ‡Π΅Π³ΠΎ Π½Π΅ помСнялось. Π”Π΅Π»ΠΎ Π² Ρ‚ΠΎΠΌ, Ρ‡Ρ‚ΠΎ Sonar Π½Π΅ рассматриваСт Ρ„Π°ΠΉΠ»Ρ‹, описанныС Π² Jest-Ρ€Π΅ΠΏΠΎΡ€Ρ‚Π΅, ΠΊΠ°ΠΊ Ρ„Π°ΠΉΠ»Ρ‹ unit-тСстов. Для Ρ‚ΠΎΠ³ΠΎ, Ρ‡Ρ‚ΠΎΠ±Ρ‹ ΠΈΡΠΏΡ€Π°Π²ΠΈΡ‚ΡŒ эту ΡΠΈΡ‚ΡƒΠ°Ρ†ΠΈΡŽ задСйствуСм ΠΏΠ°Ρ€Π°ΠΌΠ΅Ρ‚Ρ€ ΠΊΠΎΠ½Ρ„ΠΈΠ³ΡƒΡ€Π°Ρ†ΠΈΠΈ Sonar sonar.tests, Π² ΠΊΠΎΡ‚ΠΎΡ€ΠΎΠΌ явно ΡƒΠΊΠ°ΠΆΠ΅ΠΌ ΠΏΠ°ΠΏΠΊΠΈ с тСстами (ΠΎΠ½Π° Ρƒ нас ΠΏΠΎΠΊΠ° ΠΎΠ΄Π½Π°):

sonar-project.properties:

…
sonar.tests=src/components/__tests__
…

ΠŸΠ΅Ρ€Π΅Π·Π°ΠΏΡƒΡΡ‚ΠΈΠΌ сканСр:

yarn run sonar

ΠŸΠΎΡΠΌΠΎΡ‚Ρ€ΠΈΠΌ, Ρ‡Ρ‚ΠΎ помСнялось Π² интСрфСйсС:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π’Π΅ΠΏΠ΅Ρ€ΡŒ ΠΌΡ‹ ΡƒΠ²ΠΈΠ΄Π΅Π»ΠΈ количСство Π½Π°ΡˆΠΈΡ… unit-тСстов ΠΈ, ΠΏΡ€ΠΎΠ²Π°Π»ΠΈΠ²ΡˆΠΈΡΡŒ ΠΏΠΎ ΠΊΠ»ΠΈΠΊΡƒ Π²Π½ΡƒΡ‚Ρ€ΡŒ, ΠΌΠΎΠΆΠ΅ΠΌ ΠΏΠΎΡΠΌΠΎΡ‚Ρ€Π΅Ρ‚ΡŒ распрСдСлСниС этого числа ΠΏΠΎ Ρ„Π°ΠΉΠ»Π°ΠΌ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π°:

Π˜Π½Ρ‚Π΅Π³Ρ€Π°Ρ†ΠΈΡ ΠΏΡ€ΠΎΠ΅ΠΊΡ‚Π° VueJS+TS с SonarQube

Π—Π°ΠΊΠ»ΡŽΡ‡Π΅Π½ΠΈΠ΅

Π˜Ρ‚Π°ΠΊ, ΠΌΡ‹ рассмотрСли инструмСнт для Π½Π΅ΠΏΡ€Π΅Ρ€Ρ‹Π²Π½ΠΎΠ³ΠΎ Π°Π½Π°Π»ΠΈΠ·Π° 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

Π”ΠΎΠ±Π°Π²ΠΈΡ‚ΡŒ ΠΊΠΎΠΌΠΌΠ΅Π½Ρ‚Π°Ρ€ΠΈΠΉ