ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืžื™ืจ ืึทืงื˜ื™ื•ื•ืœื™ ื ื•ืฆืŸ ื“ื™ ืคึผืœืึทื˜ืคืึธืจืžืข ืื™ืŸ ืื•ื ื“ื–ืขืจ ืึทืจื‘ืขื˜ SonarQube ืฆื• ื”ืึทืœื˜ืŸ ืงืึธื“ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืื•ื™ืฃ ืึท ื”ื•ื™ืš ืžื“ืจื’ื”. ื•ื•ืขืŸ ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืคึผืจืึทื“ื–ืฉืขืงืก ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ VueJs + ื˜ื™ืคึผ ืกืงืจื™ืคึผื˜, ื”ืื‘ ืŸ ื–ื™ ืš ืื•ื™ืคื’ืขื”ื•ื™ื‘ ืŸ ืคืจืื‘ืœืขืžืขืŸ . ื“ืขืจื™ื‘ืขืจ, ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื“ืขืจืฆื™ื™ืœืŸ ืื™ืจ ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ ื•ื•ื™ ืžื™ืจ ื’ืขืจืื˜ืŸ ืฆื• ืกืึธืœื•ื•ืข ื–ื™ื™.

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื•ื•ืขืœืŸ ืจืขื“ืŸ, ื•ื•ื™ ืื™ืš ื’ืขืฉืจื™ื‘ืŸ ืื•ื™ื‘ืŸ, ื•ื•ืขื’ืŸ ื“ื™ SonarQube ืคึผืœืึทื˜ืคืึธืจืžืข. ื ื‘ื™ืกืœ ื˜ืขืึธืจื™ืข - ื•ื•ืึธืก ืขืก ืื™ื– ืื™ืŸ ืึทืœื’ืขืžื™ื™ืŸ, ืคึฟืึทืจ ื“ื™ ื•ื•ืืก ื”ืขืจืŸ ื•ื•ืขื’ืŸ ืขืก ืคึฟืึทืจ ื“ื™ ืขืจืฉื˜ืขืจ ืžืึธืœ:

SonarQube (ืคืจื™ืขืจ ืกืึธื ืึทืจ) ืื™ื– ืึทืŸ ืึธืคึฟืŸ ืžืงื•ืจ ืคึผืœืึทื˜ืคืึธืจืžืข ืคึฟืึทืจ ืงืขืกื™ื™ื“ืขืจื“ื™ืง ื“ื•ืจื›ืงื•ืง ืื•ืŸ ืžืขื–ืฉืขืจืžืึทื ื˜ ืคื•ืŸ ืงืึธื“ ืงื•ื•ืึทืœื™ื˜ืขื˜.
ืฉื˜ื™ืฆื˜ ืงืึธื“ ืึทื ืึทืœื™ืกื™ืก ืื•ืŸ ื˜ืขื•ืช ื“ื™ื˜ืขืงืฉืึทืŸ ืœื•ื™ื˜ ื“ื™ ื›ึผืœืœื™ื ืคื•ืŸ ื“ื™ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืกื˜ืึทื ื“ืึทืจื“ืก MISRA C, MISRA C ++, MITER/CWE ืื•ืŸ CERT Secure Coding Standards. ืขืก ืงืขืŸ ืื•ื™ืš ื“ืขืจืงืขื ืขืŸ ืขืจืจืึธืจืก ืคื•ืŸ ื“ื™ OWASP Top 10 ืื•ืŸ CWE/SANS Top 25 ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืขืจืจืึธืจืก ืจืฉื™ืžื•ืช.
ื˜ืจืึธืฅ ื“ืขื ืคืึทืงื˜ ืึทื– ื“ื™ ืคึผืœืึทื˜ืคืึธืจืžืข ื ื™ืฆื˜ ืคืึทืจืฉื™ื“ืŸ ืคืึทืจื˜ื™ืง ืžื›ืฉื™ืจื™ื, SonarQube ืจืึทื“ื•ืกืึทื– ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜ืŸ ืฆื• ืึท ืื™ื™ืŸ ื“ืึทืฉื‘ืึธืจื“, ื‘ืขื›ืขืกืงืขื ืึท ื’ืขืฉื™ื›ื˜ืข ืคื•ืŸ โ€‹โ€‹ืœื•ื™ืคื˜ ืื•ืŸ ื“ืขืจืžื™ื˜ ืึทืœืึทื•ื™ื ื’ ืื™ืจ ืฆื• ื–ืขืŸ ื“ื™ ืึทืœื’ืขืžื™ื™ื ืข ื’ืึทื ื’ ืคื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ื•ื•ื™ื™ื›ื•ื•ืืจื’ ืงื•ื•ืึทืœื™ื˜ืขื˜ ื‘ืขืฉืึทืก ืึทื ื˜ื•ื•ื™ืงืœื•ื ื’.

ืžืขืจ ื“ืขื˜ืึทื™ืœืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ ื“ืขืจ ื‘ืึทืึทืžื˜ืขืจ ืคึผืœืึทืฅ

ื ื’ืจื•ื™ืก ื ื•ืžืขืจ ืคื•ืŸ ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทื›ืŸ ื–ืขื ืขืŸ ื’ืขืฉื˜ื™ืฆื˜. ืื•ื™ื‘ ืžืฉืคื˜ืŸ ืœื•ื™ื˜ ื“ื™ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืœื™ื ืง ืื•ื™ื‘ืŸ, ื“ืึธืก ื–ืขื ืขืŸ ืžืขืจ ื•ื•ื™ 25 ืฉืคึผืจืึทื›ืŸ. ืฆื• ืฉื˜ื™ืฆืŸ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืฉืคึผืจืึทืš, ืื™ืจ ืžื•ื–ืŸ ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืฆื•ื ืขืžืขืŸ ืคึผืœื•ื’ื™ืŸ. ื“ื™ ืงื”ืœ ื•ื•ืขืจืกื™ืข ื›ื•ืœืœ ืึท ืคึผืœื•ื’ื™ืŸ ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ (ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ื˜ื™ื™ืคึผืกืกืงืจื™ืคึผื˜), ื›ืึธื˜ืฉ ื“ื™ ื•ื•ื™ืงื™ ื–ืื’ื˜ ื“ื™ ืคืึทืจืงืขืจื˜. ื”ื™ื ื˜ืขืจ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืคึผืœื•ื’ื™ืŸ ืขื ื˜ืคึฟืขืจืก SonarJS, ืคึฟืึทืจ ื˜ื™ืคึผืกืงืจื™ืคึผื˜ SonarTS ืจื™ืกืคึผืขืงื˜ื™ื•ื•ืœื™.

