SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рд╣рд╛рдореНрд░реЛ рдХрд╛рдордорд╛, рд╣рд╛рдореА рд╕рдХреНрд░рд┐рдп рд░реВрдкрдорд╛ рдкреНрд▓реЗрдЯрдлрд░реНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдЙрдЪреНрдЪ рд╕реНрддрд░рдорд╛ рдХреЛрдбрдХреЛ рдЧреБрдгрд╕реНрддрд░ рдХрд╛рдпрдо рд░рд╛рдЦреНрдиред рд▓рд┐рдЦрд┐рдд рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдордзреНрдпреЗ рдПрдХ рдПрдХреАрдХреГрдд рдЧрд░реНрджрд╛ VueJs+Typescript, рд╕рдорд╕реНрдпрд╛рд╣рд░реВ рдЫрдиреНред рддреНрдпрд╕рдХрд╛рд░рдг, рдо рддрдкрд╛рдИрдВрд▓рд╛рдИ рдХрд╕рд░реА рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдпреМрдВ рднрдиреНрдиреЗ рдмрд╛рд░реЗ рдердк рдмрддрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБред

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдпреЛ рд▓реЗрдЦ рдлреЛрдХрд╕ рд╣реБрдиреЗрдЫ, рдореИрд▓реЗ рдорд╛рдерд┐ рд▓реЗрдЦреЗ рдЬрд╕реНрддреИ, SonarQube рдкреНрд▓реЗрдЯрдлрд░реНрдордорд╛ред рдПрдЙрдЯрд╛ рд╕рд╛рдиреЛ рд╕рд┐рджреНрдзрд╛рдиреНрдд - рдпреЛ рд╕рд╛рдорд╛рдиреНрдпрддрдпрд╛ рдХреЗ рд╣реЛ, рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдпрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реБрдиреНрдиреЗрд╣рд░реВрдХрд╛ рд▓рд╛рдЧрд┐:

рд╕реЛрдирд╛рд░рдХреНрдпреВрдм (рдкреВрд░реНрд╡ рд╕реЛрдирд╛рд░) рдирд┐рд░рдиреНрддрд░ рдирд┐рд░реАрдХреНрд╖рдг рд░ рдХреЛрдб рдЧреБрдгрд╕реНрддрд░ рдорд╛рдкрдирдХреЛ рд▓рд╛рдЧрд┐ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдкреНрд▓реЗрдЯрдлрд░реНрдо рд╣реЛред
MISRA C, MISRA C++, MITER/CWE рд░ CERT рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдбрд┐рдЩ рдорд╛рдирдХрд╣рд░реВрдХреЛ рдирд┐рдпрдо рдЕрдиреБрд╕рд╛рд░ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд░ рддреНрд░реБрдЯрд┐ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрди рд╕рдорд░реНрдерди рдЧрд░реНрджрдЫред рдпрд╕рд▓реЗ OWASP рд╢реАрд░реНрд╖ 10 рд░ CWE / SANS рд╢реАрд░реНрд╖ 25 рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рддреНрд░реБрдЯрд┐рд╣рд░реВрдХреЛ рд╕реВрдЪреАрдмрд╛рдЯ рддреНрд░реБрдЯрд┐рд╣рд░реВ рдХрд╕рд░реА рдкрд╣рд┐рдЪрд╛рди рдЧрд░реНрдиреЗ рднрдиреЗрд░ рдкрдирд┐ рдЬрд╛рдиреНрджрдЫред
рдкреНрд▓реЗрдЯрдлрд░реНрдорд▓реЗ рд╡рд┐рднрд┐рдиреНрди рддрдпрд╛рд░ рдЙрдкрдХрд░рдгрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрдХреЛ рддрдереНрдпрдХреЛ рдмрд╛рд╡рдЬреБрдж, SonarQube рд▓реЗ рдирддрд┐рдЬрд╛рд╣рд░реВрд▓рд╛рдИ рдПрдХрд▓ рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб (рдЕрдВрдЧреНрд░реЗрдЬреА рдбреНрдпрд╛рд╕рдмреЛрд░реНрдб) рдорд╛ рдШрдЯрд╛рдЙрдБрдЫ, рд░рдирд╣рд░реВрдХреЛ рдЗрддрд┐рд╣рд╛рд╕ рд░рд╛рдЦреНрдЫ рд░ рдпрд╕реИрд▓реЗ рддрдкрд╛рдИрдВрд▓рд╛рдИ рд╡рд┐рдХрд╛рд╕рдХреЛ рдХреНрд░рдордорд╛ рд╕рдлреНрдЯрд╡реЗрдпрд░рдХреЛ рдЧреБрдгрд╕реНрддрд░рдорд╛ рд╕рдордЧреНрд░ рдкреНрд░рд╡реГрддреНрддрд┐ рд╣реЗрд░реНрди рдЕрдиреБрдорддрд┐ рджрд┐рдиреНрдЫред

рдердк рд╡рд┐рд╡рд░рдг рдорд╛ рдкрд╛рдЙрди рд╕рдХрд┐рдиреНрдЫ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ

рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рдареВрд▓реЛ рд╕рдВрдЦреНрдпрд╛ рд╕рдорд░реНрдерд┐рдд рдЫрдиреНред рдорд╛рдерд┐рдХреЛ рд▓рд┐рдЩреНрдХрдмрд╛рдЯ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рдЖрдзрд╛рд░рдорд╛, рдпреА 25 рднрдиреНрджрд╛ рдмрдвреА рднрд╛рд╖рд╛рд╣рд░реВ рдЫрдиреНред рдПрдХ рд╡рд┐рд╢рд┐рд╖реНрдЯ рднрд╛рд╖рд╛ рд╕рдорд░реНрдерди рдЧрд░реНрди, рддрдкрд╛рдИрдВрд▓реЗ рдЙрдкрдпреБрдХреНрдд рдкреНрд▓рдЧрдЗрди рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрдкрд░реНрдЫред рд╕рд╛рдореБрджрд╛рдпрд┐рдХ рд╕рдВрд╕реНрдХрд░рдгрдорд╛ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдкреНрд▓рдЧрдЗрди рд╕рдорд╛рд╡реЗрд╢ рдЫ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ (рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рд╕рд╣рд┐рдд), рдпрджреНрдпрдкрд┐ рд╡рд┐рдХрд┐рд▓реЗ рдЕрдиреНрдпрдерд╛ рднрдиреНрдЫред рдкрдЫрд╛рдбрд┐ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдкреНрд▓рдЧрдЗрдирд▓реЗ рдЬрд╡рд╛рдл рджрд┐рдиреНрдЫ рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕, Typescript рдХреЛ рд▓рд╛рдЧреА SonarTS рдХреНрд░рдорд╢рдГред

рдПрдХ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЧреНрд░рд╛рд╣рдХ рдХрд╡рд░реЗрдЬ рдЬрд╛рдирдХрд╛рд░реА рдкрдард╛рдЙрди рдкреНрд░рдпреЛрдЧ рдЧрд░рд┐рдиреНрдЫ sonarqube-рд╕реНрдХреНрдпрд╛рдирд░, рдЬреБрди, рдмрд╛рдЯ рд╕реЗрдЯрд┐рдЩрд╣рд░реВ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдиреБрд╣реЛрд╕реН-рдлрд╛рдЗрд▓, рд╕рд░реНрднрд░рдорд╛ рдпреЛ рдбрд╛рдЯрд╛ рдкрдард╛рдЙрдБрдЫ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдердк рд╕рдореЗрдХрди рд░ рдПрдХреАрдХрд░рдгрдХреЛ рд▓рд╛рдЧрд┐ред

рдЧрд░реНрди рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ рддреНрдпрд╣рд╛рдБ рдЫ npm рд░реНрдпрд╛рдкрд░ред рддреНрдпрд╕реЛрднрдП, рдЪрд░рдг-рджрд░-рдЪрд░рдг рдХрд╛рд░реНрдпрд╛рдиреНрд╡рдпрди рд╕реБрд░реБ рдЧрд░реМрдВ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм ╨▓ Vue- рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ.

рд╕рд░реНрднрд░ рдкрд░рд┐рдирд┐рдпреЛрдЬрдирдХреЛ рд▓рд╛рдЧрд┐ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ рдбрдХрд░-рд░рдЪрдирд╛.

sonar.yaml:

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+Jestред рдпрд╕рд▓рд╛рдИ рд╣рд╛рдореА рддрд┐рд░ рдЭреБрдХрд╛рдФрдВ:

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.tests - рдПрдХ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдЬреБрди рдЕрдШрд┐рд▓реНрд▓реЛ рдПрдХрд╕рдБрдЧ рдЬреЛрдбрд┐рдПрдХреЛ рдЫред рдпреЛ рдлреЛрд▓реНрдбрд░ рд╣реЛ рдЬрд╣рд╛рдБ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдЕрд╡рд╕реНрдерд┐рдд рдЫрдиреНред рдпрд╕ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛, рддреНрдпрд╣рд╛рдБ рддреНрдпрд╕реНрддреЛ рдХреБрдиреИ рдлреЛрд▓реНрдбрд░ рдЫреИрди, рд░ рдкрд░реАрдХреНрд╖рдг рдлреЛрд▓реНрдбрд░рдорд╛ рдкрд░реАрдХреНрд╖рдг рдЕрдиреНрддрд░реНрдЧрдд рдХрдореНрдкреЛрдиреЗрдиреНрдЯрдХреЛ рдЫреЗрдЙрдорд╛ рдЕрд╡рд╕реНрдерд┐рдд рдЫредрдкрд░реАрдХреНрд╖рдг', рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореА рдпрд╕рд▓рд╛рдИ рдЕрд╣рд┐рд▓реЗрдХреЛ рд▓рд╛рдЧрд┐ рдмреЗрд╡рд╛рд╕реНрддрд╛ рдЧрд░реНрдиреЗрдЫреМрдВ рд░ рдЕрд░реНрдХреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫреМрдВ;
  • sonar.test.inclusions - рдорд╛рд╕реНрдХ рдкреНрд░рдпреЛрдЧ рдЧрд░реЗрд░ рдкрд░реАрдХреНрд╖рдгрд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдорд╛рд░реНрдЧ, рддреНрдпрд╣рд╛рдБ рдЕрд▓реНрдкрд╡рд┐рд░рд╛рдо рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдзреЗрд░реИ рддрддреНрд╡рд╣рд░реВ рд╣реБрди рд╕рдХреНрдЫ;
  • sonar.sourceEncoding - рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рдПрдиреНрдХреЛрдбрд┐рдЩред

рд╕реНрдХреНрдпрд╛рдирд░рдХреЛ рдкрд╣рд┐рд▓реЛ рдкреНрд░рдХреНрд╖реЗрдкрдгрдХреЛ рд▓рд╛рдЧрд┐, рд╕рдмреИ рдХреБрд░рд╛ рддрдпрд╛рд░ рдЫ, рдореБрдЦреНрдп рдЕрдШрд┐рд▓реНрд▓реЛ рдХрд╛рд░реНрдп рдмрд╛рд╣реЗрдХ: рдкрд░реАрдХреНрд╖рдг рдЗрдиреНрдЬрд┐рди рдЖрдлреИ рд╕реБрд░реБ рдЧрд░реНрджреИ, рдХрднрд░реЗрдЬрдХреЛ рдмрд╛рд░реЗрдорд╛ рдЬрд╛рдирдХрд╛рд░реА рдЙрддреНрдкрдиреНрди рдЧрд░реНрди, рдЬреБрди рд╕реНрдХреНрдпрд╛рдирд░рд▓реЗ рдкрдЫрд┐ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдиреЗрдЫред

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

рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рдкреВрд░рд╛ рднрдПрдкрдЫрд┐, рдХрднрд░реЗрдЬ рдЬрд╛рдирдХрд╛рд░реА рд╣реБрдиреЗрдЫ coverage/lcov.info.
рд╣рд╛рдореАрд▓реЗ рднрдиреНрди рдЖрд╡рд╢реНрдпрдХ рдЫ рд╕реЛрдирд╛рд░'рдХрд╣рд╛рдБрдмрд╛рдЯ рд▓реНрдпрд╛рдЙрдиреЗред рддреНрдпрд╕реЛрднрдП рдпрд╕рдХреЛ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдлрд╛рдЗрд▓рдорд╛ рдирд┐рдореНрди рд▓рд╛рдЗрдирд╣рд░реВ рдердкреМрдВред рддрд░ рддреНрдпрд╣рд╛рдБ рдПрдЙрдЯрд╛ рдмрд┐рдиреНрджреБ рдЫ: рдкрд░рд┐рдпреЛрдЬрдирд╛рд╣рд░реВ рдмрд╣реБрднрд╛рд╖реА рд╣реБрди рд╕рдХреНрдЫ, рддреНрдпреЛ рд╣реЛ, рдлреЛрд▓реНрдбрд░рдорд╛ src рддреНрдпрд╣рд╛рдБ рдзреЗрд░реИ рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрддрд╣рд░реВ рдЫрдиреН рд░ рдПрдХ рд╡рд╛ рдЕрд░реНрдХреЛрд╕рдБрдЧ рд╕рдореНрдмрдиреНрдзрд┐рдд рдЫрдиреН, рд░ рдмрд╛рд░реАрдорд╛, рдПрдХ рд╡рд┐рд╢реЗрд╖ рдкреНрд▓рдЧрдЗрдирдХреЛ рдкреНрд░рдпреЛрдЧ рдпрд╕рдХреЛ рд╡рд┐рд╕реНрддрд╛рд░рджреНрд╡рд╛рд░рд╛ рдирд┐рд░реНрдзрд╛рд░рдг рдЧрд░рд┐рдиреНрдЫред рд░ рдХрднрд░реЗрдЬ рдЬрд╛рдирдХрд╛рд░реА рд╡рд┐рднрд┐рдиреНрди рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдЩ рднрд╛рд╖рд╛рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ рд╡рд┐рднрд┐рдиреНрди рдард╛рдЙрдБрд╣рд░реВрдорд╛ рднрдгреНрдбрд╛рд░рдг рдЧрд░реНрди рд╕рдХрд┐рдиреНрдЫ, рддреНрдпрд╕реИрд▓реЗ рдкреНрд░рддреНрдпреЗрдХ PL рд╕рдБрдЧ рдпрд╕рдХреЛ рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЖрдлреНрдиреИ рдЦрдгреНрдб рдЫред рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджрдЫ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ, рддреНрдпрд╕реИрд▓реЗ рд╣рд╛рдореАрд▓рд╛рдИ рдпрд╕рдХреЛ рд▓рд╛рдЧрд┐ рд╕реЗрдЯрд┐рдЩ рдЦрдгреНрдб рдЪрд╛рд╣рд┐рдиреНрдЫ:

sonar-project.properties:

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

рд╕реНрдХреНрдпрд╛рдирд░рдХреЛ рдкрд╣рд┐рд▓реЛ рд╕реБрд░реБрд╡рд╛рддрдХреЛ рд▓рд╛рдЧрд┐ рд╕рдмреИ рддрдпрд╛рд░ рдЫред рдо рдкрд░рд┐рдпреЛрдЬрдирд╛ рдФрдВрд▓реНрдпрд╛рдЙрди рдЪрд╛рд╣рдиреНрдЫреБ рд╕реЛрдирд╛рд░'e рд╕реНрд╡рдЪрд╛рд▓рд┐рдд рд░реВрдкрдорд╛ рд╕рд┐рд░реНрдЬрдирд╛ рд╣реБрдиреНрдЫ рдЬрдм рддрдкрд╛рдЗрдБ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рджрд┐рдЗрдПрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐ рд╕реНрдХреНрдпрд╛рдирд░ рдЪрд▓рд╛рдЙрдиреБрд╣реБрдиреНрдЫред рддреНрдпрд╕рдкрдЫрд┐рдХрд╛ рд╕рдордпрдорд╛, рд╕рдордпрд╕рдБрдЧреИ рдкрд░рд┐рдпреЛрдЬрдирд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рд╣рд░реВрдорд╛ рдкрд░рд┐рд╡рд░реНрддрдирд╣рд░реВрдХреЛ рдЧрддрд┐рд╢реАрд▓рддрд╛ рд╣реЗрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЬрд╛рдирдХрд╛рд░реА рдкрд╣рд┐рд▓реЗ рдиреИ рд╕рдВрдЪрд┐рдд рд╣реБрдиреЗрдЫред

рддреНрдпрд╕реЛрднрдП, рдкрд╣рд┐рд▓реЗ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдПрдХреЛ рдЖрджреЗрд╢ рдкреНрд░рдпреЛрдЧ рдЧрд░реМрдВ package.json:

