SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдЖрдореНрд╣реА рдЖрдордЪреНрдпрд╛ рдХрд╛рдорд╛рдд рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рд╕рдХреНрд░рд┐рдпрдкрдгреЗ рд╡рд╛рдкрд░рддреЛ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдЙрдЪреНрдЪ рд╕реНрддрд░рд╛рд╡рд░ рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рд░рд╛рдЦрдгреНрдпрд╛рд╕рд╛рдареА. рдордзреНрдпреЗ рд▓рд┐рд╣рд┐рд▓реЗрд▓реНрдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдВрдкреИрдХреА рдПрдХ рдПрдХрддреНрд░рд┐рдд рдХрд░рддрд╛рдирд╛ VueJs+Typescript, рд╕рдорд╕реНрдпрд╛ рдирд┐рд░реНрдорд╛рдг рдЭрд╛рд▓реНрдпрд╛. рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рддреНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд╕реЗ рдХреЗрд▓реЗ рддреЗ рдореА рддреБрдореНрд╣рд╛рд▓рд╛ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╕рд╛рдВрдЧреВ рдЗрдЪреНрдЫрд┐рддреЛ.

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдкрдг рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордмрджреНрджрд▓ рдореА рд╡рд░ рд▓рд┐рд╣рд┐рд▓реНрдпрд╛рдкреНрд░рдорд╛рдгреЗ рдмреЛрд▓реВ. рдПрдХ рдЫреЛрдЯрд╛ рд╕рд┐рджреНрдзрд╛рдВрдд - рд╣реЗ рд╕рд░реНрд╡рд╕рд╛рдзрд╛рд░рдгрдкрдгреЗ рдХрд╛рдп рдЖрд╣реЗ, рдЬреЗ рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛ рдпрд╛рдмрджреНрджрд▓ рдРрдХрдд рдЖрд╣реЗрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рд╕рд╛рдареА:

рд╕реЛрдирд╛рд░рдХреНрдпреВрдм (рдорд╛рдЬреА рд╕реЛрдирд╛рд░) рд╕рддрдд рддрдкрд╛рд╕рдгреА рдЖрдгрд┐ рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдорд╛рдкрдирд╛рд╕рд╛рдареА рдПрдХ рдореБрдХреНрдд рд╕реНрд░реЛрдд рд╡реНрдпрд╛рд╕рдкреАрда рдЖрд╣реЗ.
MISRA C, MISRA C++, MITER/CWE рдЖрдгрд┐ CERT Secure Coding Standards рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдорд╛рдирдХрд╛рдВрдЪреНрдпрд╛ рдирд┐рдпрдорд╛рдВрдиреБрд╕рд╛рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдЖрдгрд┐ рддреНрд░реБрдЯреА рд╢реЛрдзрдгреНрдпрд╛рдЪреЗ рд╕рдорд░реНрдерди рдХрд░рддреЗ. рд╣реЗ OWASP рдЯреЙрдк 10 рдЖрдгрд┐ CWE/SANS рдЯреЙрдк 25 рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдПрд░рд░ рд▓рд┐рд╕реНрдЯрдордзреАрд▓ рддреНрд░реБрдЯреА рджреЗрдЦреАрд▓ рдУрд│рдЦреВ рд╢рдХрддреЗ.
рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рд╡рд┐рд╡рд┐рдз рд░реЗрдбреАрдореЗрдб рдЯреВрд▓реНрд╕ рд╡рд╛рдкрд░рдд рдЕрд╕реВрдирд╣реА, рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдзрд╛рд╡рд╛рдВрдЪрд╛ рдЗрддрд┐рд╣рд╛рд╕ рдареЗрд╡реВрди рдирд┐рдХрд╛рд▓ рдПрдХрд╛рдЪ рдбреЕрд╢рдмреЛрд░реНрдбрд╡рд░ рдХрдореА рдХрд░рддреЛ рдЖрдгрд┐ рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рддреБрдореНрд╣рд╛рд▓рд╛ рд╡рд┐рдХрд╛рд╕рд╛рджрд░рдореНрдпрд╛рди рд╕реЙрдлреНрдЯрд╡реЗрдЕрд░рдЪреНрдпрд╛ рдЧреБрдгрд╡рддреНрддреЗрддреАрд▓ рдмрджрд▓рд╛рдВрдЪрд╛ рд╕рд╛рдорд╛рдиреНрдп рдХрд▓ рдкрд╛рд╣рдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЛ.

рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓ рдпреЗрдереЗ рдЖрдврд│реВ рд╢рдХрддрд╛рдд рдЕрдзрд┐рдХреГрдд рд╡реЗрдмрд╕рд╛рдЗрдЯ

рдореЛрдареНрдпрд╛ рд╕рдВрдЦреНрдпреЗрдиреЗ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерд┐рдд рдЖрд╣реЗрдд. рд╡рд░реАрд▓ рд▓рд┐рдВрдХрд╡рд░реАрд▓ рдорд╛рд╣рд┐рддреАрдиреБрд╕рд╛рд░, рдпрд╛ 25 рдкреЗрдХреНрд╖рд╛ рдЬрд╛рд╕реНрдд рднрд╛рд╖рд╛ рдЖрд╣реЗрдд. рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖реЗрдЪреЗ рд╕рдорд░реНрдерди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдкрдг рдпреЛрдЧреНрдп рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рд╕рдореБрджрд╛рдп рдЖрд╡реГрддреНрддреАрдордзреНрдпреЗ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд▓рдЧрдЗрди рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ Javascript (type╤Бript рд╕рд╣), рдЬрд░реА рд╡рд┐рдХреА рдЙрд▓рдЯ рдореНрд╣рдгрддреЛ. рдорд╛рдЧреЗ Javascript рдкреНрд▓рдЧрдЗрди рдЙрддреНрддрд░реЗ рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕, Typescript рд╕рд╛рдареА рд╕реЛрдирд╛рд░рдЯреАрдПрд╕ рдЕрдиреБрдХреНрд░рдореЗ

рдЕрдзрд┐рдХреГрдд рдХреНрд▓рд╛рдпрдВрдЯрдЪрд╛ рд╡рд╛рдкрд░ рдХрд╡реНрд╣рд░реЗрдЬ рдорд╛рд╣рд┐рддреА рдкрд╛рдард╡рдгреНрдпрд╛рд╕рд╛рдареА рдХреЗрд▓рд╛ рдЬрд╛рддреЛ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм-рд╕реНрдХреЕрдирд░, рдЬреЗ, рдкрд╛рд╕реВрди рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рд╡рд╛рдкрд░реВрди рдХреЙрдиреНрдлрд┐рдЧрд░-рдлрд╛рдЗрд▓, рд╣рд╛ рдбреЗрдЯрд╛ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдкрд╛рдард╡рддреЗ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдкреБрдвреАрд▓ рдПрдХрддреНрд░реАрдХрд░рдг рдЖрдгрд┐ рдПрдХрддреНрд░реАрдХрд░рдгрд╛рд╕рд╛рдареА.

рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА Javascript рдЖрд╣реЗ рдПрдирдкреАрдПрдо рд░реЕрдкрд░. рддрд░, рдЪрд░рдг-рджрд░-рдЪрд░рдг рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреА рд╕реБрд░реВ рдХрд░реВрдпрд╛ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм ╨▓ рд╡реНрд╣реНрдпреВ- рдкреНрд░рдХрд▓реНрдк рд╡рд╛рдкрд░реВрди рдкреНрд░рдХрд╛рд░.

рд╕рд░реНрд╡реНрд╣рд░ рдЙрдкрдпреЛрдЬрд┐рдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдЪрд▓рд╛ рдлрд╛рдпрджрд╛ рдШреЗрдКрдпрд╛ рдбреЙрдХрд░-рдХрдВрдкреЛрдЬ.

рд╕реЛрдирд╛рд░.рдпрд╛рдорд▓:

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

рд▓рд╛рдБрдЪ:

docker-compose -f sonar.yml up

рдпрд╛рдирдВрддрд░ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдпреЗрдереЗ рдЙрдкрд▓рдмреНрдз рд╣реЛрдИрд▓: http://localhost:9001 .

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг
рддреНрдпрд╛рдд рдЕрджреНрдпрд╛рдк рдХреЛрдгрддреЗрд╣реА рдкреНрд░рдХрд▓реНрдк рдирд╛рд╣реАрдд рдЖрдгрд┐ рддреЗ рдпреЛрдЧреНрдп рдЖрд╣реЗ. рдЖрдореНрд╣реА рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреА рджреБрд░реБрд╕реНрдд рдХрд░реВ. рдореА рдЕрдзрд┐рдХреГрдд рдЙрджрд╛рд╣рд░рдг рдкреНрд░рдХрд▓реНрдк рдШреЗрддрд▓рд╛ VueJS+TS+рдЬреЗрд╕реНрдЯ. рдЪрд▓рд╛ рддреЗ рд╕реНрд╡рддрдГрдХрдбреЗ рд╡рд╛рдХрд╡реВрдпрд╛:

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

рдкреНрд░рдердо рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХреНрд▓рд╛рдпрдВрдЯ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм, рдЬреНрдпрд╛рд╕ рдореНрд╣рдВрдЯрд▓реЗ рдЬрд╛рддреЗ рд╕реЛрдирд╛рд░-рд╕реНрдХреЕрдирд░рд╕рд╛рдареА 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 - рдкрддреНрддрд╛ рд╕реЛрдирд╛рд░'рдЕ;
  • sonar.projectKey - рд╕рд░реНрд╡реНрд╣рд░рд╡рд░ рдЕрджреНрд╡рд┐рддреАрдп рдкреНрд░рдХрд▓реНрдк рдЕрднрд┐рдЬреНрдЮрд╛рдкрдХ рд╕реЛрдирд╛рд░'рдЕ;
  • sonar.projectName - рддреНрдпрд╛рдЪреЗ рдирд╛рд╡, рддреЗ рдХрдзреАрд╣реА рдмрджрд▓рд▓реЗ рдЬрд╛рдК рд╢рдХрддреЗ, рдХрд╛рд░рдг рдкреНрд░рдХрд▓реНрдкрд╛рджреНрд╡рд╛рд░реЗ рдУрд│рдЦрд▓реЗ рдЬрд╛рддреЗ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдХреА;
  • рд╕реЛрдирд╛рд░.рд╕реНрд░реЛрдд - рд╕реНрддреНрд░реЛрддрд╛рдВрд╕рд╣ рдлреЛрд▓реНрдбрд░, рд╕рд╣рд╕рд╛ рд╣реЗ Src, рдкрдг рдХрд╛рд╣реАрд╣реА рдЕрд╕реВ рд╢рдХрддреЗ. рд╣реЗ рдлреЛрд▓реНрдбрд░ рд░реВрдЯ рдлреЛрд▓реНрдбрд░рдЪреНрдпрд╛ рд╕рд╛рдкреЗрдХреНрд╖ рд╕реЗрдЯ рдХреЗрд▓реЗ рдЖрд╣реЗ, рддреЗ рдлреЛрд▓реНрдбрд░ рдЬреНрдпрд╛рдордзреВрди рд╕реНрдХреЕрдирд░ рд▓рд╛рдБрдЪ рдХреЗрд▓реЗ рдЬрд╛рддреЗ;
  • рд╕реЛрдирд╛рд░.рдЪрд╛рдЪрдгреНрдпрд╛ - рдПрдХ рдкреЕрд░рд╛рдореАрдЯрд░ рдЬреЛ рдорд╛рдЧреАрд▓ рдПрдХрд╛рдЪреНрдпрд╛ рдмрд░реЛрдмрд░реАрдиреЗ рдЬрд╛рддреЛ. рд╣реЗ рдлреЛрд▓реНрдбрд░ рдЖрд╣реЗ рдЬреЗрдереЗ рдЪрд╛рдЪрдгреНрдпрд╛ рдЖрд╣реЗрдд. рдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдд, рдЕрд╕реЗ рдХреЛрдгрддреЗрд╣реА рдлреЛрд▓реНрдбрд░ рдирд╛рд╣реА рдЖрдгрд┐ рдЪрд╛рдЪрдгреА рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рддрдкрд╛рд╕рд▓реНрдпрд╛ рдЬрд╛рдд рдЕрд╕рд▓реЗрд▓реНрдпрд╛ рдШрдЯрдХрд╛рдЪреНрдпрд╛ рд╢реЗрдЬрд╛рд░реА рд╕реНрдерд┐рдд рдЖрд╣реЗ.рдЪрд╛рдЪрдгреА', рдореНрд╣рдгреВрди рдЖрдореНрд╣реА рд╕рдзреНрдпрд╛ рддреНрдпрд╛рдХрдбреЗ рджреБрд░реНрд▓рдХреНрд╖ рдХрд░реВ рдЖрдгрд┐ рдкреБрдвреАрд▓ рдкреЕрд░рд╛рдореАрдЯрд░ рд╡рд╛рдкрд░реВ;
  • sonar.test.inclusion - рдореБрдЦрд╡рдЯрд╛ рд╡рд╛рдкрд░реВрди рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╛рдареА рдорд╛рд░реНрдЧ, рд╕реНрд╡рд▓реНрдкрд╡рд┐рд░рд╛рдорд╛рдиреЗ рд╡рд┐рднрдХреНрдд рдХреЗрд▓реЗрд▓реЗ рдЕрдиреЗрдХ рдШрдЯрдХ рдЕрд╕реВ рд╢рдХрддрд╛рдд;
  • sonar.source рдПрдиреНрдХреЛрдбрд┐рдВрдЧ - рд╕реНрддреНрд░реЛрдд рдлрд╛рдпрд▓реАрдВрд╕рд╛рдареА рдПрдиреНрдХреЛрдбрд┐рдВрдЧ.