ื“ืขืจ ื‘ืึทืึทืžื˜ืขืจ ืงืœื™ืขื ื˜ ืื™ื– ื’ืขื ื™ืฆื˜ ืฆื• ืฉื™ืงืŸ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข sonarqube-scanner, ื•ื•ืึธืก, ื ื™ืฆืŸ ื“ื™ ืกืขื˜ื˜ื™ื ื’ืก ืคื•ืŸ ืงืึธื ืคื™ื’-ื˜ืขืงืข, ืกืขื ื“ื– ื“ื™ ื“ืึทื˜ืŸ ืฆื• ื“ื™ ืกืขืจื•ื•ืขืจ SonarQube ืคึฟืึทืจ ื•ื•ื™ื™ึทื˜ืขืจ ืงืึทื ืกืึทืœืึทื“ื™ื™ืฉืึทืŸ ืื•ืŸ ืึทื’ื’ืจืขื’ืึทื˜ื™ืึธืŸ.

ืคืึทืจ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜ ืขืก ื™ื– ืคืึทืจืึทืŸ npm ืจืึทืคึผืขืจ. ืึทื–ื•ื™, ืœืึธื–ืŸ ืื•ื ื“ื– ืึธื ื”ื™ื™ื‘ืŸ ืึท ืฉืจื™ื˜-ื“ื•ืจืš-ืฉืจื™ื˜ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ SonarQube ะฒ Vue-ืคึผืจืึธื™ืขืงื˜ ื ื™ืฆืŸ ื˜ื™ืคึผืขืกืงืจื™ืคึผื˜.

ืฆื• ื™ื ืกื˜ืึทืœื™ืจืŸ ื“ื™ ืกืขืจื•ื•ืขืจ SonarQube ืœืืžื™ืจ ืื•ื™ืกื ื•ืฆืŸ ื“ืึธืงืขืจ-ืงืึทืžืคึผืึธื•ื–.

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, ื•ื•ืืก ื”ื™ื™ืกื˜ ืกืึธื ืึทืจ-ืกืงืึทื ืขืจ, ืคึฟืึทืจ 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 - ื–ื™ื™ืŸ ื ืึธืžืขืŸ, ืขืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ื˜ืฉื™ื™ื ื“ื–ืฉื“ ืื™ืŸ ืงื™ื™ืŸ ืฆื™ื™ื˜, ื–ื™ื ื˜ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื™ื™ื“ืขื ืึทืคื™ื™ื“ ื“ื•ืจืš projectKey;
  • sonar.sources - ื˜ืขืงืข ืžื™ื˜ ืงื•ื•ืืœืŸ, ื™ื•ื–ืฉืึทื•ื•ืึทืœื™ ื“ืึธืก ืกืจืง, ืึธื‘ืขืจ ืงืขื ืขืŸ ื–ื™ื™ืŸ ืขืคึผืขืก. ื“ืขืจ ื˜ืขืงืข ืื™ื– ื‘ืึทืฉื˜ื™ืžื˜ ืงืึธืจืขื•ื• ืฆื• ื“ืขืจ ื•ื•ืึธืจืฆืœ ื˜ืขืงืข, ื•ื•ืึธืก ืื™ื– ื“ืขืจ ื˜ืขืงืข ืคึฟื•ืŸ ื•ื•ืึธืก ื“ื™ ืกืงืึทื ื ืขืจ ืื™ื– ืœืึธื ื˜ืฉื˜;
  • 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

ืžื™ืจ ื•ื•ืขืœืŸ ื–ืขืŸ ื“ื™ ืคืืœื’ืขื ื“ืข:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื“ื™ ืกื™ื‘ื” ืื™ื– ืึทื– ืขืก ืื™ื– ืงื™ื™ืŸ ืงืึธื“ ืื™ืŸ ื“ืขืจ ืงืึธืžืคึผืึธื ืขื ื˜ ื–ื™ืš. ื–ืืœ ืก ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื.

HelloWorld.vue:

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

ื“ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขื ื•ื’ ืฆื• ืจืขื›ืขื ืขืŸ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ.

ื ืึธืš ืจื™ืกื˜ืึทืจื˜ื™ื ื’ ื“ื™ ืคึผืจืึธื‘ืข, ืžื™ืจ ื•ื•ืขืœืŸ ืžืึทื›ืŸ ื–ื™ื›ืขืจ ืคื•ืŸ ื“ืขื:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืื•ื™ืฃ ื“ืขื ืขืงืจืึทืŸ ืžื™ืจ ื–ืึธืœ ื–ืขืŸ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ, ืื•ืŸ ืึท ื˜ืขืงืข ื•ื•ืขื˜ ื–ื™ื™ืŸ ื‘ืืฉืืคืŸ ืื™ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื˜ืขืงืข ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืžื™ื˜ ืคึผืจืึธื‘ืข ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ืŸ ืึท ื•ื ื™ื•ื•ืขืจืกืึทืœ ืคึฟืึธืจืžืึทื˜ LCOV (LTP GCOV ื’ืขืฉืคึผืจื™ื™ื˜).

ื’ืงืึธื•ื• ืื™ื– ืึท ืคืจื™ืœื™ ืคื•ื ืื ื“ืขืจื’ืขื˜ื™ื™ืœื˜ ื ื•ืฆืŸ ืคึฟืึทืจ ื™ื’ื–ืึทืžื™ื ื™ื ื’ ืงืึธื“ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ. Gcov ื“ื–ืฉืขื ืขืจื™ื™ืฅ ื“ื™ ืคึผื™ื ื˜ืœืขืš ื ื•ืžืขืจ ืคื•ืŸ ืขืงืกืึทืงื™ื•ืฉืึทื ื– ืคึฟืึทืจ ื™ืขื“ืขืจ ื•ื™ืกื–ืึธื’ื•ื ื’ ืื™ืŸ ืึท ืคึผืจืึธื’ืจืึทื ืื•ืŸ ืึทืœืึทื•ื– ืื™ืจ ืฆื• ืœื™ื™ื’ืŸ ืึทื ืึทื˜ื™ื™ืฉืึทื ื– ืฆื• ื“ื™ ืžืงื•ืจ ืงืึธื“. Gcov ืงื•ืžื˜ ื•ื•ื™ ืึท ื ืึธืจืžืึทืœ ื ื•ืฆืŸ ื•ื•ื™ ืึท ื˜ื™ื™ืœ ืคื•ืŸ ื“ื™ GCC ืคึผืขืงืœ.
Lcov - ื’ืจืึทืคื™ืงืึทืœ ืฆื•ื‘ื™ื ื“ ืคึฟืึทืจ gcov. ืขืก ืึทืกืขืžื‘ืึทืœื– ื’ืงืึธื•ื• ื˜ืขืงืขืก ืคึฟืึทืจ ืงื™ื™ืคืœ ืžืงื•ืจ ื˜ืขืงืขืก ืื•ืŸ ื˜ืจืื’ื˜ ืึท ืกื›ื•ื ืคื•ืŸ HTML ื‘ืœืขื˜ืขืจ ืžื™ื˜ ืงืึธื“ ืื•ืŸ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข. ื‘ืœืขื˜ืขืจ ื–ืขื ืขืŸ ืื•ื™ืš ื“ื–ืฉืขื ืขืจื™ื™ื˜ืึทื“ ืฆื• ืžืึทื›ืŸ ื ืึทื•ื•ื™ื’ืึทืฆื™ืข ื’ืจื™ื ื’ืขืจ. Lcov ืฉื˜ื™ืฆื˜ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืคื•ืŸ ืกื˜ืจื™ื ื’ืก, ืคืึทื ื’ืงืฉืึทื ื– ืื•ืŸ ืฆื•ื•ื™ื™ื’ืŸ.