yarn run sonar 

рдиреЛрдЯ: рддрдкрд╛рдИрдВ рдкрдирд┐ рд╡рд┐рдХрд▓реНрдк рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫ -X рдердк рд╡рд┐рд╕реНрддреГрдд рд▓рдЧрд┐рдЩрдХреЛ рд▓рд╛рдЧрд┐ред

рдпрджрд┐ рд╕реНрдХреНрдпрд╛рдирд░ рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рд▓рдиреНрдЪ рдЧрд░рд┐рдПрдХреЛ рдерд┐рдпреЛ рднрдиреЗ, рд╕реНрдХреНрдпрд╛рдирд░рдХреЛ рдмрд╛рдЗрдирд░реА рдкрд╣рд┐рд▓реЗ рдбрд╛рдЙрдирд▓реЛрдб рд╣реБрдиреЗрдЫред рддреНрдпрд╕ рдкрдЫрд┐ рдпреЛ рд╕реБрд░реБ рд╣реБрдиреНрдЫ рд░ рд╕рд░реНрднрд░ рд╕реНрдХреНрдпрд╛рди рдЧрд░реНрди рд╕реБрд░реБ рд╣реБрдиреНрдЫ рд╕реЛрдирд╛рд░'рдП рд╕реНрдерд╛рдкрд┐рдд рдкреНрд▓рдЧрдЗрдирд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐, рдпрд╕рд░реА рд╕рдорд░реНрдерд┐рдд PLs рдЧрдгрдирд╛ред рдпрд╕рд▓реЗ рдХрд╛рдо рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐ рдЕрдиреНрдп рд╡рд┐рднрд┐рдиреНрди рд╡рд┐рдХрд▓реНрдкрд╣рд░реВ рдкрдирд┐ рд▓реЛрдб рдЧрд░реНрджрдЫ: рдЧреБрдгрд╕реНрддрд░ рдкреНрд░реЛрдлрд╛рдЗрд▓рд╣рд░реВ, рд╕рдХреНрд░рд┐рдп рдирд┐рдпрдорд╣рд░реВ, рдореЗрдЯреНрд░рд┐рдХреНрд╕ рднрдгреНрдбрд╛рд░, рд╕рд░реНрднрд░ рдирд┐рдпрдорд╣рд░реВ.

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдиреЛрдЯ: рд╣рд╛рдореА рдпрд╕ рд▓реЗрдЦрдХреЛ рдврд╛рдБрдЪрд╛ рднрд┐рддреНрд░ рд╡рд┐рд╕реНрддреГрдд рд░реВрдкрдорд╛ рддрд┐рдиреАрд╣рд░реВрдорд╛ рдмрд╕реНрдиреЗ рдЫреИрдиреМрдВ, рддрд░ рддрдкрд╛рдИрдВ рд╕рдзреИрдВ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕реНрд░реЛрддрд╣рд░реВрдорд╛ рдЬрд╛рди рд╕рдХреНрдиреБрд╣реБрдиреНрдЫред

рдЕрд░реНрдХреЛ, рдлреЛрд▓реНрдбрд░рдХреЛ рд╡рд┐рд╢реНрд▓реЗрд╖рдг рд╕реБрд░реБ рд╣реБрдиреНрдЫ src рд╕рдмреИрдХрд╛ рд▓рд╛рдЧрд┐ рд╕реНрд░реЛрдд рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рдЙрдкрд▓рдмреНрдзрддрд╛рдХрд╛ рд▓рд╛рдЧрд┐ (рдХреБрдиреИ рд╡рд┐рд╢реЗрд╖рд▓реЗ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдирдЧрд░реЗрд╕рдореНрдо) рд╕рдорд░реНрдерд┐рдд PLs, рддрд┐рдиреАрд╣рд░реВрдХреЛ рдкрдЫрд┐рдХреЛ рдЕрдиреБрдХреНрд░рдордгрд┐рдХрд╛рдХреЛ рд╕рд╛рдеред

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рддреНрдпрд╕рдкрдЫрд┐ рддреНрдпрд╣рд╛рдБ рд╡рд┐рднрд┐рдиреНрди рдЕрдиреНрдп рд╡рд┐рд╢реНрд▓реЗрд╖рдгрд╣рд░реВ рдЫрдиреН рдЬреБрди рд╣рд╛рдореА рдпрд╕ рд▓реЗрдЦрдорд╛ рдлреЛрдХрд╕ рдЧрд░реНрджреИрдиреМрдВ (рдЙрджрд╛рд╣рд░рдгрдХрд╛ рд▓рд╛рдЧрд┐, рдЬрд╕реНрддреИ: linting, рдХреЛрдб рдирдХреНрдХрд▓ рдкрддреНрддрд╛ рд▓рдЧрд╛рдЙрдиреЗ, рдЖрджрд┐)ред

рд╕реНрдХреНрдпрд╛рдирд░рдХреЛ рдзреЗрд░реИ рдЕрдиреНрддрдорд╛, рд╕рдмреИ рд╕рдЩреНрдХрд▓рд┐рдд рдЬрд╛рдирдХрд╛рд░реА рдПрдХрддреНрд░рд┐рдд, рдЕрднрд┐рд▓реЗрдЦ рд░ рд╕рд░реНрднрд░рдорд╛ рдкрдард╛рдЗрдиреНрдЫред