рд╕реНрдХреЕрдирд░рдЪреНрдпрд╛ рдкрд╣рд┐рд▓реНрдпрд╛ рд▓рд╛рдБрдЪрд╕рд╛рдареА, рдореБрдЦреНрдп рдЖрдзреАрдЪреНрдпрд╛ рдХреНрд░рд┐рдпреЗрд╢рд┐рд╡рд╛рдп рд╕рд░реНрд╡ рдХрд╛рд╣реА рддрдпрд╛рд░ рдЖрд╣реЗ: рдЪрд╛рдЪрдгреА рдЗрдВрдЬрд┐рди рд╕реНрд╡рддрдГ рд▓рд╛рдБрдЪ рдХрд░рдгреЗ, рдЬреЗрдгреЗрдХрд░реВрди рддреЗ рдХрд╡реНрд╣рд░реЗрдЬрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░реВ рд╢рдХреЗрд▓, рдЬреЗ рд╕реНрдХреЕрдирд░ рдирдВрддрд░ рд╡рд╛рдкрд░реЗрд▓.

рдкрд░рдВрддреБ рд╣реЗ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рддреБрдореНрд╣рд╛рд▓рд╛ рд╣реА рдорд╛рд╣рд┐рддреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдЪрд╛рдЪрдгреА рдЗрдВрдЬрд┐рди рдХреЙрдиреНрдлрд┐рдЧрд░ рдХрд░рдгреЗ рдЖрд╡рд╢реНрдпрдХ рдЖрд╣реЗ. рдпрд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдд, рдЪрд╛рдЪрдгреА рдЗрдВрдЬрд┐рди рдЖрд╣реЗ рдЖрд╣реЗ. рдЖрдгрд┐ рддреНрдпрд╛рдЪреА рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдлрд╛рдЗрд▓рдЪреНрдпрд╛ рд╕рдВрдмрдВрдзрд┐рдд рд╡рд┐рднрд╛рдЧрд╛рдд рдЖрд╣реЗрдд package.json.

рдЪрд▓рд╛ рдпрд╛ рд╕реЗрдЯрд┐рдВрдЧреНрдЬ рдЬреЛрдбреВрдпрд╛:

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

рдореНрд╣рдгрдЬреЗрдЪ, рдЖрдореНрд╣реА рдХрд╡реНрд╣рд░реЗрдЬ рдЖрдгрд┐ рд╕реНрддреНрд░реЛрдд (рдЕрдкрд╡рд╛рджрд╛рдВрд╕рд╣) рдЬреНрдпрд╛рдЪреНрдпрд╛ рдЖрдзрд╛рд░реЗ рддреЗ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдпрд╛рдЪреА рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдЧрд░рдЬреЗрд╕рд╛рдареА рдзреНрд╡рдЬ рд╕реНрд╡рддрдГ рд╕реЗрдЯ рдХрд░рддреЛ.

рдЖрддрд╛ рдЪрд╛рдЪрдгреА рдЪрд╛рд▓рд╡реВ:

yarn test

рдЖрдкрдг рдкреБрдвреАрд▓ рдЧреЛрд╖реНрдЯреА рдкрд╛рд╣реВ.

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдХрд╛рд░рдг рдШрдЯрдХрд╛рдордзреНрдпреЗрдЪ рдХреЛрдб рдирд╛рд╣реА. рдЪрд▓рд╛ рд╣реЗ рджреБрд░реБрд╕реНрдд рдХрд░реВрдпрд╛.

HelloWorld.vue:

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

рдХрд╡реНрд╣рд░реЗрдЬрдЪреА рдЧрдгрдирд╛ рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рд╣реЗ рдкреБрд░реЗрд╕реЗ рдЕрд╕реЗрд▓.

рдЪрд╛рдЪрдгреА рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдпрд╛рдЪреА рдЦрд╛рддреНрд░реА рдХрд░реВ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рд╕реНрдХреНрд░реАрдирд╡рд░ рдЖрдкрд▓реНрдпрд╛рд▓рд╛ рдХрд╡реНрд╣рд░реЗрдЬрдмрджреНрджрд▓ рдорд╛рд╣рд┐рддреА рджрд┐рд╕рд▓реА рдкрд╛рд╣рд┐рдЬреЗ рдЖрдгрд┐ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдлреЛрд▓реНрдбрд░рдордзреНрдпреЗ рдПрдХ рдлреЛрд▓реНрдбрд░ рддрдпрд╛рд░ рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рдХрд╡реНрд╣рд░реЗрдЬ рд╕рд╛рд░реНрд╡рддреНрд░рд┐рдХ рд╕реНрд╡рд░реВрдкрд╛рдд рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рдорд╛рд╣рд┐рддреАрд╕рд╣ LCOV (LTP GCOV рд╡рд┐рд╕реНрддрд╛рд░).

Gcov рдХреЛрдб рдХрд╡реНрд╣рд░реЗрдЬ рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдореБрдХреНрддрдкрдгреЗ рд╡рд┐рддрд░рд┐рдд рдЙрдкрдпреБрдХреНрддрддрд╛ рдЖрд╣реЗ. Gcov рдкреНрд░реЛрдЧреНрд░реЕрдордордзреАрд▓ рдкреНрд░рддреНрдпреЗрдХ рд╡рд┐рдзрд╛рдирд╛рд╕рд╛рдареА рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдЪреА рдЕрдЪреВрдХ рд╕рдВрдЦреНрдпрд╛ рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рддреЗ рдЖрдгрд┐ рддреБрдореНрд╣рд╛рд▓рд╛ рд╕реНрддреНрд░реЛрдд рдХреЛрдбрдордзреНрдпреЗ рднрд╛рд╖реНрдп рдЬреЛрдбрдгреНрдпрд╛рдЪреА рдкрд░рд╡рд╛рдирдЧреА рджреЗрддреЗ. GCC рдкреЕрдХреЗрдЬрдЪрд╛ рднрд╛рдЧ рдореНрд╣рдгреВрди Gcov рдПрдХ рдорд╛рдирдХ рдЙрдкрдпреБрдХреНрддрддрд╛ рдореНрд╣рдгреВрди рдпреЗрддреЗ.
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, рддреНрдпрд╛рджреНрд╡рд╛рд░реЗ рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖реЗрдЪреА рдЧрдгрдирд╛ рдХреЗрд▓реА рдЬрд╛рддреЗ. рддреНрдпрд╛рдЪреНрдпрд╛ рдСрдкрд░реЗрд╢рдирд╕рд╛рдареА рд╡рд┐рд╡рд┐рдз рдЗрддрд░ рдорд╛рдкрджрдВрдб рджреЗрдЦреАрд▓ рд▓реЛрдб рдХреЗрд▓реЗ рдЖрд╣реЗрдд: рдЧреБрдгрд╡рддреНрддрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓, рд╕рдХреНрд░рд┐рдп рдирд┐рдпрдо, рдореЗрдЯреНрд░рд┐рдХреНрд╕ рднрд╛рдВрдбрд╛рд░, рд╕рд░реНрд╡реНрд╣рд░ рдирд┐рдпрдо.

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдЯреАрдк: рдЖрдореНрд╣реА рдпрд╛ рд▓реЗрдЦрд╛рдЪреНрдпрд╛ рдЪреМрдХрдЯреАрдд рддреНрдпрд╛рдВрдЪреНрдпрд╛рдмрджреНрджрд▓ рддрдкрд╢реАрд▓рд╡рд╛рд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдгрд╛рд░ рдирд╛рд╣реА, рдкрд░рдВрддреБ рдЖрдкрдг рдиреЗрд╣рдореА рдЕрдзрд┐рдХреГрдд рд╕реНрддреНрд░реЛрддрд╛рдВрд╢реА рд╕рдВрдкрд░реНрдХ рд╕рд╛рдзреВ рд╢рдХрддрд╛.