ื ืึธืš ื“ื™ ื˜ืขืกืฅ ื–ืขื ืขืŸ ื’ืขืขื ื“ื™ืงื˜, ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื˜ ื–ื™ื™ืŸ ื’ืขืคึฟื•ื ืขืŸ ืื™ืŸ coverage/lcov.info.
ืžื™ืจ ื“ืึทืจืคึฟืŸ ืฆื• ื–ืึธื’ืŸ ืกืึธื ืึทืจ'ืคื•ืŸ ื•ื•ื• ืงืขืŸ ืื™ืš ื‘ืึทืงื•ืžืขืŸ ืขืก? ื“ืขืจื™ื‘ืขืจ, ืœืึธื–ืŸ ืื•ื ื“ื– ืœื™ื™ื’ืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืฉื•ืจื•ืช ืฆื• ื–ื™ื™ืŸ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข. ืื‘ืขืจ ืขืก ืื™ื– ืื™ื™ืŸ ืคื•ื ื˜: ืคึผืจืึทื“ื–ืฉืขืงืก ืงืขื ืขืŸ ื–ื™ื™ืŸ ืžืึทืœื˜ื™ื™ืœื™ื ื’ื•ื•ืึทืœ, ื“ืึธืก ืื™ื–, ืื™ืŸ ื“ืขืจ ื˜ืขืงืข ืกืจืง ืขืก ื–ืขื ืขืŸ ืžืงื•ืจ ืงืึธื•ื“ื– ืคึฟืึทืจ ืขื˜ืœืขื›ืข ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทื›ืŸ ืื•ืŸ ืึทืคื™ืœื™ื™ื™ืฉืึทืŸ ืžื™ื˜ ืื™ื™ืŸ ืึธื“ืขืจ ืื ื“ืขืจืŸ, ืื•ืŸ ืื™ืŸ ืงืขืจ, ื“ื™ ื ื•ืฆืŸ ืคื•ืŸ ืื™ื™ืŸ ืึธื“ืขืจ ืื ื“ืขืจืŸ ืคึผืœื•ื’ื™ืŸ ืื™ื– ื‘ืืฉืœืืกืŸ ื“ื•ืจืš ื–ื™ื™ึทืŸ ืคืึทืจืœืขื ื’ืขืจื•ื ื’. ืื•ืŸ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืงืขื ืขืŸ ื–ื™ื™ืŸ ืกื˜ืึธืจื“ ืื™ืŸ ืคืึทืจืฉื™ื“ืขื ืข ืขืจื˜ืขืจ ืคึฟืึทืจ ืคืึทืจืฉื™ื“ืขื ืข ืคึผืจืึธื’ืจืึทืžืžื™ื ื’ ืฉืคึผืจืึทื›ืŸ, ืึทื–ื•ื™ ื™ืขื“ืขืจ ืฉืคึผืจืึทืš ื”ืื˜ ื–ื™ื™ืŸ ืื™ื™ื’ืขื ืข ืึธืคึผื˜ื™ื™ืœื•ื ื’ ืคึฟืึทืจ ื‘ืึทืฉื˜ืขื˜ื™ืงืŸ ื“ืขื. ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜ ื ื™ืฆื˜ ื˜ื™ืคึผืขืกืงืจื™ืคึผื˜, ืึทื–ื•ื™ ืžื™ืจ ื“ืึทืจืคึฟืŸ ืึท ืกืขื˜ื˜ื™ื ื’ืก ืึธืคึผื˜ื™ื™ืœื•ื ื’ ื ืึธืจ ืคึฟืึทืจ ืื™ื:

sonar-project.properties:

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

ืึทืœืฅ ืื™ื– ื’ืจื™ื™ื˜ ืคึฟืึทืจ ื“ืขืจ ืขืจืฉื˜ืขืจ ืงืึทื˜ืขืจ ืคื•ืŸ ื“ื™ ืกืงืึทื ื ืขืจ. ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื˜ืึธืŸ ืึทื– ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ืกืึธื ืึทืจ'e ืื™ื– ื‘ืืฉืืคืŸ ืื•ื™ื˜ืึธืžืึทื˜ื™ืฉ ื“ืขืจ ืขืจืฉื˜ืขืจ ืžืึธืœ ืื™ืจ ืœื•ื™ืคืŸ ื“ื™ ืกืงืึทื ื ืขืจ ืคึฟืึทืจ ืึท ื’ืขื’ืขื‘ืŸ ืคึผืจื•ื™ืขืงื˜. ืื™ืŸ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ืฆื™ื™ื˜, ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื˜ ื–ื™ื™ืŸ ืึทืงื™ื•ืžื™ืึทืœื™ื™ื˜ื™ื“ ืื™ืŸ ืกื“ืจ ืฆื• ื–ืขืŸ ื“ื™ ื“ื™ื ืึทืžื™ืง ืคื•ืŸ ืขื ื“ืขืจื•ื ื’ืขืŸ ืื™ืŸ ืคึผืจื•ื™ืขืงื˜ ืคึผืึทืจืึทืžืขื˜ืขืจืก ืื™ื‘ืขืจ ืฆื™ื™ึทื˜.

ืึทื–ื•ื™, ืœืึธื–ืŸ ืื•ื ื“ื– ื ื•ืฆืŸ ื“ื™ ื‘ืึทืคึฟืขืœ ื‘ืืฉืืคืŸ ืคืจื™ืขืจ ืื™ืŸ package.json:

yarn run sonar 

ื‘ืึทืžืขืจืงื•ื ื’: ืื™ืจ ืงืขื ื˜ ืื•ื™ืš ื ื•ืฆืŸ ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ -X ืคึฟืึทืจ ืžืขืจ ื“ื™ื˜ื™ื™ืœื“ ืœืึธื’ื™ื ื’.