рддреНрдпрд╕ рдкрдЫрд┐, рд╣рд╛рдореА рдкрд╣рд┐рд▓реЗ рдиреИ рд╡реЗрдм рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдХреЗ рднрдпреЛ рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рддрдкрд╛рдИрд▓реЗ рджреЗрдЦреНрди рд╕рдХреНрдиреБрд╣реБрдиреЗ рд░реВрдкрдорд╛, рдХреЗрд╣рд┐ рдмрд╛рд╣рд┐рд░рд┐рдпреЛ, рд░ рдХреЗрд╣рд┐ рдкреНрд░рдХрд╛рд░рдХреЛ рдХрднрд░реЗрдЬ рдкрдирд┐ рджреЗрдЦрд╛рдЙрдБрджрдЫ, рддрд░ рдпреЛ рд╣рд╛рдореНрд░реЛ рдЕрдиреБрд░реВрдк рдЫреИрдиред рдЫ- рд░рд┐рдкреЛрд░реНрдЯред

рдпрд╕рд▓рд╛рдИ рдмрд╛рд╣рд┐рд░ рдирд┐рдХрд╛рд▓реМрдВред рдкрд░рд┐рдпреЛрдЬрдирд╛рд▓рд╛рдИ рдердк рд╡рд┐рд╕реНрддрд╛рд░рдорд╛ рд╣реЗрд░реМрдВ, рдХрднрд░реЗрдЬ рдорд╛рдирдорд╛ рдХреНрд▓рд┐рдХ рдЧрд░реНрдиреБрд╣реЛрд╕реН, рд░ рдлрд╛рдЗрд▓рд╣рд░реВрдорд╛ рд╡рд┐рд╕реНрддреГрдд рд░рд┐рдкреЛрд░реНрдЯрдорд╛ "рдкрддрди" рдЧрд░реНрдиреБрд╣реЛрд╕реН:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдпрд╣рд╛рдБ рд╣рд╛рдореА рдореБрдЦреНрдп, рдЕрдиреБрд╕рдиреНрдзрд╛рди рдлрд╛рдЗрд▓рдХреЛ рдЕрддрд┐рд░рд┐рдХреНрдд рджреЗрдЦреНрдЫреМрдВ HelloWorld.vue, рдлрд╛рдЗрд▓ рдкрдирд┐ рдЙрдкрд╕реНрдерд┐рдд рдЫ main.ts, рдЬрд╕рд▓реЗ рдХрднрд░реЗрдЬрдХреЛ рд╕рдореНрдкреВрд░реНрдг рддрд╕реНрд╡реАрд░ рдмрд┐рдЧрд╛рд░реНрдЫред рддрд░ рдХрд╕рд░реА, рд╣рд╛рдореАрд▓реЗ рдпрд╕рд▓рд╛рдИ рдХрднрд░реЗрдЬ рдЧрдгрдирд╛рдмрд╛рдЯ рдмрд╛рд╣рд┐рд░ рд░рд╛рдЦреНрдпреМрдВред рд╣реЛ, рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╣реА рдЫ, рддрд░ рдпреЛ рд╕реНрддрд░ рдорд╛ рдерд┐рдпреЛ рдЫ, рддрд░ рд╕реНрдХреНрдпрд╛рдирд░рд▓реЗ рдпрд╕рд▓рд╛рдИ рдЕрдиреБрдХреНрд░рдорд┐рдд рдЧрд░реНрдпреЛ, рддреНрдпрд╕реИрд▓реЗ рдпреЛ рдпрд╕рдХреЛ рдЧрдгрдирд╛рдорд╛ рдЖрдпреЛред

рдпрд╕рд▓рд╛рдИ рдареАрдХ рдЧрд░реМрдВ:

sonar-project.properties:

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

рдо рд╕реНрдкрд╖реНрдЯреАрдХрд░рдг рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ: рдпреЛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░рд┐рдПрдХрд╛ рдлреЛрд▓реНрдбрд░рд╣рд░реВ рдмрд╛рд╣реЗрдХ, рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░рдорд╛ рд╕реВрдЪреАрдмрджреНрдз рд╕рдмреИ рдлреЛрд▓реНрдбрд░рд╣рд░реВ рдкрдирд┐ рдердкрд┐рдПрдХрд╛ рдЫрдиреНред sonar.test.inclusions.

рд╕реНрдХреНрдпрд╛рдирд░ рд╕реБрд░реБ рдЧрд░реЗрдкрдЫрд┐, рд╣рд╛рдореА рд╕рд╣реА рдЬрд╛рдирдХрд╛рд░реА рджреЗрдЦреНрдЫреМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

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

sonar-project.properties:

...
sonar.language=ts
...

рдлреЗрд░рд┐ рд╕реНрдХреНрдпрд╛рдирд░ рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН рд░ рдирддрд┐рдЬрд╛ рд╣реЗрд░реНрдиреБрд╣реЛрд╕реН:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдЖрд╡рд░рдг рдкреВрд░реИ рд╣рд░рд╛рдПрдХреЛ рдЫред

рдпрджрд┐ рд╣рд╛рдореАрд▓реЗ рд╕реНрдХреНрдпрд╛рдирд░ рд▓рдЧ рд╣реЗрд░реНрдЫреМрдВ рднрдиреЗ, рд╣рд╛рдореА рдирд┐рдореНрди рд░реЗрдЦрд╛ рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рддреНрдпреЛ рд╣реЛ, рд╣рд╛рдореНрд░реЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдХрд╛ рдлрд╛рдЗрд▓рд╣рд░реВ рдорд╛рддреНрд░ рдЕрдиреБрдХреНрд░рдорд┐рдд рдерд┐рдПрдирдиреНред