рдкреБрдвреЗ, рдлреЛрд▓реНрдбрд░рдЪреЗ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реБрд░реВ рд╣реЛрддреЗ Src рд╕рд░реНрд╡рд╛рдВрд╕рд╛рдареА рд╕реНрддреНрд░реЛрдд рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рдЙрдкрд▓рдмреНрдзрддреЗрд╕рд╛рдареА (рдПрдЦрд╛рджреА рд╡рд┐рд╢рд┐рд╖реНрдЯ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реА рдирд╕рд▓реНрдпрд╛рд╕) рд╕рдорд░реНрдерд┐рдд рднрд╛рд╖рд╛, рддреНрдпрд╛рдВрдЪреНрдпрд╛ рддреНрдпрд╛рдирдВрддрд░рдЪреНрдпрд╛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХреЗрд╕рд╣.

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдкреБрдвреЗ рдЗрддрд░ рд╡рд┐рд╡рд┐рдз рд╡рд┐рд╢реНрд▓реЗрд╖рдгреЗ рдпреЗрддрд╛рдд, рдЬреНрдпрд╛рд╡рд░ рдЖрдореНрд╣реА рдпрд╛ рд▓реЗрдЦрд╛рдд рд▓рдХреНрд╖ рдХреЗрдВрджреНрд░рд┐рдд рдХрд░рдд рдирд╛рд╣реА (рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рд▓рд┐рдВрдЯрд┐рдВрдЧ, рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрд╢рди рд╢реЛрдзрдгреЗ рдЗ.).

рд╕реНрдХреЕрдирд░рдЪреНрдпрд╛ рдХрд╛рдорд╛рдЪреНрдпрд╛ рдЕрдЧрджреА рд╢реЗрд╡рдЯреА, рд╕рд░реНрд╡ рдЧреЛрд│рд╛ рдХреЗрд▓реЗрд▓реА рдорд╛рд╣рд┐рддреА рдПрдХрддреНрд░рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ, рд╕рдВрдЧреНрд░рд╣рд┐рдд рдХреЗрд▓реА рдЬрд╛рддреЗ рдЖрдгрд┐ рд╕рд░реНрд╡реНрд╣рд░рд▓рд╛ рдкрд╛рдард╡рд┐рд▓реА рдЬрд╛рддреЗ.

рдпрд╛рдирдВрддрд░, рд╡реЗрдм рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдХрд╛рдп рдЭрд╛рд▓реЗ рддреЗ рдЖрдореНрд╣реА рдЖрдзреАрдЪ рдкрд╛рд╣реВ рд╢рдХрддреЛ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдЬрд╕реЗ рдЖрдкрдг рдкрд╛рд╣реВ рд╢рдХрддреЛ, рдХрд╛рд╣реАрддрд░реА рдХрд╛рд░реНрдп рдХреЗрд▓реЗ, рдЖрдгрд┐ рдХрд╛рд╣реА рдкреНрд░рдХрд╛рд░рдЪреЗ рдХрд╡реНрд╣рд░реЗрдЬ рджреЗрдЦреАрд▓ рджрд░реНрд╢рд╡рддреЗ, рдкрд░рдВрддреБ рддреЗ рдЖрдкрд▓реНрдпрд╛рд╢реА рдЬреБрд│рдд рдирд╛рд╣реА рдЖрд╣реЗ- рдЕрд╣рд╡рд╛рд▓.

рдЪрд▓рд╛ рддреЗ рдмрд╛рд╣реЗрд░ рдХрд╛рдвреВрдпрд╛. рдЪрд▓рд╛ рдкреНрд░рдХрд▓реНрдкрд╛рдХрдбреЗ рдЕрдзрд┐рдХ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдкрд╛рд╣реВ, рдХрд╡реНрд╣рд░реЗрдЬ рдореВрд▓реНрдпрд╛рд╡рд░ рдХреНрд▓рд┐рдХ рдХрд░рд╛ рдЖрдгрд┐ рддрдкрд╢реАрд▓рд╡рд╛рд░ рдлрд╛рдЗрд▓ рдЕрд╣рд╡рд╛рд▓рд╛рдд "рдлреЙрд▓ рдереНрд░реВ":

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдпреЗрдереЗ рдЖрдкрдг рдореБрдЦреНрдп рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рддрдкрд╛рд╕рд▓реЗрд▓реА рдлрд╛рдЗрд▓ рдкрд╛рд╣рддреЛ HelloWorld.vue, рдПрдХ рдлрд╛рдЗрд▓ рджреЗрдЦреАрд▓ рдЖрд╣реЗ main.ts, рдЬреЗ рдХрд╡реНрд╣рд░реЗрдЬрдЪреЗ рд╕рдВрдкреВрд░реНрдг рдЪрд┐рддреНрд░ рдЦрд░рд╛рдм рдХрд░рддреЗ. рдкрдг рдХрд╡реНрд╣рд░реЗрдЬрдЪреНрдпрд╛ рдЧрдгрдиреЗрддреВрди рдЖрдореНрд╣реА рддреЗ рдХрд╕реЗ рд╡рдЧрд│рд▓реЗ. рд╣реЛрдп, рд╕рд░реНрд╡рдХрд╛рд╣реА рдмрд░реЛрдмрд░ рдЖрд╣реЗ, рдкрд░рдВрддреБ рддреЗ рд╕реНрддрд░рд╛рд╡рд░ рд╣реЛрддреЗ рдЖрд╣реЗ, рдкрд░рдВрддреБ рд╕реНрдХреЕрдирд░рдиреЗ рддреЗ рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗрд▓реЗ, рдореНрд╣рдгреВрди рддреЗ рддреНрдпрд╛рдЪреНрдпрд╛ рдЧрдгрдиреЗрдд рд╕рдВрдкрд▓реЗ.