ืื•ื™ื‘ ื“ื™ ืกืงืึทื ืขืจ ืื™ื– ื’ืขื•ื•ืขืŸ ืœืึธื ื˜ืฉื˜ ืคึฟืึทืจ ื“ื™ ืขืจืฉื˜ืขืจ ืžืึธืœ, ื“ื™ ื‘ื™ื™ื ืขืจื™ ืคื•ืŸ ื“ื™ ืกืงืึทื ืขืจ ื–ื™ืš ื•ื•ืขื˜ ื–ื™ื™ืŸ ื“ืึทื•ื ืœืึธื•ื“ื™ื“ ืขืจืฉื˜ืขืจ. ื ืึธืš ื“ืขื, ืขืก ืกื˜ืึทืจืฅ ืื•ืŸ ืกื˜ืึทืจืฅ ืกืงืึทื ื™ื ื’ ื“ื™ ืกืขืจื•ื•ืขืจ ืกืึธื ืึทืจ'ืึท ืคึฟืึทืจ ืื™ื ืกื˜ืึทืœื™ืจืŸ ืคึผืœื•ื’ื™ื ืก, ื“ืขืจืžื™ื˜ ืงืึทืœืงื™ืึทืœื™ื™ื˜ื™ื ื’ ืฉื˜ื™ืฆื˜ ืฉืคึผืจืึทืš. ืขื˜ืœืขื›ืข ืื ื“ืขืจืข ืคึผืึทืจืึทืžืขื˜ืขืจืก ืคึฟืึทืจ ื–ื™ื™ึทืŸ ืึธืคึผืขืจืึทืฆื™ืข ื–ืขื ืขืŸ ืื•ื™ืš ืœืึธื•ื“ื™ื“: ืงื•ื•ืึทืœื™ื˜ืขื˜ ืคึผืจืึธื•ืคื™ื™ืœื–, ืึทืงื˜ื™ื•ื• ื›ึผืœืœื™ื, ืžืขื˜ืจื™ืง ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™, ืกืขืจื•ื•ืขืจ ื›ึผืœืœื™ื.

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื‘ืึทืžืขืจืงื•ื ื’: ืžื™ืจ ื•ื•ืขืœืŸ ื ื™ืฉื˜ ื•ื•ื•ื™ื ืขืŸ ืื•ื™ืฃ ื–ื™ื™ ืื™ืŸ ื“ืขื˜ืึทืœ ืื™ืŸ ื“ื™ ืคืจื™ื™ืžื•ื•ืขืจืง ืคื•ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ, ืึธื‘ืขืจ ืื™ืจ ืงืขื ืขืŸ ืฉื˜ืขื ื“ื™ืง ืงืึธื ื˜ืึทืงื˜ ื‘ืึทืึทืžื˜ืขืจ ืงื•ื•ืืœืŸ.