рд╕реНрдерд┐рддрд┐ рдирд┐рдореНрдирд╛рдиреБрд╕рд╛рд░ рдЫ: рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╕рдорд░реНрдерди vue js рдкреНрд▓рдЧрдЗрдирдорд╛ рдЫ рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕, рдЬрд╕рдХреЛ рд▓рд╛рдЧрд┐ рдЬрд┐рдореНрдореЗрд╡рд╛рд░ рдЫ рдЬрд╛рднрд╛рд╕реНрдХреНрд░рд┐рдкреНрдЯ.

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рддрд░ рдпреЛ рд╕рдорд░реНрдерди рдкреНрд▓рдЧрдЗрдирдорд╛ рдЫреИрди SonarTS рд▓рд╛рдЧрд┐ TS, рдЬрд╕рдХреЛ рдмрд╛рд░реЗрдорд╛ рдмрдЧ рдЯреНрд░реНрдпрд╛рдХрд░рдорд╛ рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рдЯрд┐рдХрдЯ рдЦреЛрд▓рд┐рдПрдХреЛ рдерд┐рдпреЛ рд╕реЛрдирд╛рд░'рдП:

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

рдпрд╣рд╛рдБ SonarQube рд╡рд┐рдХрд╛рд╕рдХрд░реНрддрд╛рд╣рд░реВрдХрд╛ рдкреНрд░рддрд┐рдирд┐рдзрд┐рд╣рд░реВ рдордзреНрдпреЗ рдПрдХрдмрд╛рдЯ рдХреЗрд╣реА рдЬрд╡рд╛рдлрд╣рд░реВ рдЫрдиреН, рдпреЛ рддрдереНрдп рдкреБрд╖реНрдЯрд┐ рдЧрд░реНрджреИред

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рддрд░ рд╕рдмреИ рдХреБрд░рд╛ рд╣рд╛рдореНрд░реЛ рд▓рд╛рдЧрд┐ рдХрд╛рдо рдЧрд░реНрдпреЛ, рддрдкрд╛рдИрдВ рд╡рд┐рд░реЛрдз рдЧрд░реНрдиреБрд╣реБрдиреНрдЫред рд╣реЛ рдпреЛ рд╣реЛ, рдереЛрд░реИ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ "рд╣реНрдпрд╛рдХ".
рдпрджрд┐ рддреНрдпрд╣рд╛рдБ рд╕рдорд░реНрдерди рдЫ .vue-рдлрд╛рдЗрд▓рд╣рд░реВ рд╕реЛрдирд╛рд░'рдУрд╣, рддреНрдпрд╕реЛрднрдП рдЙрд╣рд╛рдБрд▓рд╛рдИ рдЙрдиреАрд╣рд░реВ рдЬрд╕реНрддреИ рд╡реНрдпрд╡рд╣рд╛рд░ рдЧрд░реНрди рднрдиреНрди рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ.

рдПрдЙрдЯрд╛ рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдердкреМрдВ:

sonar-project.properties:

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

рд╕реНрдХреНрдпрд╛рдирд░ рд╕реБрд░реБ рдЧрд░реМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рд░, рднреЛрдЗрд▓рд╛, рд╕рдмреИ рдХреБрд░рд╛ рд╕рд╛рдорд╛рдиреНрдпрдорд╛ рдлрд░реНрдХрд┐рдпреЛ, рд░ рдХреЗрд╡рд▓ рдПрдХ рдкреНрд░реЛрдлрд╛рдЗрд▓рдХреЛ рд╕рд╛рде рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯред рддреНрдпреЛ рд╣реЛ, рд╣рд╛рдореАрд▓реЗ рд╕рдорд░реНрдердирдорд╛ рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди рдЧрд░реНрди рд╡реНрдпрд╡рд╕реНрдерд┐рдд рдЧрд░реНрдпреМрдВ VueJs+TS рд▓рд╛рдЧрд┐ рд╕реЛрдирд╛рд░рдХреНрдпреВрдм.

рдЕрдЭ рдЕрдЧрд╛рдбрд┐ рдЬрд╛рдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВ рд░ рдХрднрд░реЗрдЬ рдЬрд╛рдирдХрд╛рд░реАрд▓рд╛рдИ рдЕрд▓рд┐рдХрддрд┐ рд╕реБрдзрд╛рд░ рдЧрд░реНрдиреЗ рдкреНрд░рдпрд╛рд╕ рдЧрд░реМрдВред

рд╣рд╛рдореАрд▓реЗ рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо рдХреЗ рдЧрд░реЗрдХрд╛ рдЫреМрдВ:

  • рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдердкрд┐рдпреЛ рд╕реЛрдирд╛рд░- рд╕реНрдХреНрдпрд╛рдирд░;
  • рд╕реЗрдЯ рдЕрдк рдЫ рдХрднрд░реЗрдЬ рдЬрд╛рдирдХрд╛рд░реА рдЙрддреНрдкрдиреНрди рдЧрд░реНрди;
  • рдХрдиреНрдлрд┐рдЧрд░ рдЧрд░рд┐рдПрдХреЛ рд╕реЛрдирд╛рд░- рд╕реНрдХреНрдпрд╛рдирд░;
  • рд╕рдорд░реНрдерди рд╕рдорд╕реНрдпрд╛ рд╕рдорд╛рдзрд╛рди .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

рдЕрд╡рд╢реНрдп рдкрдирд┐, рд╣рд╛рдореНрд░реЛ рдХрднрд░реЗрдЬ рдШрдЯреНрдиреЗрдЫ, рддрд░ рдЕрдм рд╣рд╛рдореАрд▓рд╛рдИ рдЪрд╛рд╕реЛ рдЫреИрдиред