рдЪрд▓рд╛ рдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░реВрдпрд╛:

sonar-project.properties:

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

рдореА рдПрдХ рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рджреЗрдК рдЗрдЪреНрдЫрд┐рддреЛ: рдпрд╛ рдкреЕрд░рд╛рдореАрдЯрд░рдордзреНрдпреЗ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлреЛрд▓реНрдбрд░реНрд╕ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдкреЕрд░рд╛рдореАрдЯрд░рдордзреНрдпреЗ рд╕реВрдЪреАрдмрджреНрдз рдХреЗрд▓реЗрд▓реЗ рд╕рд░реНрд╡ рдлреЛрд▓реНрдбрд░ рджреЗрдЦреАрд▓ рдЬреЛрдбрд▓реЗ рдЖрд╣реЗрдд sonar.test.inclusion.

рд╕реНрдХреЕрдирд░ рд▓рд╛рдБрдЪ рдХреЗрд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣рд╛рд▓рд╛ рдпреЛрдЧреНрдп рдорд╛рд╣рд┐рддреА рджрд┐рд╕рддреЗ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдкреБрдврдЪрд╛ рдореБрджреНрджрд╛ рдкрд╛рд╣реВ - рджрд░реНрдЬреЗрджрд╛рд░ рдкреНрд░реЛрдлрд╛рдЗрд▓. рдореА рд╡рд░ рд╕рдорд░реНрдердирд╛рдмрджреНрджрд▓ рдмреЛрд▓рд▓реЛ рд╕реЛрдирд╛рд░рдПрдХрд╛рдЪ рд╡реЗрд│реА рдЕрдиреЗрдХ рднрд╛рд╖рд╛. рдиреЗрдордХреЗ рд╣реЗрдЪ рдЖрдкрдг рдкрд╛рд╣рдд рдЖрд╣реЛрдд. рдкрдг рдЖрдореНрд╣рд╛рд▓рд╛ рдорд╛рд╣рд┐рдд рдЖрд╣реЗ рдХреА рдЖрдордЪрд╛ рдкреНрд░рдХрд▓реНрдк рддреНрдпрд╛рдд рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдЖрд╣реЗ TS, рдордЧ рд╕реНрдХреЕрдирд░рд▓рд╛ рдЕрдирд╛рд╡рд╢реНрдпрдХ рдлреЗрд░рдлрд╛рд░ рдЖрдгрд┐ рддрдкрд╛рд╕рдгреНрдпрд╛ рдХрд╛ рддрд╛рдг рджреНрдпрд╛. рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдлрд╛рдЗрд▓рдордзреНрдпреЗ рдЖрдгрдЦреА рдПрдХ рдкреЕрд░рд╛рдореАрдЯрд░ рдЬреЛрдбреВрди рдЖрдореНрд╣реА рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рднрд╛рд╖рд╛ рд╕реЗрдЯ рдХрд░реВ рд╕реЛрдирд╛рд░'рдЕ:

sonar-project.properties:

...
sonar.language=ts
...

рдЪрд▓рд╛ рд╕реНрдХреЕрдирд░ рдкреБрдиреНрд╣рд╛ рдЪрд╛рд▓рд╡реВ рдЖрдгрд┐ рдкрд░рд┐рдгрд╛рдо рдкрд╛рд╣реВ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдХрд╡реНрд╣рд░реЗрдЬ рдкреВрд░реНрдгрдкрдгреЗ рдЧреЗрд▓реЗ рд╣реЛрддреЗ.

рдЖрдкрдг рд╕реНрдХреЕрдирд░ рд▓реЙрдЧ рдкрд╛рд╣рд┐рд▓реНрдпрд╛рд╕, рдЖрдкрдг рдЦрд╛рд▓реАрд▓ рдУрд│ рдкрд╛рд╣реВ рд╢рдХрддреЛ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдореНрд╣рдгрдЬреЗрдЪ, рдЖрдордЪреНрдпрд╛ рдкреНрд░рдХрд▓реНрдк рдлрд╛рдЗрд▓реНрд╕ рдлрдХреНрдд рдЕрдиреБрдХреНрд░рдорд┐рдд рдХреЗрд▓реНрдпрд╛ рдЧреЗрд▓реНрдпрд╛ рдирд╛рд╣реАрдд.

рдкрд░рд┐рд╕реНрдерд┐рддреА рдЦрд╛рд▓реАрд▓рдкреНрд░рдорд╛рдгреЗ рдЖрд╣реЗ: рдЕрдзрд┐рдХреГрддрдкрдгреЗ рд╕рдорд░реНрдерд┐рдд VueJs рдкреНрд▓рдЧрдЗрдирдордзреНрдпреЗ рдЖрд╣реЗ рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕рдХреЛрдг рдЬрдмрд╛рдмрджрд╛рд░ рдЖрд╣реЗ Javascript.

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдкрд░рдВрддреБ рд╣реЗ рд╕рдорд░реНрдерди рдкреНрд▓рдЧрдЗрдирдордзреНрдпреЗ рдирд╛рд╣реА рд╕реЛрдирд╛рд░рдЯреАрдПрд╕ рддреЗ TS, рдЬреНрдпрд╛рдмрджреНрджрд▓ рдмрдЧ рдЯреНрд░реЕрдХрд░рдордзреНрдпреЗ рдЕрдзрд┐рдХреГрдд рддрд┐рдХреАрдЯ рдЙрдШрдбрд▓реЗ рд╣реЛрддреЗ рд╕реЛрдирд╛рд░'рдЕ:

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

рдпрд╛ рд╡рд╕реНрддреБрд╕реНрдерд┐рддреАрдЪреА рдкреБрд╖реНрдЯреА рдХрд░рдгрд╛рд░реА рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдбреЗрд╡реНрд╣рд▓рдкрд░рдЪреНрдпрд╛ рдкреНрд░рддрд┐рдирд┐рдзреАрдВрдкреИрдХреА рдПрдХрд╛рдЪреА рдХрд╛рд╣реА рдЙрддреНрддрд░реЗ рдпреЗрдереЗ рдЖрд╣реЗрдд.

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдкрд░рдВрддреБ рд╕рд░реНрд╡ рдХрд╛рд╣реА рдЖрдордЪреНрдпрд╛рд╕рд╛рдареА рдХрд╛рд░реНрдп рдХрд░рддреЗ, рддреБрдордЪрд╛ рдЖрдХреНрд╖реЗрдк рдЖрд╣реЗ. рд╣реЛрдп, рддреЗ рдереЛрдбреЗ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ "рдЦрд╛рдЪ".
рдЖрдзрд╛рд░ рдЕрд╕реЗрд▓ рддрд░ .vue-рдлрд╛рдИрд▓реНрд╕ рд╕реЛрдирд╛рд░'рдЕрд░реЗ, рдордЧ рдЖрдкрдг рддреНрдпрд╛рд▓рд╛ рддреНрдпрд╛рдВрдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛рдпрд▓рд╛ рд╕рд╛рдВрдЧрдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ рдкреНрд░рдХрд╛рд░.