ื•ื•ื™ื™ึทื˜ืขืจ, ื“ื™ ื˜ืขืงืข ืึทื ืึทืœื™ืกื™ืก ื”ื™ื™ื‘ื˜ ืกืจืง ืคึฟืึทืจ ื“ื™ ืึทื•ื•ื™ื™ืœืึทื‘ื™ืœืึทื˜ื™ ืคื•ืŸ ืžืงื•ืจ ื˜ืขืงืขืก ืคึฟืึทืจ ืึทืœืข (ืื•ื™ื‘ ืึท ืกืคึผืขืฆื™ืคื™ืฉ ืื™ื™ื ืขืจ ืื™ื– ื ื™ืฉื˜ ื‘ืคื™ืจื•ืฉ ืกืคึผืขืกื™ืคื™ืขื“) ื’ืขืฉื˜ื™ืฆื˜ ืฉืคึผืจืึทืš, ืžื™ื˜ ื–ื™ื™ืขืจ ืกืึทื‘ืกืึทืงื•ื•ืึทื ื˜ ื™ื ื“ืขืงืกื™ื ื’.

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื•ื•ื™ื™ึทื˜ืขืจ ืงื•ืžืขืŸ ืคืึทืจืฉื™ื“ืŸ ืื ื“ืขืจืข ืึทื ืึทืœื™ื–ืขืก, ื•ื•ืึธืก ืžื™ืจ ื˜ืึธืŸ ื ื™ื˜ ืคืึธืงื•ืก ืื•ื™ืฃ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ (ืœืžืฉืœ, ื•ื•ื™ ืœื™ื ื˜ื™ื ื’, ื“ื™ื˜ืขืงืฉืึทืŸ ืคื•ืŸ ืงืึธื“ ื“ื•ืคึผืœื™ืงืึทื˜ื™ืึธืŸ, ืืื–"ื• ื•).

ืื™ืŸ ื“ื™ ืกื•ืฃ ืคื•ืŸ ื“ื™ ืึทืจื‘ืขื˜ ืคื•ืŸ ื“ื™ ืกืงืึทื ื ืขืจ, ืึทืœืข ื’ืขื–ืืžืœื˜ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื– ืึทื’ืจืึทื’ื™ื™ื˜ืึทื“, ืึทืจื˜ืฉื™ื•ื•ืขื“ ืื•ืŸ ื’ืขืฉื™ืงื˜ ืฆื• ื“ื™ ืกืขืจื•ื•ืขืจ.

ื ืึธืš ื“ืขื, ืžื™ืจ ืงืขื ืขืŸ ืฉื•ื™ืŸ ื–ืขืŸ ื•ื•ืึธืก ื’ืขื˜ืจืืคืŸ ืื™ืŸ ื“ื™ ื•ื•ืขื‘ ืฆื•ื‘ื™ื ื“:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื•ื•ื™ ืžื™ืจ ืงืขื ืขืŸ ื–ืขืŸ, ืขืคึผืขืก ื’ืขืืจื‘ืขื˜, ืื•ืŸ ืืคื™ืœื• ื•ื•ื™ื™ื–ื˜ ืึท ืžื™ืŸ ืคื•ืŸ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ, ืึธื‘ืขืจ ืขืก ืื™ื– ื ื™ืฉื˜ ื’ืœื™ื™ึทื›ืŸ ืื•ื ื“ื–ืขืจ ืขืก ืื™ื–-ื‘ืึทืจื™ื›ื˜.

ื–ืืœ ืก ืคื™ื’ื•ืจ ืขืก ืื•ื™ืก. ืœืึธืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืื™ืŸ ืžืขืจ ื“ืขื˜ืึทืœ, ื“ืจื™ืงื˜ ืื•ื™ืฃ ื“ื™ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ื•ื•ืขืจื˜ ืื•ืŸ "ืคืึทืœืŸ ื“ื•ืจืš" ืื™ืŸ ืึท ื“ื™ื˜ื™ื™ืœื“ ื˜ืขืงืข ื‘ืึทืจื™ื›ื˜:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื“ืึธ ืžื™ืจ ื–ืขืŸ, ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ื”ื•ื™ืคึผื˜, ื™ื’ื–ืึทืžืึทื ื“ ื˜ืขืงืข HelloWorld.vue, ืขืก ืื™ื– ืื•ื™ืš ืึท ื˜ืขืงืข ื”ื•ื™ืคึผื˜.ืฆ, ื•ื•ืึธืก ืกืคึผื•ื™ืœื– ื“ื™ ื’ืื ืฆืข ื‘ื™ืœื“ ืคื•ืŸ ื“ื™ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ. ืื‘ืขืจ ื•ื•ื™ ืงื•ืžื˜ ืขืก ืžื™ืจ ื™ืงืกืงืœื•ื“ื™ื“ ืขืก ืคื•ืŸ ื“ื™ ื›ืขื–ืฉื‘ืŸ ืคื•ืŸ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ. ื™ืึธ, ืึทืœืฅ ืื™ื– ืจื™ื›ื˜ื™ืง, ืึธื‘ืขืจ ืขืก ืื™ื– ื’ืขื•ื•ืขืŸ ืื•ื™ืฃ ื“ืขืจ ืžื“ืจื’ื” ืขืก ืื™ื–, ืึธื‘ืขืจ ื“ืขืจ ืกืงืึทื ืขืจ ื™ื ื“ืขืงืกื˜ ืขืก, ืึทื–ื•ื™ ืขืก ืขื ื“ื™ืงื˜ ื–ื™ืš ืื™ืŸ ื–ื™ื™ืŸ ื—ืฉื‘ื•ื ื•ืช.

ื–ืืœ ืก ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื:

sonar-project.properties:

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

ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ืžืึทื›ืŸ ืึท ืงืœืขืจืึทืคืึทืงื™ื™ืฉืึทืŸ: ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ื“ื™ ืคืึธืœื“ืขืจืก ื•ื•ืึธืก ื–ืขื ืขืŸ ืกืคึผืขืกื™ืคื™ืขื“ ืื™ืŸ ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ, ืึทืœืข ืคืึธืœื“ืขืจืก ืœื™ืกื˜ืขื“ ืื™ืŸ ื“ืขื ืคึผืึทืจืึทืžืขื˜ืขืจ ื–ืขื ืขืŸ ืื•ื™ืš ืฆื•ื’ืขื’ืขื‘ืŸ sonar.test.inclusions.

ื ืึธืš ืœืึธื ื˜ืฉื™ื ื’ ื“ื™ ืกืงืึทื ื ืขืจ, ืžื™ืจ ื–ืขืŸ ื“ื™ ืจื™ื›ื˜ื™ืง ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืœืึธืžื™ืจ ืงื•ืงืŸ ืื•ื™ืฃ ื“ืขืจ ื•ื•ื™ื™ึทื˜ืขืจ ืคื•ื ื˜ - ืงื•ื•ืึทืœื™ื˜ืขื˜ ืคึผืจืึธื•ืคื™ื™ืœื–. ืื™ืš ื’ืขืจืขื“ื˜ ืื•ื™ื‘ืŸ ื•ื•ืขื’ืŸ ืฉื˜ื™ืฆืŸ ืกืึธื ืึทืจืคื•ืŸ ืขื˜ืœืขื›ืข ืฉืคึผืจืึทื›ืŸ ืื™ืŸ ื“ืขืจ ื–ืขืœื‘ื™ืงืขืจ ืฆื™ื™ื˜. ื“ืึธืก ืื™ื– ืคึผื•ื ืงื˜ ื•ื•ืึธืก ืžื™ืจ ื–ืขืŸ. ืึธื‘ืขืจ ืžื™ืจ ื•ื•ื™ืกืŸ ืึทื– ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜ ืื™ื– ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ TS, ืึทื–ื•ื™ ื•ื•ืึธืก ืฉืคึผืึทื ื•ื ื’ ื“ื™ ืกืงืึทื ื ืขืจ ืžื™ื˜ ื•ืžื ื™ื™ื˜ื™ืง ืžืึทื ื™ืคึผื™ืึทืœื™ื™ืฉืึทื ื– ืื•ืŸ ื˜ืฉืขืงืก. ืžื™ืจ ื•ื•ืขืœืŸ ืฉื˜ืขืœืŸ ื“ื™ ืฉืคึผืจืึทืš ืคึฟืึทืจ ืึทื ืึทืœื™ืกื™ืก ื“ื•ืจืš ืึทื“ื™ื ื’ ื ืึธืš ืึท ืคึผืึทืจืึทืžืขื˜ืขืจ ืฆื• ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ื˜ืขืงืข ืกืึธื ืึทืจ'ื:

sonar-project.properties:

...
sonar.language=ts
...

ืœืึธืžื™ืจ ืœื•ื™ืคืŸ ื“ื™ ืกืงืึทื ืขืจ ื•ื•ื™ื“ืขืจ ืื•ืŸ ื–ืขืŸ ื“ื™ ืจืขื–ื•ืœื˜ืึทื˜:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื“ื™ ื“ืขืงื•ื ื’ ืื™ื– ื’ืึธืจ ื ื™ื˜ืึธ.

ืื•ื™ื‘ ืžื™ืจ ืงื•ืงืŸ ืื™ืŸ ื“ื™ ืกืงืึทื ืขืจ ืงืœืึธืฅ, ืžื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ื“ื™ ืคืืœื’ืขื ื“ืข ืฉื•ืจื”:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืึทื– ืื™ื–, ืื•ื ื“ื–ืขืจ ืคึผืจื•ื™ืขืงื˜ ื˜ืขืงืขืก ืคืฉื•ื˜ ื–ืขื ืขืŸ ื ื™ืฉื˜ ื™ื ื“ืขืงืกื˜.

ื“ื™ ืกื™ื˜ื•ืึทืฆื™ืข ืื™ื– ื•ื•ื™ ื’ื™ื™ื˜: ืึทืคื™ืฉืึทืœื™ ื’ืขืฉื˜ื™ืฆื˜ VueJs ืื™ื– ืื™ืŸ ื“ื™ ืคึผืœื•ื’ื™ืŸ SonarJSื•ื•ืขืจ ืื™ื– ืคืึทืจืึทื ื˜ื•ื•ืึธืจื˜ืœืขืš ืคึฟืึทืจ ื“ื–ืฉืึทื•ื•ืึทืกืงืจื™ืคึผื˜.

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืื‘ืขืจ ื“ืขื ืฉื˜ื™ืฆืŸ ืื™ื– ื ื™ืฉื˜ ืื™ืŸ ื“ื™ ืคึผืœื•ื’ื™ืŸ SonarTS ืคืึทืจ TS, ื•ื•ืขื’ืŸ ื•ื•ืึธืก ืึท ื‘ืึทืึทืžื˜ืขืจ ื‘ื™ืœืขื˜ ืื™ื– ื’ืขืขืคื ื˜ ื’ืขื•ื•ืืจืŸ ืื™ืŸ ื“ื™ ื–ืฉื•ืง ื˜ืจืึทืงืขืจ ืกืึธื ืึทืจ'ื:

  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-project.properties:

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

ื–ืืœ ืก ืงืึทื˜ืขืจ ื“ื™ ืกืงืึทื ื ืขืจ:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืื•ืŸ, ื•ื•ื•ื•ืึทืœืึท, ืึทืœืฅ ืื™ื– ืฆื•ืจื™ืง ืฆื• ื ืึธืจืžืึทืœ, ืื•ืŸ ืžื™ื˜ ืื™ื™ืŸ ืคึผืจืึธืคื™ืœ ื‘ืœื•ื™ื– ืคึฟืึทืจ ื˜ื™ืคึผืขืกืงืจื™ืคึผื˜. ืึทื– ืื™ื–, ืžื™ืจ ื’ืขืจืื˜ืŸ ืฆื• ืกืึธืœื•ื•ืข ื“ื™ ืคึผืจืึธื‘ืœืขื ืื™ืŸ ืฉื˜ื™ืฆืŸ VueJs+TS ืคืึทืจ SonarQube.

ื–ืืœ ืก ืคึผืจื•ื‘ื™ืจืŸ ืฆื• ื’ื™ื™ืŸ ื•ื•ื™ื™ึทื˜ืขืจ ืื•ืŸ ืคึฟืึทืจื‘ืขืกืขืจืŸ ื“ื™ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืึท ื‘ื™ืกืœ.

ื•ื•ืึธืก ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื˜ืืŸ ื‘ื™ื– ืื™ืฆื˜:

  • ืฆื•ื’ืขื’ืขื‘ืŸ ืฆื• ื“ื™ ืคึผืจื•ื™ืขืงื˜ ืกืึธื ืึทืจ-ืกืงืึทื ืขืจ;
  • ืฉื˜ืขืœ ืื•ื™ืฃ ืขืก ืื™ื– ืฆื• ื“ื–ืฉืขื ืขืจื™ื™ื˜ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข;
  • ืงืึทื ืคื™ื’ื™ืขืจื“ ืกืึธื ืึทืจ-ืกืงืึทื ืขืจ;
  • ืกืึทืœื•ื•ื“ ื“ื™ ืฉื˜ื™ืฆืŸ ืคึผืจืึธื‘ืœืขื .vue-ืคื™ืœืขืก + ื˜ื™ืคึผืขืกืงืจื™ืคึผื˜.

ืื™ืŸ ืึทื“ื™ืฉืึทืŸ ืฆื• ืคึผืจืึธื‘ืข ืงืึทื•ื•ืขืจื™ื“ื–ืฉ, ืขืก ื–ืขื ืขืŸ ืื ื“ืขืจืข ื˜ืฉื™ืงืึทื•ื•ืข ื ื•ืฆื™ืง ืงืจื™ื™ื˜ื™ืจื™ืึท ืคึฟืึทืจ ืงืึธื“ ืงื•ื•ืึทืœื™ื˜ืขื˜, ืคึฟืึทืจ ื‘ื™ื™ึทืฉืคึผื™ืœ, ืงืึธื“ ื“ื•ืคึผืœื™ืงื™ื™ืฉืึทืŸ ืื•ืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืฉื•ืจื•ืช (ื™ื ื•ื•ืึทืœื•ื•ื“ ืื™ืŸ ื“ื™ ื›ืขื–ืฉื‘ืŸ ืคื•ืŸ ืงืึธื•ืึทืคื™ืฉืึทื ืฅ ืฉื™ื™ึทื›ื•ืช ืฆื• ืงืึธื“ ืงืึทืžืคึผืœืขืงืกื™ื˜ื™) ืคื•ืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜.

ืื™ืŸ ื“ืขื ืงืจืึทื ื˜ ื™ืžืคึผืœืึทืžืขื ื˜ื™ื™ืฉืึทืŸ ืคื•ืŸ ื“ื™ ืคึผืœื•ื’ื™ืŸ ืคึฟืึทืจ ืืจื‘ืขื˜ืŸ ืžื™ื˜ TS (SonarTS) ื•ื•ืขื˜ ื ื™ืฉื˜ ืึทืจื‘ืขื˜ืŸ CPD (Copy Paste Detector) ืื•ืŸ ืงืึทื•ื ื˜ื™ื ื’ ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“ .vue- ื˜ืขืงืขืก.

ืฆื• ืฉืึทืคึฟืŸ ืึท ืกื™ื ื˜ืขื˜ื™ืฉ ืกื™ื˜ื•ืึทืฆื™ืข ืคื•ืŸ โ€‹โ€‹โ€‹โ€‹ืงืึธื“ ื“ื•ืคึผืœื™ืงื™ื™ืฉืึทืŸ, ืคืฉื•ื˜ ื“ื•ืคึผืœื™ืงืึทื˜ ื“ื™ ืงืึธืžืคึผืึธื ืขื ื˜ ื˜ืขืงืข ืžื™ื˜ ืึท ืึทื ื“ืขืจืฉ ื ืึธืžืขืŸ ืื•ืŸ ืื•ื™ืš ืœื™ื™ื’ืŸ ืขืก ืฆื• ื“ื™ ืงืึธื“ ื”ื•ื™ืคึผื˜.ืฆ ืึท ื‘ืึธืง ืคึฟื•ื ืงืฆื™ืข ืื•ืŸ ื“ื•ืคึผืœื™ืงืึทื˜ ืขืก ืžื™ื˜ ืึท ืึทื ื“ืขืจืฉ ื ืึธืžืขืŸ. ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืคึฟืึทืจ ื“ื•ืคึผืœื™ืงืึทื˜ื™ืึธืŸ ื•ื•ื™ ืื™ืŸ .vue, ืื•ืŸ ืื™ืŸ .ืฆ - ื˜ืขืงืขืก.

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

ืฆื• ืงืึธื ื˜ืจืึธืœื™ืจืŸ ืžื™ืจ ื•ื•ืขืœืŸ ื ื•ืฆืŸ ืงืคึผื“โ€” ื ื•ืฆืŸ โ€” jscpd:

npx jscpd src

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืคึฟืึทืจ ืฉื•ืจื•ืช ืคื•ืŸ ืงืึธื“:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ื˜ืึธืžืขืจ ื“ืึธืก ื•ื•ืขื˜ ื–ื™ื™ืŸ ืจื™ื–ืึทืœื•ื•ื“ ืื™ืŸ ืฆื•ืงื•ื ืคึฟื˜ ืคึผืœื•ื’ื™ืŸ ื•ื•ืขืจืกื™ืขืก SonarJS(TS). ืื™ืš ื•ื•ืึธืœื˜ ื•ื•ื™ ืฆื• ื˜ืึธืŸ ืึทื– ื–ื™ื™ ื–ืขื ืขืŸ ื‘ื™ืกืœืขื›ื•ื•ื™ื™ึทื– ืกื˜ืึทืจื˜ื™ื ื’ ืฆื• ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ื“ื™ ืฆื•ื•ื™ื™ ืคึผืœื•ื’ื™ื ืก ืื™ืŸ ืื™ื™ืŸ SonarJS, ื•ื•ืืก ืื™ืš ืžื™ื™ืŸ ืื– ืื™ื– ืจื™ื›ื˜ื™ื’.

ืื™ืฆื˜ ืื™ืš ื’ืขื•ื•ืืœื˜ ืฆื• ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ืึธืคึผืฆื™ืข ืคื•ืŸ โ€‹โ€‹ื™ืžืคึผืจื•ื•ื•ื™ื ื’ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข.

ื‘ื™ื– ืื™ืฆื˜ ืžื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ืคึผืจืึธื‘ืข ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ืŸ ืคึผืจืึธืฆืขื ื˜ ื˜ืขืจืžื™ื ืขืŸ ืคึฟืึทืจ ื“ื™ ื’ืื ืฆืข ืคึผืจื•ื™ืขืงื˜, ืื•ืŸ ืคึฟืึทืจ ื˜ืขืงืขืก ืื™ืŸ ื‘ืึทื–ื•ื ื“ืขืจ. ืื‘ืขืจ ืขืก ืื™ื– ืžืขื’ืœืขืš ืฆื• ื™ืงืกืคึผืึทื ื“ ื“ืขื ื’ืจืื“ืŸ ืžื™ื˜ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ื•ื•ืขื’ืŸ ื“ื™ ืงื•ื•ืึทื ื˜ื™ื˜ื™ ืึทืคึผืึทืจืึทื˜- ื˜ืขืกืฅ ืคึฟืึทืจ ื“ื™ ืคึผืจื•ื™ืขืงื˜, ื•ื•ื™ ื’ืขื–ื•ื ื˜ ื•ื•ื™ ืื™ืŸ ื“ืขื ืงืึธื ื˜ืขืงืกื˜ ืคื•ืŸ ื˜ืขืงืขืก.

ืขืก ืื™ื– ืึท ื‘ื™ื‘ืœื™ืึธื˜ืขืง ื•ื•ืึธืก ืงืขื ืขืŸ ืขืก ืื™ื–-ื’ืขืจ ื“ื™ ื‘ืึทืจื™ื›ื˜ ืื™ืŸ ืคึฟืึธืจืžืึทื˜ ืคึฟืึทืจ ืกืึธื ืึทืจ'ื:
ื“ื–ืฉืึทื ืขืจื™ืง ืคึผืจื•ื‘ื™ืจืŸ ื“ืึทื˜ืŸ - 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

ื–ืืœ ืก ื–ืขืŸ ื•ื•ืึธืก ื”ืื˜ ื’ืขื‘ื™ื˜ืŸ ืื™ืŸ ื“ื™ ืฆื•ื‘ื™ื ื“ ืกืึธื ืึทืจ'ื:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืื•ืŸ ื’ืึธืจื ื™ืฉื˜ ื”ืื˜ ื’ืขื‘ื™ื˜ืŸ. ื“ืขืจ ืคืึทืงื˜ ืื™ื– ืึทื– Sonar ื˜ื•ื˜ ื ื™ืฉื˜ ื‘ืึทื˜ืจืึทื›ื˜ืŸ ื“ื™ ื˜ืขืงืขืก ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ื™ ื“ื–ืฉืขืกื˜ ื‘ืึทืจื™ื›ื˜ ื•ื•ื™ ื˜ืขืงืขืก ืึทืคึผืึทืจืึทื˜-ื˜ืขืกื˜ืŸ. ืื™ืŸ ืกื“ืจ ืฆื• ืคืึทืจืจื™ื›ื˜ืŸ ื“ืขื ืกื™ื˜ื•ืึทืฆื™ืข, ืžื™ืจ ื ื•ืฆืŸ ื“ื™ ืงืึทื ืคื™ื’ื™ืขืจื™ื™ืฉืึทืŸ ืคึผืึทืจืึทืžืขื˜ืขืจ ืกืึธื ืึทืจ sonar.tests, ืื™ืŸ ื•ื•ืึธืก ืžื™ืจ ื•ื•ืขืœืŸ ื‘ืคื™ืจื•ืฉ ืึธื ื•ื•ื™ื™ึทื–ืŸ ื“ื™ ืคืึธืœื“ืขืจืก ืžื™ื˜ ื˜ืขืกืฅ (ืžื™ืจ ื”ืึธื‘ืŸ ื‘ืœื•ื™ื– ืื™ื™ืŸ ืคึฟืึทืจ ืื™ืฆื˜):

sonar-project.properties:

โ€ฆ
sonar.tests=src/components/__tests__
โ€ฆ

ืœืึธืžื™ืจ ืจื™ืกื˜ืึทืจื˜ ื“ื™ ืกืงืึทื ื ืขืจ:

yarn run sonar

ืœืึธืžื™ืจ ื–ืขืŸ ื•ื•ืึธืก ืื™ื– ื’ืขื‘ื™ื˜ืŸ ืื™ืŸ ื“ื™ ืฆื•ื‘ื™ื ื“:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืื™ืฆื˜ ืžื™ืจ ื”ืึธื‘ืŸ ื’ืขื–ืขืŸ ื“ื™ ื ื•ืžืขืจ ืคื•ืŸ ืื•ื ื“ื–ืขืจ ืึทืคึผืึทืจืึทื˜-ื˜ืขืกื˜ืก ืื•ืŸ, ื•ื•ื™ื™ืœ ื ื™ื˜ ืึทื ื“ืขืจืฉ ื“ื•ืจืš ืงืœื™ืงื™ื ื’ ื™ืŸ, ืžื™ืจ ืงืขื ืขืŸ ื–ืขืŸ ื“ื™ ืคืึทืจืฉืคึผืจื™ื™ื˜ื•ื ื’ ืคื•ืŸ ื“ืขื ื ื•ืžืขืจ ืฆื•ื•ื™ืฉืŸ ื“ื™ ืคึผืจื•ื™ืขืงื˜ ื˜ืขืงืขืก:

ื™ื ื˜ืึทื’ืจื™ื™ื˜ื™ื ื’ ื“ื™ VueJS + TS ืคึผืจื•ื™ืขืงื˜ ืžื™ื˜ SonarQube

ืกืึธืฃ

ืึทื–ื•ื™, ืžื™ืจ ื’ืขืงื•ืงื˜ ืื•ื™ืฃ ืึท ื’ืขืฆื™ื™ึทื’ ืคึฟืึทืจ ืงืขืกื™ื™ื“ืขืจื“ื™ืง ืึทื ืึทืœื™ืกื™ืก SonarQube. ืžื™ืจ ื”ืฆืœื—ื” ื™ื ืึทื’ืจื™ื™ื˜ื™ื“ ืื™ืŸ ืขืก ืึท ืคึผืจื•ื™ืขืงื˜ ื’ืขืฉืจื™ื‘ืŸ ืื™ืŸ VueJs+TS. ืคืึทืจืคืขืกื˜ื™ืงื˜ ืขื˜ืœืขื›ืข ืงืึทืžืคึผืึทื˜ืึทื‘ื™ืœืึทื˜ื™ ื™ืฉื•ื–. ืžื™ืจ ื’ืขื•ื•ืืงืกืŸ ื“ื™ ืื™ื ืคึฟืึธืจืžืึทืฆื™ืข ืื™ื ื”ืึทืœื˜ ืคื•ืŸ ื“ื™ ืคึผืจืึธื‘ืข ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ื’ืจืื“ืŸ. ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืžื™ืจ ื™ื’ื–ืึทืžืึทื ื“ ื‘ืœื•ื™ื– ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ืงืึธื“ ืงื•ื•ืึทืœื™ื˜ืขื˜ ืงืจื™ื™ื˜ื™ืจื™ืึท (ื˜ืึธืžืขืจ ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื”ื•ื™ืคึผื˜ ืึธื ืขืก), ืึธื‘ืขืจ SonarQube ืฉื˜ื™ืฆื˜ ืื ื“ืขืจืข ืงื•ื•ืึทืœื™ื˜ืขื˜ ืงืจื™ื™ื˜ื™ืจื™ืึท, ืึทืจื™ื™ึทื ื’ืขืจืขื›ื ื˜ ื–ื™ื›ืขืจืงื™ื™ึทื˜ ื˜ืขืกื˜ื™ื ื’. ืึธื‘ืขืจ ื ื™ื˜ ืึทืœืข ืคื•ืŸ โ€‹โ€‹ื“ื™ ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ื–ืขื ืขืŸ ื’ืึธืจ ื‘ื ื™ืžืฆื ืื™ืŸ ื™ื™ื“ืข-ื•ื•ืขืจืกื™ืขืก. ืื™ื™ื ืขืจ ืคื•ืŸ ื“ื™ ื˜ืฉื™ืงืึทื•ื•ืข ืื•ืŸ ื ื•ืฆื™ืง ืคึฟืขื™ึดืงื™ื™ื˜ืŸ ืื™ื– ื™ื ืึทื’ืจื™ื™ืฉืึทืŸ SonarQube ืžื™ื˜ ืคืึทืจืฉื™ื“ืŸ ืงืึธื“ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ืคืึทืจื•ื•ืึทืœื˜ื•ื ื’ ืกื™ืกื˜ืขืžืขืŸ, ืึทื–ืึท ื•ื•ื™ GitLab ืื•ืŸ BitBucket. ืฆื• ืคืึทืจืžื™ื™ึทื“ืŸ ืฆื•ื ื•ื™ืคื’ื™ืกืŸ ืฆื™ืขืŸ (ืžืขืจื“ื–ืฉ) ื‘ืขื˜ืŸ'ืึท ืฆื• ื“ื™ ื”ื•ื™ืคึผื˜ ืฆื•ื•ื™ื™ึทื’ ืคื•ืŸ ื“ื™ ืจื™ืคึผืึทื–ืึทื˜ืึธืจื™ ื•ื•ืขืŸ ื“ื™ ืงืึทื•ื•ืขืจื™ื“ื–ืฉ ืื™ื– ื“ื™ื’ืจื™ื™ื“ื™ื“. ืื‘ืขืจ ื“ืึธืก ืื™ื– ืึท ื’ืขืฉื™ื›ื˜ืข ืคึฟืึทืจ ืึท ื’ืึธืจ ืึทื ื“ืขืจืฉ ืึทืจื˜ื™ืงืœ.

ืคึผืก: ืึทืœืฅ ื“ื™ืกืงืจื™ื™ื‘ื“ ืื™ืŸ ื“ืขื ืึทืจื˜ื™ืงืœ ืื™ืŸ ื“ื™ ืคืึธืจืขื ืคื•ืŸ ืงืึธื“ ืื™ื– ื‘ื ื™ืžืฆื ืื™ืŸ ืžื™ื™ืŸ ื’ืึธืคึผืœ.

ื‘ืœื•ื™ื– ืจืขื’ื™ืกื˜ืจื™ืจื˜ ื ื™ืฆืขืจืก ืงืขื ืขืŸ ืึธื ื˜ื™ื™ืœ ื ืขืžืขืŸ ืื™ืŸ ื“ื™ ื™ื‘ืขืจื‘ืœื™ืง. ืกื™ื™ืŸ ืืจื™ื™ืŸื‘ื™ื˜ืข.

ืฆื™ ืื™ืจ ื ื•ืฆืŸ ื“ื™ SonarQube ืคึผืœืึทื˜ืคืึธืจืžืข:

  • ืงืกื ื•ืžืงืก%ื™ืึธ5

  • ืงืกื ื•ืžืงืก%No3

  • ืงืกื ื•ืžืงืก%ืื™ืš ื’ืขื”ืขืจื˜ ื•ื•ืขื’ืŸ ื“ืขื ืคึผืœืึทื˜ืคืึธืจืžืข ืื•ืŸ ืื™ืš ื•ื•ื™ืœืŸ ืฆื• ื ื•ืฆืŸ 3

  • ืงืกื ื•ืžืงืก%ืื™ืš ื”ืึธื‘ ื’ืขื”ืขืจื˜ ื•ื•ืขื’ืŸ ื“ืขื ืคึผืœืึทื˜ืคืึธืจืžืข ืื•ืŸ ื˜ืึธืŸ ื ื™ืฉื˜ ื•ื•ืขืœืŸ ืฆื• ื ื•ืฆืŸ 2

  • ืงืกื ื•ืžืงืก%ืื™ืš ื ื•ืฆืŸ ืึท ืึทื ื“ืขืจืฉ ืคึผืœืึทื˜ืคืึธืจืžืข 0

  • ืงืกื ื•ืžืงืก%ืขืจืฉื˜ืขืจ ืžืึธืœ ืื™ืš ื•ื•ืข ื’ืขื”ืขืจื˜ ื•ื•ืขื’ืŸ ืื™ืจ 6

19 ื‘ืื ื•ืฆืขืจ ื”ืื‘ืŸ ื’ืขืฉื˜ื™ืžื˜. 3 ื‘ืื ื•ืฆืขืจ ื”ืื‘ืŸ ื–ื™ืš ืืคื’ืขื”ืืœื˜ืŸ.

ืžืงื•ืจ: www.habr.com

ืœื™ื™ื’ืŸ ืึท ื‘ืึทืžืขืจืงื•ื ื’