рдХреЛрдбрдХреЛ рдбреБрдкреНрд▓рд┐рдХреЗрдЯ рд▓рд╛рдЗрдирд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛, рд╣рд╛рдореА рджреЗрдЦреНрдиреЗрдЫреМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдЬрд╛рдБрдЪ рдЧрд░реНрди, рд╣рд╛рдореА рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рд╕реАрдкреАрдбреАрдЙрдкрдпреЛрдЧрд┐рддрд╛ - jscpd:

npx jscpd src

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдХреЛрдб рдХреЛ рд▓рд╛рдЗрдирд╣рд░реБ рдХреЛ рд▓рд╛рдЧреА:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рд╣реБрдирд╕рдХреНрдЫ рдпреЛ рдкреНрд▓рдЧрдЗрдирд╣рд░реВрдХреЛ рднрд╡рд┐рд╖реНрдпрдХрд╛ рд╕рдВрд╕реНрдХрд░рдгрд╣рд░реВрдорд╛ рдирд┐рд╢реНрдЪрд┐рдд рд╣реБрдиреЗрдЫред SonarJS(TS)ред рдо рдиреЛрдЯ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ рдХрд┐ рддрд┐рдиреАрд╣рд░реВ рдмрд┐рд╕реНрддрд╛рд░реИ рдпреА рджреБрдИ рдкреНрд▓рдЧрдЗрдирд╣рд░реВ рдПрдХрдорд╛ рдорд░реНрдЬ рдЧрд░реНрди рдерд╛рд▓реЗрдХрд╛ рдЫрдиреН рд╕реЛрдирд╛рд░рдЬреЗрдПрд╕рдЬреБрди рдорд▓рд╛рдИ рд╕рд╣реА рд▓рд╛рдЧреНрдЫ ред

рдЕрдм рдо рдХрднрд░реЗрдЬ рдЬрд╛рдирдХрд╛рд░реА рд╕реБрдзрд╛рд░ рдЧрд░реНрдиреЗ рд╡рд┐рдХрд▓реНрдкрд▓рд╛рдИ рд╡рд┐рдЪрд╛рд░ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБред

рдЕрд╣рд┐рд▓реЗрд╕рдореНрдо, рд╣рд╛рдореА рдкреНрд░рддрд┐рд╢рдд рд╕рд░реНрддрд╣рд░реВрдорд╛ рдкрд░реАрдХреНрд╖рдг рдХрднрд░реЗрдЬ рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ, рд╕рдореНрдкреВрд░реНрдг рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд▓рд╛рдЧрд┐, рд░ рд╡рд┐рд╢реЗрд╖ рдЧрд░реА рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд▓рд╛рдЧрд┐ред рддрд░ рдирдореНрдмрд░рдорд╛ рдЬрд╛рдирдХрд╛рд░реАрдХреЛ рд╕рд╛рде рдпреЛ рд╕реВрдЪрдХ рд╡рд┐рд╕реНрддрд╛рд░ рдЧрд░реНрди рд╕рдореНрднрд╡ рдЫ рдПрдХрд╛рдЗ- рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдкрд░реАрдХреНрд╖рдгрд╣рд░реВ, рд╕рд╛рдереИ рдлрд╛рдЗрд▓рд╣рд░реВрдХреЛ рд╕рдиреНрджрд░реНрднрдорд╛ред

рд╕рдХреНрдиреЗ рдкреБрд╕реНрддрдХрд╛рд▓рдп рдЫ рдЫ-рдХрд╛ рд▓рд╛рдЧрд┐ рдврд╛рдБрдЪрд╛рдорд╛ рд░реВрдкрд╛рдиреНрддрд░рдг рдЧрд░реНрди рд░рд┐рдкреЛрд░реНрдЯ рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕реЛрдирд╛рд░'рдП:
рд╕рд╛рдорд╛рдиреНрдп рдкрд░реАрдХреНрд╖рдг рдбрд╛рдЯрд╛ - https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

рддрдкрд╛рдИрдВрдХреЛ рдкрд░рд┐рдпреЛрдЬрдирд╛рдорд╛ тАЛтАЛрдпреЛ рдкреБрд╕реНрддрдХрд╛рд▓рдп рд╕реНрдерд╛рдкрдирд╛ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

yarn add jest-sonar-reporter

рд░ рдпрд╕рд▓рд╛рдИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рдердкреНрдиреБрд╣реЛрд╕реН рдЫ:

package.json:

тАж
"testResultsProcessor": "jest-sonar-reporter"
тАж

рдЕрдм рдкрд░реАрдХреНрд╖рдг рдЪрд▓рд╛рдЙрдиреБрд╣реЛрд╕реН:

yarn test

рддреНрдпрд╕ рдкрдЫрд┐, рдкрд░рд┐рдпреЛрдЬрдирд╛рдХреЛ рд░реВрдЯрдорд╛ рдлрд╛рдЗрд▓ рд╕рд┐рд░реНрдЬрдирд╛ рдЧрд░рд┐рдиреЗрдЫ рдкрд░реАрдХреНрд╖рдг рд░рд┐рдкреЛрд░реНрдЯ.xml.

рдпрд╕рд▓рд╛рдИ рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рдирдорд╛ рд╕рдХреНрд╖рдо рдЧрд░реНрдиреБрд╣реЛрд╕реН рд╕реЛрдирд╛рд░'рдП:

sonar-project.properties:

тАж
sonar.testExecutionReportPaths=test-report.xml
тАж

рд░ рд╕реНрдХреНрдпрд╛рдирд░ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

yarn run sonar

рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫ рд╣реЗрд░реМрдВ рд╕реЛрдирд╛рд░'рдП:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рд░ рдХреЗрд╣рд┐ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫреИрдиред рддрдереНрдп рдпреЛ рд╣реЛ рдХрд┐ рд╕реЛрдирд╛рд░рд▓реЗ рдЬреЗрд╕реНрдЯ рд░рд┐рдкреЛрд░реНрдЯрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХрд╛ рдлрд╛рдЗрд▓рд╣рд░реВрд▓рд╛рдИ рдлрд╛рдЗрд▓рдХреЛ рд░реВрдкрдорд╛ рдорд╛рдиреНрджреИрдирдиреН рдПрдХрд╛рдЗ- рдкрд░реАрдХреНрд╖рдгрд╣рд░реВред рдпреЛ рдЕрд╡рд╕реНрдерд╛ рдареАрдХ рдЧрд░реНрдирдХреЛ рд▓рд╛рдЧрд┐, рд╣рд╛рдореА рдХрдиреНрдлрд┐рдЧрд░реЗрд╕рди рдкреНрдпрд╛рд░рд╛рдорд┐рдЯрд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрдЫреМрдВ рд╕реЛрдирд╛рд░ sonar.tests, рдЬрд╕рдорд╛ рд╣рд╛рдореАрд▓реЗ рдкрд░реАрдХреНрд╖рдгрдХрд╛ рд╕рд╛рде рдлреЛрд▓реНрдбрд░рд╣рд░реВ рд╕реНрдкрд╖реНрдЯ рд░реВрдкрдорд╛ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдЧрд░реНрдЫреМрдВ (рд╣рд╛рдореАрд╕рдБрдЧ рдЕрдЭреИ рдПрдЙрдЯрд╛ рдЫ):

sonar-project.properties:

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

рд╕реНрдХреНрдпрд╛рдирд░ рдкреБрди: рд╕реБрд░реБ рдЧрд░реНрдиреБрд╣реЛрд╕реН:

yarn run sonar

рдЗрдиреНрдЯрд░рдлреЗрд╕рдорд╛ рдХреЗ рдкрд░рд┐рд╡рд░реНрддрди рднрдПрдХреЛ рдЫ рд╣реЗрд░реМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

рдЕрдм рд╣рд╛рдореАрд▓реЗ рд╣рд╛рдореНрд░реЛ рд╕рдВрдЦреНрдпрд╛ рджреЗрдЦреНрдпреМрдВ рдПрдХрд╛рдЗ-рдкрд░реАрдХреНрд╖рдгрд╣рд░реВ рд░, рднрд┐рддреНрд░ рдХреНрд▓рд┐рдХ рдЧрд░реЗрд░ рдЕрд╕рдлрд▓ рднрдПрдкрдЫрд┐, рд╣рд╛рдореА рдкрд░рд┐рдпреЛрдЬрдирд╛ рдлрд╛рдЗрд▓рд╣рд░реВ рдмреАрдЪ рдпреЛ рдирдореНрдмрд░рдХреЛ рд╡рд┐рддрд░рдг рджреЗрдЦреНрди рд╕рдХреНрдЫреМрдВ:

SonarQube рд╕рдБрдЧ VueJS+TS рдкрд░рд┐рдпреЛрдЬрдирд╛ рдПрдХреАрдХрд░рдг

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

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

PS: рдХреЛрдбрдХреЛ рд░реВрдкрдорд╛ рд▓реЗрдЦрдорд╛ рд╡рд░реНрдгрди рдЧрд░рд┐рдПрдХреЛ рд╕рдмреИ рдХреБрд░рд╛ рдЙрдкрд▓рдмреНрдз рдЫ рдореЗрд░реЛ рдХрд╛рдБрдЯрд╛.

рджрд░реНрддрд╛ рднрдПрдХрд╛ рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдорд╛рддреНрд░ рд╕рд░реНрд╡реЗрдХреНрд╖рдгрдорд╛ рднрд╛рдЧ рд▓рд┐рди рд╕рдХреНрдЫрдиреНред рд╕рд╛рдЗрди рдЗрди рдЧрд░реНрдиреБрд╣реЛрд╕реНрдХреГрдкрдпрд╛

рдХреЗ рддрдкрд╛рдЗрдБ SonarQube рдкреНрд▓реЗрдЯрдлрд░реНрдо рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИ рд╣реБрдиреБрд╣реБрдиреНрдЫ:

  • 26,3%рд╣реЛ 5

  • 15,8%рдирдореНрдмрд░ реореж

  • 15,8%рдпрд╕ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реБрдиреЗрдХреЛ рдЫ рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдиреНрдЫреБ

  • 10,5%рдпреЛ рдкреНрд▓реЗрдЯрдлрд░реНрдордХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реБрдиреЗрдХреЛ рдЫ рд░ рдкреНрд░рдпреЛрдЧ рдЧрд░реНрди рдЪрд╛рд╣рдБрджреИрдирдиреН

  • 0,0%рдо рдлрд░рдХ рдкреНрд▓реЗрдЯрдлрд░реНрдо реж рдкреНрд░рдпреЛрдЧ рдЧрд░реНрджреИрдЫреБ

  • 31,6%рдкрд╣рд┐рд▓реЛ рдкрдЯрдХ рдЙрдирдХреЛ рдмрд╛рд░реЗрдорд╛ рд╕реБрдиреЗрдХреЛ рдЫреБ

19 рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВрд▓реЗ рдорддрджрд╛рди рдЧрд░реЗред реи рдкреНрд░рдпреЛрдЧрдХрд░реНрддрд╛рд╣рд░реВ рд░реЛрдХрд┐рдПред

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

рдПрдХ рдЯрд┐рдкреНрдкрдгреА рдердкреНрди