рдЪрд▓рд╛ рдПрдХ рдкреЕрд░рд╛рдореАрдЯрд░ рдЬреЛрдбреВрдпрд╛:

sonar-project.properties:

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

рдЪрд▓рд╛ рд╕реНрдХреЕрдирд░ рд▓рд╛рдБрдЪ рдХрд░реВрдпрд╛:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдЖрдгрд┐, рд╡реНрд╣реЙрдЗрд▓рд╛, рд╕рд░реНрд╡ рдХрд╛рд╣реА рд╕рд╛рдорд╛рдиреНрдп рдЭрд╛рд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдлрдХреНрдд рдПрдХрд╛ рдкреНрд░реЛрдлрд╛рдЗрд▓рд╕рд╣ рдкреНрд░рдХрд╛рд░. рдореНрд╣рдгрдЬреЗрдЪ, рдЖрдореНрд╣реА рд╕рдорд░реНрдердирд╛рдордзреНрдпреЗ рд╕рдорд╕реНрдпреЗрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХрд░рдгреНрдпрд╛рдд рд╡реНрдпрд╡рд╕реНрдерд╛рдкрд┐рдд рдХреЗрд▓реЗ VueJs+TS рддреЗ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм.

рдЪрд▓рд╛ рдЖрдгрдЦреА рдкреБрдвреЗ рдЬрд╛рдгреНрдпрд╛рдЪрд╛ рдкреНрд░рдпрддреНрди рдХрд░реВрдпрд╛ рдЖрдгрд┐ рдХрд╡реНрд╣рд░реЗрдЬ рдорд╛рд╣рд┐рддреАрдордзреНрдпреЗ рдереЛрдбреА рд╕реБрдзрд╛рд░рдгрд╛ рдХрд░реВрдпрд╛.

рдЖрдореНрд╣реА рдЖрддрд╛рдкрд░реНрдпрдВрдд рдХрд╛рдп рдХреЗрд▓реЗ рдЖрд╣реЗ:

  • рдкреНрд░рдХрд▓реНрдкрд╛рдд рдЬреЛрдбрд▓реЗ рд╕реЛрдирд╛рд░- рд╕реНрдХреЕрдирд░;
  • рд╕реЗрдЯ рдХрд░рд╛ рдЖрд╣реЗ рдХрд╡реНрд╣рд░реЗрдЬ рдорд╛рд╣рд┐рддреА рд╡реНрдпреБрддреНрдкрдиреНрди рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА;
  • рдХреЙрдиреНрдлрд┐рдЧрд░ рдХреЗрд▓реЗ рд╕реЛрдирд╛рд░- рд╕реНрдХреЕрдирд░;
  • рд╕рдорд░реНрдерди рд╕рдорд╕реНрдпрд╛ рд╕реЛрдбрд╡рд▓реА .vue-рдлрд╛рдИрд▓реНрд╕ + рдкреНрд░рдХрд╛рд░.

рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рд╡реНрдпрддрд┐рд░рд┐рдХреНрдд, рдХреЛрдб рдЧреБрдгрд╡рддреНрддреЗрд╕рд╛рдареА рдЗрддрд░ рдордиреЛрд░рдВрдЬрдХ рдЙрдкрдпреБрдХреНрдд рдирд┐рдХрд╖ рдЖрд╣реЗрдд, рдЙрджрд╛рд╣рд░рдгрд╛рд░реНрде, рдХреЛрдб рдбреБрдкреНрд▓рд┐рдХреЗрд╢рди рдЖрдгрд┐ рдкреНрд░рдХрд▓реНрдкрд╛рдЪреНрдпрд╛ рдУрд│реАрдВрдЪреА рд╕рдВрдЦреНрдпрд╛ (рдХреЛрдб рдЬрдЯрд┐рд▓рддреЗрд╢реА рд╕рдВрдмрдВрдзрд┐рдд рдЧреБрдгрд╛рдВрдХрд╛рдВрдЪреНрдпрд╛ рдЧрдгрдиреЗрдордзреНрдпреЗ рд╕рдорд╛рд╡рд┐рд╖реНрдЯ рдЖрд╣реЗ).

рд╕рд╣ рдХрд╛рд░реНрдп рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА рдкреНрд▓рдЧрдЗрдирдЪреНрдпрд╛ рд╕рдзреНрдпрд╛рдЪреНрдпрд╛ рдЕрдВрдорд▓рдмрдЬрд╛рд╡рдгреАрдордзреНрдпреЗ TS (рд╕реЛрдирд╛рд░рдЯреАрдПрд╕) рдХрд╛рдо рдХрд░рдгрд╛рд░ рдирд╛рд╣реА 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

рдЕрд░реНрдерд╛рдд, рдЖрдордЪреЗ рдХрд╡реНрд╣рд░реЗрдЬ рдХрдореА рд╣реЛрдИрд▓, рдкрд░рдВрддреБ рдЖрддрд╛ рдЖрдореНрд╣рд╛рд▓рд╛ рддреНрдпрд╛рдд рд░рд╕ рдирд╛рд╣реА.

рдХреЛрдбрдЪреНрдпрд╛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рдУрд│реАрдВрдЪреНрдпрд╛ рдмрд╛рдмрддреАрдд, рдЖрдореНрд╣реА рдкрд╛рд╣реВ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рддрдкрд╛рд╕рдгреНрдпрд╛рд╕рд╛рдареА рдЖрдореНрд╣реА рд╡рд╛рдкрд░реВ рд╕реАрдкреАрдбреАрдЙрдкрдпреБрдХреНрддрддрд╛ - jscpd:

npx jscpd src

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдХреЛрдбрдЪреНрдпрд╛ рдУрд│реАрдВрд╕рд╛рдареА:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдХрджрд╛рдЪрд┐рдд рднрд╡рд┐рд╖реНрдпрд╛рддреАрд▓ рдкреНрд▓рдЧрдЗрди рдЖрд╡реГрддреНрддреНрдпрд╛рдВрдордзреНрдпреЗ рдпрд╛рдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХреЗрд▓реЗ рдЬрд╛рдИрд▓ рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕(рдЯреАрдПрд╕). рдорд▓рд╛ рд╣реЗ рд▓рдХреНрд╖рд╛рдд рдШреНрдпрд╛рдпрдЪреЗ рдЖрд╣реЗ рдХреА рддреЗ рд╣рд│реВрд╣рд│реВ рд╣реЗ рджреЛрди рдкреНрд▓рдЧрдЗрди рдПрдХрд╛рдордзреНрдпреЗ рд╡рд┐рд▓реАрди рдХрд░реВ рд▓рд╛рдЧрд▓реЗ рдЖрд╣реЗрдд рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕, рдЬреЗ рдорд▓рд╛ рдпреЛрдЧреНрдп рд╡рд╛рдЯрддреЗ.

