рдЕрдкрдиреЗ рдХрд╛рдо рдореЗрдВ, рд╣рдо рдЙрдЪреНрдЪ рдЧреБрдгрд╡рддреНрддрд╛ рд╡рд╛рд▓реЗ рдХреЛрдб рдХреЛ рдмрдирд╛рдП рд░рдЦрдиреЗ рдХреЗ рд▓рд┐рдП рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдордВрдЪ рдХрд╛ рд╕рдХреНрд░рд┐рдп рд░реВрдк рд╕реЗ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ ред VueJs + рдЯрд╛рдЗрдкрд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рдкрд░рд┐рдпреЛрдЬрдирд╛рдУрдВ рдореЗрдВ рд╕реЗ рдПрдХ рдХреЛ рдПрдХреАрдХреГрдд рдХрд░рдиреЗ рдореЗрдВ рд╕рдорд╕реНрдпрд╛рдПрдВ рдереАрдВ ред рдЗрд╕рд▓рд┐рдП, рдореИрдВ рдФрд░ рдЕрдзрд┐рдХ рд╡рд┐рд╕реНрддрд╛рд░ рд╕реЗ рдмрддрд╛рдирд╛ рдЪрд╛рд╣реВрдВрдЧрд╛ рдХрд┐ рд╣рдо рдЙрдиреНрд╣реЗрдВ рдХреИрд╕реЗ рд╣рд▓ рдХрд░рдиреЗ рдореЗрдВ рдХрд╛рдордпрд╛рдм рд░рд╣реЗред
![](https://habrastorage.org/webt/ou/iv/3r/ouiv3rbqdmjt3i3p751f3dxrydq.png)
рдпрд╣ рд▓реЗрдЦ рдЪрд░реНрдЪрд╛ рдХрд░реЗрдЧрд╛, рдЬреИрд╕рд╛ рдХрд┐ рдореИрдВрдиреЗ рдКрдкрд░ рд▓рд┐рдЦрд╛ рд╣реИ, рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдордВрдЪред рдереЛрдбрд╝рд╛ рд╕рд╛ рд╕рд┐рджреНрдзрд╛рдВрдд - рдпрд╣ рдЙрди рд▓реЛрдЧреЛрдВ рдХреЗ рд▓рд┐рдП рдХреНрдпрд╛ рд╣реИ рдЬреЛ рдкрд╣рд▓реА рдмрд╛рд░ рдЗрд╕рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╕реБрдирддреЗ рд╣реИрдВ:
рд╕реЛрдирд╛рд░рдХреНрдпреВрдм (рдкреВрд░реНрд╡ рдореЗрдВ рд╕реЛрдирд╛рд░ ) рдирд┐рд░рдВрддрд░ рд╡рд┐рд╢реНрд▓реЗрд╖рдг (рдЕрдВрдЧреНрд░реЗрдЬреА рдирд┐рд░рдВрддрд░ рдирд┐рд░реАрдХреНрд╖рдг) рдФрд░ рдХреЛрдб рдЧреБрдгрд╡рддреНрддрд╛ рдХреЗ рдорд╛рдкрди рдХреЗ рд▓рд┐рдП рдПрдХ рдЦреБрд▓рд╛ рд╕реНрд░реЛрдд рдордВрдЪ рд╣реИред
рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рдорд╛рдирдХреЛрдВ MISRA C, MISRA C ++, MITER / CWE рдФрд░ CERT рд╕реБрд░рдХреНрд╖рд┐рдд рдХреЛрдбрд┐рдВрдЧ рдорд╛рдирдХреЛрдВ рдХреЗ рдирд┐рдпрдореЛрдВ рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдЦреЛрдЬ рдХрд░рдиреЗ рдореЗрдВ рдХреЛрдб рд╡рд┐рд╢реНрд▓реЗрд╖рдг рдФрд░ рддреНрд░реБрдЯрд┐ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИред рдпрд╣ OWASP рдЯреЙрдк -10 рдФрд░ CWE / SANS рдЯреЙрдк -25 рдХреА рдкреНрд░реЛрдЧреНрд░рд╛рдорд┐рдВрдЧ рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреА рддреНрд░реБрдЯрд┐рдпреЛрдВ рдХреЛ рдкрд╣рдЪрд╛рдирдиреЗ рдореЗрдВ рднреА рд╕рдХреНрд╖рдо рд╣реИред
рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рд╡рд┐рднрд┐рдиреНрди рддреИрдпрд╛рд░ рдЙрдкрдХрд░рдгреЛрдВ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реИ, рд╕реЛрдирд╛рд░рдХреНрдпреВрдм рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдПрдХ рд╕реВрдЪрдирд╛ рдкреИрдирд▓ (рдбреИрд╢рдмреЛрд░реНрдб) рддрдХ рд▓реЗ рдЬрд╛рддрд╛ рд╣реИ, рдЬреЛ рд░рдиреЛрдВ рдХрд╛ рдЗрддрд┐рд╣рд╛рд╕ рд░рдЦрддрд╛ рд╣реИ рдФрд░ рдЗрд╕ рддрд░рд╣ рдЖрдкрдХреЛ рд╡рд┐рдХрд╛рд╕ рдХреЗ рджреМрд░рд╛рди рд╕реЙрдлреНрдЯрд╡реЗрдпрд░ рдЧреБрдгрд╡рддреНрддрд╛ рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рдорд╛рдиреНрдп рд░реБрдЭрд╛рди рдХреЛ рджреЗрдЦрдиреЗ рдХреА рдЕрдиреБрдорддрд┐ рджреЗрддрд╛ рд╣реИред
рдЕрдзрд┐рдХ рдЬрд╛рдирдХрд╛рд░реА рдЖрдзрд┐рдХрд╛рд░рд┐рдХ рд╡реЗрдмрд╕рд╛рдЗрдЯ рдкрд░ рджреЗрдЦреА рдЬрд╛ рд╕рдХрддреА рд╣реИ
. тАФ 25 . . community- Javascript ( typesript), wiki . Javascript SonarJS, Typescript SonarTS .
sonarqube-scanner, , config-, SonarQube .
Javascript npm-. , SonarQube Vue-, Typescript.
SonarQube docker-compose.
sonar.yaml:
version: '1'
services:
simplesample-sonar:
image: sonarqube:lts
ports:
- 9001:9000
- 9092:9092
network_mode: bridge
:
docker-compose -f sonar.yml up
SonarQube тАУ http://localhost:9001 .
![](https://habrastorage.org/webt/o1/p2/j1/o1p2j1ch1vx5yzpepkkguvr5m1m.png)
. . - VueJS+TS+Jest. :
git clone https://github.com/vuejs/vue-test-utils-typescript-example.git
SonarQube, sonar-scanner, npm :
yarn add sonarqube-scanner
scripts .
package.json:
{
тАж
scripts: {
...
"sonar": "sonar-scanner"
...
},
тАж
}
, , . .
sonar-project.properties:
sonar.host.url=http://localhost:9001
sonar.projectKey=test-project-vuejs-ts
sonar.projectName=Test Application (VueJS+TS)
sonar.sources=src
# sonar.tests=
sonar.test.inclusions=src/**/*tests*/**
sonar.sourceEncoding=UTF-8
- sonar.host.url тАУ SonarтАЩ;
- sonar.projectKey тАУ SonarтАЩ;
- sonar.projectName тАУ , , projectKey;
- sonar.sources тАУ , src, . , ;
- sonar.tests тАУ , . , . , , 'test', ;
- sonar.test.inclusions тАУ , ;
- sonar.sourceEncoding тАУ .
, : , , .
. тАФ Jest. package.json.
:
"collectCoverage": true,
"collectCoverageFrom": [
"src/**/*",
"!src/main.ts",
"!src/App.vue",
"!src/**/*.d.*",
"!src/**/*__tests__*"
],
( ), .
:
yarn test
:
![](https://habrastorage.org/webt/cd/yr/tc/cdyrtcot4y3gqoilyqh3-bontge.png)
, , , . .
HelloWorld.vue:
...
methods: {
calc(n) {
return n + 1;
}
},
mounted() {
this.msg1 = this.msg + this.calc(1);
},
...
.
:
![](https://habrastorage.org/webt/sy/_f/tv/sy_ftvp-hmlgpdg1l-axz6_foeg.png)
, coverage LCOV (LTP GCOV extension).
Gcov тАФ . Gcov . Gcov GCC.
Lcov тАФ gcov. gcov HTML . . Lcov , , .
coverage/lcov.info.
SonarтАЩ . . : , src , , . , . Typescript, :
sonar-project.properties:
sonar.typescript.coveragePlugin=lcov
sonar.typescript.lcov.reportPaths=coverage/lcov.info
. , SonarтАЩ . , .
, , package.json:
yarn run sonar
: -X .
, . SonarтАЩ , . : quality profiles, active rules, metrics repository, server rules.
![](https://habrastorage.org/webt/z4/rv/4i/z4rv4ir9q2va0bfvdmgqfgk1dyy.png)
![](https://habrastorage.org/webt/if/bw/1v/ifbw1voz_wvpy94bxxgoxesautg.png)
: , .
src ( - ) , .
![](https://habrastorage.org/webt/ut/9p/yf/ut9pyfqprjxnlo1lth7kxtfecd4.png)
, (, : , ).
, .
-:
![](https://habrastorage.org/webt/rh/3g/wv/rh3gwvc1zusg7ja4llxj8aqa6r0.png)
, - , - , Jest-.
. , , "" :
![](https://habrastorage.org/webt/y1/o2/ks/y1o2ksf7tbjvpq28xxwivuzmp6o.png)
, HelloWorld.vue, main.ts, . , . , , Jest, , .
:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
: , , , sonar.test.inclusions.
:
![](https://habrastorage.org/webt/yo/rl/2y/yorl2ywoqleixwgvvko1uk9vzsy.png)
![](https://habrastorage.org/webt/2q/ue/c1/2quec1pejqtnqhqv6zzusbn_zbm.png)
тАУ Quality profiles. SonarтАЩ . . , TS, . SonarтАЩ:
sonar-project.properties:
...
sonar.language=ts
...
:
![](https://habrastorage.org/webt/uo/zw/hm/uozwhme74zb3w35slbqfif1canq.png)
.
, :
![](https://habrastorage.org/webt/ow/6y/3r/ow6y3rk4ol9lapzjqpw7jezdhlw.png)
.
: VueJs SonarJS, Javascript.
![](https://habrastorage.org/webt/v6/d7/v5/v6d7v5fbgmqcxlvf-dtrtn0mexi.png)
SonarTS TS, - SonarтАЩ:
- https://jira.sonarsource.com/browse/MMF-1441
- https://github.com/SonarSource/SonarJS/issues/1281
SonarQube, .
![](https://habrastorage.org/webt/xg/x8/nd/xgx8ndb5tf4twrsugdlnyivtfue.png)
![](https://habrastorage.org/webt/ok/zs/fe/okzsfe44d7mkf-vyarc5o6hrnkg.png)
, . , , тАЬтАЭ.
.vue- SonarтАЩ, Typescript.
:
sonar-project.properties:
...
sonar.typescript.file.suffixes=.ts,.tsx,.vue
...
:
![](https://habrastorage.org/webt/we/s1/tb/wes1tbidslczd_tuussrclhkuau.png)
, , , Typescript. VueJs+TS SonarQube.
.
:
- Sonar-;
- Jest ;
- Sonar-;
- .vue- + Typescript.
, , ( , ) .
TS (SonarTS) CPD (Copy Paste Detector) .vue-.
, , main.ts - . .vue, .ts -.
main.ts:
...
function name(params:string): void {
console.log(params);
}
...
:
sonar-project.properties:
...
sonar.exclusions=src/main.ts
...
:
yarn test && yarn run sonar
, .
:
![](https://habrastorage.org/webt/49/nh/vj/49nhvjrianczcgtekbdrdzqs7l8.png)
CPD- тАУ jscpd:
npx jscpd src
![](https://habrastorage.org/webt/i3/ed/rn/i3edrnicgi5l9lqlka49oqieqie.png)
:
![](https://habrastorage.org/webt/jr/9j/bc/jr9jbc1ykaviawjq6nr07krdxyi.png)
, SonarJS(TS). , SonarJS, , , .
.
, , . unit- , .
, Jest- SonarтАЩ:
generic test data тАФ https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.
:
yarn add jest-sonar-reporter
Jest:
package.json:
тАж
"testResultsProcessor": "jest-sonar-reporter"
тАж
:
yarn test
test-report.xml.
SonarтАЩ:
sonar-project.properties:
тАж
sonar.testExecutionReportPaths=test-report.xml
тАж
:
yarn run sonar
, SonarтАЩ:
![](https://habrastorage.org/webt/jf/-e/ie/jf-eieyizhxgkfbituwjt3e8ewg.png)
. , Sonar , Jest-, unit-. , Sonar sonar.tests, ( ):
sonar-project.properties:
тАж
sonar.tests=src/components/__tests__
тАж
:
yarn run sonar
, :
![](https://habrastorage.org/webt/1l/u0/wc/1lu0wc3onjmwnf8d2ed2osxldcy.png)
unit- , , :
![](https://habrastorage.org/webt/nk/ub/jo/nkubjo6ofzlpawfbcm2npzktjqu.png)
, SonarQube. , VueJs+TS. . . (, ), SonarQube , . community-. тАФ SonarQube , , GitLab BitBucket. merge pull(merge) requestтАЩ . .
PS: , .