рдЖрддрд╛ рдорд▓рд╛ рдХрд╡реНрд╣рд░реЗрдЬ рдорд╛рд╣рд┐рддреА рд╕реБрдзрд╛рд░рдгреНрдпрд╛рдЪреНрдпрд╛ рдкрд░реНрдпрд╛рдпрд╛рдЪрд╛ рд╡рд┐рдЪрд╛рд░ рдХрд░рд╛рдпрдЪрд╛ рд╣реЛрддрд╛.

рдЖрддрд╛рдкрд░реНрдпрдВрдд рдЖрдореНрд╣реА рд╕рдВрдкреВрд░реНрдг рдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рдЖрдгрд┐ рд╡рд┐рд╢реЗрд╖рддрдГ рдлрд╛рдЗрд▓реНрд╕рд╕рд╛рдареА рдЯрдХреНрдХреЗрд╡рд╛рд░реАрдЪреНрдпрд╛ рджреГрд╖реНрдЯреАрдиреЗ рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рдкрд╛рд╣реВ рд╢рдХрддреЛ. рдкрд░рдВрддреБ рдкреНрд░рдорд╛рдгрд╛рдмрджреНрджрд▓рдЪреНрдпрд╛ рдорд╛рд╣рд┐рддреАрд╕рд╣ рд╣реЗ рд╕реВрдЪрдХ рд╡рд┐рд╕реНрддреГрдд рдХрд░рдгреЗ рд╢рдХреНрдп рдЖрд╣реЗ рдпреБрдирд┐рдЯрдкреНрд░рдХрд▓реНрдкрд╛рд╕рд╛рдареА рддрд╕реЗрдЪ рдлрд╛рдЗрд▓реНрд╕рдЪреНрдпрд╛ рд╕рдВрджрд░реНрднрд╛рдд рдЪрд╛рдЪрдгреА.

рдХрд░реВ рд╢рдХрддреАрд▓ рдЕрд╢реА рд▓рд╛рдпрдмреНрд░рд░реА рдЖрд╣реЗ рдЖрд╣реЗ- рдЕрд╣рд╡рд╛рд▓ рдлреЙрд░рдореЕрдЯрдордзреНрдпреЗ рд░реВрдкрд╛рдВрддрд░рд┐рдд рдХрд░рд╛ рд╕реЛрдирд╛рд░'рдЕ:
рд╕рд╛рдорд╛рдиреНрдп рдЪрд╛рдЪрдгреА рдбреЗрдЯрд╛ - https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

рдЪрд▓рд╛ рд╣реА рд▓рд╛рдпрдмреНрд░рд░реА рдЖрдордЪреНрдпрд╛ рдкреНрд░реЛрдЬреЗрдХреНрдЯрдордзреНрдпреЗ рд╕реНрдерд╛рдкрд┐рдд рдХрд░реВрдпрд╛:

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

рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдХрд╛рдп рдмрджрд▓ рдЭрд╛рд▓реЗ рдЖрд╣реЗрдд рддреЗ рдкрд╛рд╣реВрдпрд╛ рд╕реЛрдирд╛рд░'рдЕ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдЖрдгрд┐ рдХрд╛рд╣реАрд╣реА рдмрджрд▓рд▓реЗ рдирд╛рд╣реА. рд╡рд╕реНрддреБрд╕реНрдерд┐рддреА рдЕрд╢реА рдЖрд╣реЗ рдХреА рд╕реЛрдирд╛рд░ рдЬреЗрд╕реНрдЯ рдЕрд╣рд╡рд╛рд▓рд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реНрдпрд╛ рдлрд╛рдИрд▓реНрд╕ рдлрд╛рдИрд▓реНрд╕ рдорд╛рдирдд рдирд╛рд╣реАрдд рдпреБрдирд┐рдЯ-рдЪрд╛рдЪрдгреНрдпрд╛. рд╣реА рдкрд░рд┐рд╕реНрдерд┐рддреА рджреБрд░реБрд╕реНрдд рдХрд░рдгреНрдпрд╛рд╕рд╛рдареА, рдЖрдореНрд╣реА рдХреЙрдиреНрдлрд┐рдЧрд░реЗрд╢рди рдкреЕрд░рд╛рдореАрдЯрд░ рд╡рд╛рдкрд░рддреЛ рд╕реЛрдирд╛рд░ рд╕реЛрдирд╛рд░.рдЪрд╛рдЪрдгреНрдпрд╛, рдЬреНрдпрд╛рдордзреНрдпреЗ рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреНрдпрд╛рдВрд╕рд╣ рдлреЛрд▓реНрдбрд░ рд╕реНрдкрд╖реНрдЯрдкрдгреЗ рд╕реВрдЪрд┐рдд рдХрд░реВ (рдЖрдордЪреНрдпрд╛рдХрдбреЗ рд╕рдзреНрдпрд╛ рдлрдХреНрдд рдПрдХ рдЖрд╣реЗ):

sonar-project.properties:

тАж
sonar.tests=src/components/__tests__
тАж

рдЪрд▓рд╛ рд╕реНрдХреЕрдирд░ рд░реАрд╕реНрдЯрд╛рд░реНрдЯ рдХрд░реВрдпрд╛:

yarn run sonar

рдЗрдВрдЯрд░рдлреЗрд╕рдордзреНрдпреЗ рдХрд╛рдп рдмрджрд▓ рдЭрд╛рд▓реЗ рддреЗ рдкрд╛рд╣реВрдпрд╛:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдЖрддрд╛ рдЖрдордЪрд╛ рдирдВрдмрд░ рдкрд╛рд╣рд┐рд▓рд╛ рдпреБрдирд┐рдЯ-рдЪрд╛рдЪрдгреНрдпрд╛ рдЖрдгрд┐, рдЖрдд рдХреНрд▓рд┐рдХ рдХрд░реВрди рдЕрдпрд╢рд╕реНрд╡реА рдЭрд╛рд▓реНрдпрд╛рдирдВрддрд░, рдЖрдореНрд╣реА рдкреНрд░рдХрд▓реНрдк рдлрд╛рдЗрд▓реНрд╕рдордзреНрдпреЗ рдпрд╛ рдХреНрд░рдорд╛рдВрдХрд╛рдЪреЗ рд╡рд┐рддрд░рдг рдкрд╛рд╣реВ рд╢рдХрддреЛ:

SonarQube рд╕рд╣ VueJS+TS рдкреНрд░рдХрд▓реНрдк рдПрдХрддреНрд░реАрдХрд░рдг

рдирд┐рд╖реНрдХрд░реНрд╖

рдореНрд╣рдгреВрди, рдЖрдореНрд╣реА рд╕рддрдд рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╛рд╕рд╛рдареА рдПрдХ рд╕рд╛рдзрди рдкрд╛рд╣рд┐рд▓реЗ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм. рдЖрдореНрд╣реА рддреНрдпрд╛рдд рд▓рд┐рд╣рд┐рд▓реЗрд▓рд╛ рдкреНрд░рдХрд▓реНрдк рдпрд╢рд╕реНрд╡реАрд░рд┐рддреНрдпрд╛ рд╕рдорд╛рдХрд▓рд┐рдд рдХреЗрд▓рд╛ VueJs+TS. рдХрд╛рд╣реА рд╕реБрд╕рдВрдЧрддрддрд╛ рд╕рдорд╕реНрдпрд╛рдВрдЪреЗ рдирд┐рд░рд╛рдХрд░рдг рдХреЗрд▓реЗ. рдЖрдореНрд╣реА рдЪрд╛рдЪрдгреА рдХрд╡реНрд╣рд░реЗрдЬ рдирд┐рд░реНрджреЗрд╢рдХрд╛рдЪреА рдорд╛рд╣рд┐рддреА рд╕рд╛рдордЧреНрд░реА рд╡рд╛рдврд╡рд▓реА рдЖрд╣реЗ. рдпрд╛ рд▓реЗрдЦрд╛рдд рдЖрдореНрд╣реА рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдХрд╖рд╛рдВрдкреИрдХреА рдлрдХреНрдд рдПрдХ (рдХрджрд╛рдЪрд┐рдд рдореБрдЦреНрдп рдирд┐рдХрд╖рд╛рдВрдкреИрдХреА рдПрдХ) рддрдкрд╛рд╕рд▓реЗ, рдкрд░рдВрддреБ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рд╕реБрд░рдХреНрд╖рд╛ рдЪрд╛рдЪрдгреАрд╕рд╣ рдЗрддрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдирд┐рдХрд╖рд╛рдВрдирд╛ рд╕рдорд░реНрдерди рджреЗрддреЗ. рдкрд░рдВрддреБ рд╣реА рд╕рд░реНрд╡ рд╡реИрд╢рд┐рд╖реНрдЯреНрдпреЗ рдкреВрд░реНрдгрдкрдгреЗ рдЙрдкрд▓рдмреНрдз рдирд╛рд╣реАрдд рд╕рдореБрджрд╛рдп-рдЖрд╡реГрддреНрддреНрдпрд╛. рдордиреЛрд░рдВрдЬрдХ рдЖрдгрд┐ рдЙрдкрдпреБрдХреНрдд рд╡реИрд╢рд┐рд╖реНрдЯреНрдпрд╛рдВрдкреИрдХреА рдПрдХ рдореНрд╣рдгрдЬреЗ рдПрдХрддреНрд░реАрдХрд░рдг рд╕реЛрдирд╛рд░рдХреНрдпреВрдм GitLab рдЖрдгрд┐ BitBucket рд╕рд╛рд░рдЦреНрдпрд╛ рд╡рд┐рд╡рд┐рдз рдХреЛрдб рд░рд┐рдкреЙрдЭрд┐рдЯрд░реА рд╡реНрдпрд╡рд╕реНрдерд╛рдкрди рдкреНрд░рдгрд╛рд▓реАрд╕рд╣. рдЯрд╛рд│рдгреЗ рд╡рд┐рд▓реАрди рдХрд░рд╛ (рд╡рд┐рд▓реАрди) рд╡рд┐рдирдВрддреАрдХрд╡реНрд╣рд░реЗрдЬ рдЦрд░рд╛рдм рдЭрд╛рд▓реНрдпрд╛рд╡рд░ рднрд╛рдВрдбрд╛рд░рд╛рдЪреНрдпрд╛ рдореБрдЦреНрдп рд╢рд╛рдЦреЗрдХрдбреЗ. рдкрдг рд╣реА рдкреВрд░реНрдгрдкрдгреЗ рд╡реЗрдЧрд│реНрдпрд╛ рд▓реЗрдЦрд╛рдЪреА рдХрдерд╛ рдЖрд╣реЗ.

PS: рдХреЛрдбрдЪреНрдпрд╛ рд╕реНрд╡рд░реВрдкрд╛рдд рд▓реЗрдЦрд╛рдд рд╡рд░реНрдгрди рдХреЗрд▓реЗрд▓реА рдкреНрд░рддреНрдпреЗрдХ рдЧреЛрд╖реНрдЯ рдордзреНрдпреЗ рдЙрдкрд▓рдмреНрдз рдЖрд╣реЗ рдорд╛рдЭрд╛ рдХрд╛рдЯрд╛.

рдХреЗрд╡рд│ рдиреЛрдВрджрдгреАрдХреГрдд рд╡рд╛рдкрд░рдХрд░реНрддреЗрдЪ рд╕рд░реНрд╡реЗрдХреНрд╖рдгрд╛рдд рднрд╛рдЧ рдШреЗрдК рд╢рдХрддрд╛рдд. рд╕рд╛рдЗрди рдЗрди рдХрд░рд╛, рдЖрдкрд▓реЗ рд╕реНрд╡рд╛рдЧрдд рдЖрд╣реЗ.

рддреБрдореНрд╣реА рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо рд╡рд╛рдкрд░рддрд╛ рдХрд╛:

  • 26,3%рд╣реЛрдп реирежрен

  • 15,8%рдХреНрд░рдорд╛рдВрдХ реирекрек

  • 15,8%рдореА рдпрд╛ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордмрджреНрджрд▓ рдРрдХрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдореА 3 рд╡рд╛рдкрд░реВ рдЗрдЪреНрдЫрд┐рддреЛ

  • 10,5%рдореА рдпрд╛ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдордмрджреНрджрд▓ рдРрдХрд▓реЗ рдЖрд╣реЗ рдЖрдгрд┐ рдореА 2 рд╡рд╛рдкрд░реВ рдЗрдЪреНрдЫрд┐рдд рдирд╛рд╣реА

  • 0,0%рдореА рд╡реЗрдЧрд│рд╛ рдкреНрд▓реЕрдЯрдлреЙрд░реНрдо0 рд╡рд╛рдкрд░рдд рдЖрд╣реЗ

  • 31,6%рддрд┐рдЪреНрдпрд╛рдмрджреНрджрд▓ рдореА рдкрд╣рд┐рд▓реНрдпрд╛рдВрджрд╛рдЪ рдРрдХрд▓реЗ 6

19 рд╡рд╛рдкрд░рдХрд░реНрддреНрдпрд╛рдВрдиреА рдорддрджрд╛рди рдХреЗрд▓реЗ. 3 рд╡рд╛рдкрд░рдХрд░реНрддреЗ рджреВрд░ рд░рд╛рд╣рд┐рд▓реЗ.

рд╕реНрддреНрд░реЛрдд: www.habr.com

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдЬреЛрдбрд╛