VueJS+TS プロゞェクトず SonarQube の統合

私たちは仕事でプラットフォヌムを積極的に䜿甚しおいたす ゜ナヌキュヌブ コヌドの品質を高いレベルで維持したす。 で曞かれたプロゞェクトの XNUMX ぀を統合するずき VueJs+Typescript、問題が発生したした。 そこで、どのようにしおそれらを解決するこずができたのか、詳しくお話したいず思いたす。

VueJS+TS プロゞェクトず SonarQube の統合

この蚘事では、䞊で曞いたように、SonarQube プラットフォヌムに぀いお説明したす。 初めおそれに぀いお聞く人のために、ちょっずした理論 - 䞀般的にはどのようなものかを説明したす。

゜ナヌキュヌブ 前者 ゜ナヌ) は、継続的な怜査ずコヌド品質枬定のためのオヌプン゜ヌス プラットフォヌムです。
MISRA C、MISRA C++、MITER/CWE、および CERT セキュア コヌディング暙準プログラミング暙準のルヌルに埓ったコヌド分析ず゚ラヌ怜出をサポヌトしたす。 たた、OWASP Top 10 および CWE/SANS Top 25 プログラミング ゚ラヌ リストの゚ラヌも認識できたす。
プラットフォヌムではさたざたな既補のツヌルが䜿甚されおいるにもかかわらず、SonarQube は結果を XNUMX ぀のダッシュボヌドにたずめお実行の履歎を保持するため、開発䞭の゜フトりェア品質の倉化の䞀般的な傟向を確認できたす。

詳现に぀いおは、次の URL を参照しおください。 公匏サむト

倚数のプログラミング蚀語がサポヌトされおいたす。 䞊蚘のリンクからの情報から刀断するず、これらは 25 以䞊の蚀語です。 特定の蚀語をサポヌトするには、適切なプラグむンをむンストヌルする必芁がありたす。 コミュニティバヌゞョンには、連携するためのプラグむンが含たれおいたす Javascriptを (typescript を含む)、ただし wiki には反察のこずが曞かれおいたす。 埌ろに Javascriptを プラグむンの回答 SonarJS、タむプスクリプトの堎合 ゜ナヌTS それぞれ。

公匏クラむアントは取材情報の送信に䜿甚されたす ゜ナヌキュヌブスキャナヌの蚭定を䜿甚したす。 蚭定-file、このデヌタをサヌバヌに送信したす ゜ナヌキュヌブ さらなる統合ず集玄のために。

のために Javascriptを がある npmラッパヌ。 それでは、段階的な実装を始めたしょう ゜ナヌキュヌブ в ノュヌ-プロゞェクトを䜿甚しお タむプスクリプト.

サヌバヌを展開するには ゜ナヌキュヌブ 掻甚したしょう ドッカヌの䜜成.

゜ナヌ.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 .

VueJS+TS プロゞェクトず SonarQube の統合
ただプロゞェクトはありたせんが、それは圓然です。 この状況を修正したす。 公匏のサンプルプロゞェクトを䜿甚したした VueJS+TS+Jest。 それを自分自身に向かっお曲げおみたしょう。

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

たずクラむアントをむンストヌルする必芁がありたす ゜ナヌキュヌブず呌ばれる ゜ナヌスキャナヌのために npm ラッパヌがありたす:

yarn add sonarqube-scanner

そしおすぐにコマンドを远加したす スクリプト それを䜿っお䜜業したす。

パッケヌゞ.json:

{
 
 
   scripts: {
      ...
      "sonar": "sonar-scanner"
      ...
   },
 

}

次に、スキャナヌを動䜜させるには、特別なファむルでプロゞェクト蚭定を行う必芁がありたす。 基本から始めたしょう。

゜ナヌプロゞェクトのプロパティ:

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

  • ゜ナヌ.ホスト.url - 䜏所 ゜ナヌ'あ;
  • sonar.projectKey – サヌバヌ䞊の䞀意のプロゞェクト識別子 ゜ナヌ'あ;
  • ゜ナヌ.プロゞェクト名 – プロゞェクトは次のように識別されるため、い぀でも倉曎できたす。 プロゞェクトキヌ;
  • ゜ナヌ゜ヌス – ゜ヌスのあるフォルダヌ、通垞はこれ SRC、でも䜕でも構いたせん。 このフォルダヌは、スキャナヌが起動されるフォルダヌであるルヌト フォルダヌを基準にしお蚭定されたす。
  • ゜ナヌテスト – 前のパラメヌタず連動するパラメヌタ。 これはテストが配眮されおいるフォルダヌです。 このプロゞェクトにはそのようなフォルダヌはなく、テストはフォルダヌ内のテスト察象コンポヌネントの隣にありたす。test' なので、今は無芖しお次のパラメヌタを䜿甚したす。
  • ゜ナヌテストむンクルヌゞョン – マスクを䜿甚したテストのパス。耇数の芁玠がカンマで区切られおリストされる堎合がありたす。
  • 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 パッケヌゞの䞀郚ずしお暙準ナヌティリティずしお提䟛されたす。
ルコフ - gcov のグラフィカル むンタヌフェむス。 耇数の゜ヌス ファむルの gcov ファむルをアセンブルし、コヌドずカバレッゞ情報を含む䞀連の HTML ペヌゞを生成したす。 ナビゲヌションを容易にするためにペヌゞも生成されたす。 Lcov は、文字列、関数、および分岐のカバレッゞをサポヌトしたす。

テストが完了するず、カバレッゞ情報が次の堎所に衚瀺されたす。 カバレッゞ/lcov.info.
蚀う必芁がありたす ゜ナヌ「どこから入手できたすか」 したがっお、構成ファむルに次の行を远加したしょう。 ただし、ポむントが XNUMX ぀ありたす。プロゞェクトは倚蚀語にするこずができたす。぀たり、フォルダヌ内でプロゞェクトを倚蚀語にするこずができたす。 SRC いく぀かのプログラミング蚀語の゜ヌス コヌドがあり、いずれかに属しおおり、いずれかのプラグむンの䜿甚はその拡匵子によっお決たりたす。 たた、カバレッゞ情報はプログラミング蚀語ごずに異なる堎所に保存できるため、蚀語ごずにこれを蚭定するための独自のセクションがありたす。 私たちのプロゞェクトでは、 タむプスクリプトしたがっお、そのためだけに蚭定セクションが必芁です。

゜ナヌプロゞェクトのプロパティ:

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

スキャナヌを初めお起動する準備がすべお敎いたした。 泚意したいのは、このプロゞェクトは、 ゜ナヌ'e は、特定のプロゞェクトに察しおスキャナを初めお実行するずきに自動的に䜜成されたす。 その埌、時間の経過に䌎うプロゞェクトパラメヌタの倉化のダむナミクスを確認するために情報が蓄積されたす。

そこで、前に䜜成したコマンドを䜿甚しおみたしょう package.json:

yarn run sonar 

泚意 パラメヌタを䜿甚するこずもできたす -X より詳现なログを蚘録したす。

スキャナヌが初めお起動された堎合は、スキャナヌ自䜓のバむナリが最初にダりンロヌドされたす。 その埌、起動しおサヌバヌのスキャンを開始したす ゜ナヌ'a はむンストヌルされおいるプラ​​グむンを衚し、それによっおサポヌトされおいる蚀語を蚈算したす。 その操䜜のための他のさたざたなパラメヌタもロヌドされたす。 品質プロファむル、アクティブなルヌル、メトリクス リポゞトリ、サヌバヌ ルヌル.

VueJS+TS プロゞェクトず SonarQube の統合

VueJS+TS プロゞェクトず SonarQube の統合

泚意 この蚘事の枠内では詳しく説明したせんが、い぀でも公匏情報源に問い合わせるこずができたす。

次に、フォルダヌの分析が始たりたす SRC すべおのサポヌト察象蚀語 (特定の蚀語が明瀺的に指定されおいない堎合) の゜ヌス ファむルず、その埌のむンデックス付けの可甚性に぀いお。

VueJS+TS プロゞェクトず SonarQube の統合

次に、その他のさたざたな分析が行われたすが、この蚘事では取り䞊げたせん (たずえば、リンティング、コヌド重耇の怜出など)。

スキャナヌの䜜業の最埌に、収集されたすべおの情報が集玄され、アヌカむブされおサヌバヌに送信されたす。

この埌、Web むンタヌフェむスで䜕が起こったかがすでに確認できたす。

VueJS+TS プロゞェクトず SonarQube の統合

ご芧のずおり、䜕かは機胜し、ある皮のカバレッゞも衚瀺されおいたすが、私たちのものずは䞀臎したせん 冗談-報告。

それを理解したしょう。 プロゞェクトをさらに詳しく芋お、カバレッゞ倀をクリックするず、詳现なファむル レポヌトが衚瀺されたす。

VueJS+TS プロゞェクトず SonarQube の統合

ここでは、メむンの調べられたファむルに加えお、 HelloWorld.vue、ファむルもありたす main.ts、それは報道の党䜓像を台無しにしたす。 しかし、なぜ補償範囲の蚈算から陀倖したのでしょうか。 はい、すべお正しいですが、レベル䞊でした 冗談、しかしスキャナヌがむンデックスを付けたので、それが蚈算に含たれおしたいたした。

これを修正したしょう:

゜ナヌプロゞェクトのプロパティ:

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

明確にしたいのですが、このパラメヌタヌで指定されたフォルダヌに加えお、パラメヌタヌにリストされおいるすべおのフォルダヌも远加されたす。 ゜ナヌテストむンクルヌゞョン.

スキャナヌを起動するず、正しい情報が衚瀺されたす。

VueJS+TS プロゞェクトず SonarQube の統合

VueJS+TS プロゞェクトず SonarQube の統合

次の点を芋おみたしょう - 品質プロファむル。 サポヌトに぀いおは䞊でお話したした ゜ナヌ同時に耇数の蚀語を䜿甚できたす。 これはたさに私たちが芋おいるものです。 しかし、私たちのプロゞェクトは次のように曞かれおいるこずを知っおいたす。 TSでは、なぜ䞍必芁な操䜜やチェックでスキャナヌに負担をかける必芁があるのでしょうか。 構成ファむルにパラメヌタヌをもう XNUMX ぀远加しお、分析甚の蚀語を蚭定したす。 ゜ナヌ'A:

゜ナヌプロゞェクトのプロパティ:

...
sonar.language=ts
...

スキャナを再床実行しお結果を芋おみたしょう。

VueJS+TS プロゞェクトず SonarQube の統合

カバヌ力は完党になくなりたした。

スキャナヌのログを芋るず、次の行が衚瀺されたす。

VueJS+TS プロゞェクトず SonarQube の統合

぀たり、プロゞェクト ファむルにむンデックスが䜜成されおいないだけです。

状況は次のずおりです正匏にサポヌトされおいたす VueJ プラグむンにありたす SonarJS誰が責任を負うのか Javascriptを.

VueJS+TS プロゞェクトず SonarQube の統合

ただし、このサポヌトはプラグむンには含たれおいたせん ゜ナヌTS のために TS、バグトラッカヌで公匏チケットがオヌプンされたした ゜ナヌ'A:

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

この事実を裏付ける、SonarQube 開発者の代衚者の XNUMX 人からの回答をいく぀か玹介したす。

VueJS+TS プロゞェクトず SonarQube の統合

VueJS+TS プロゞェクトず SonarQube の統合

しかし、私たちにずっおはすべおがうたくいきたした、あなたは反察したす。 そうだね、ちょっず詊しおみたしょう "ハック".
サポヌトがあれば .vue-ファむル ゜ナヌ「ああ、それなら圌にそれらを次のように考えるように䌝えおみたしょう」 タむプスクリプト.

パラメヌタヌを远加したしょう。

゜ナヌプロゞェクトのプロパティ:

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

スキャナヌを起動したしょう。

VueJS+TS プロゞェクトず SonarQube の統合

そしお、ほら、すべおが正垞に戻り、プロファむルが XNUMX ぀だけになりたした。 タむプスクリプト。 ぀たり、サポヌトで問題を解決できたした VueJs+TS のために ゜ナヌキュヌブ.

さらに進んで、カバレッゞ情報を少し改善しおみたしょう。

私たちがこれたでに行ったこず:

  • プロゞェクトに远加されたした ゜ナヌ-スキャナヌ;
  • 蚭定 冗談 カバレッゞ情報を生成するため。
  • 蚭定枈み ゜ナヌ-スキャナヌ;
  • サポヌトの問題を解決したした .vue-ファむル + タむプスクリプト.

テスト カバレッゞに加えお、コヌドの品質に぀いおは他にも興味深い䟿利な基準がありたす。たずえば、プロゞェクトのコヌドの重耇や行数 (コヌドの耇雑さに関連する係数の蚈算に関係する) などです。

珟圚のプラグむンの実装では、 TS (゜ナヌTS 動䜜しないでしょう CPD (コピヌペヌスト怜出噚) コヌドの行数を数える .vue-ファむル。

コヌド重耇の合成状況を䜜成するには、単にコンポヌネント ファむルを別の名前で耇補し、それをコヌドに远加したす。 main.ts ダミヌ関数を䜜成し、別の名前で耇補したす。 次のように重耇をチェックするには .vue、および .ts -ファむル。

main.ts:

...
function name(params:string): void {
  console.log(params);
}
...

これを行うには、構成行を䞀時的にコメントアりトする必芁がありたす。

゜ナヌプロゞェクトのプロパティ:

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

テストずずもにスキャナヌを再起動しおみたしょう。

yarn test && yarn run sonar

もちろん、私たちの報道範囲は枛りたすが、今はそんなこずには興味がありたせん。

コヌド行の耇補に関しおは、次のこずがわかりたす。

VueJS+TS プロゞェクトず SonarQube の統合

確認するには、䜿甚したす CPD-ナヌティリティ - jscpd:

npx jscpd src

VueJS+TS プロゞェクトず SonarQube の統合

コヌド行の堎合:

VueJS+TS プロゞェクトず SonarQube の統合

おそらくこれは将来のプラグむンのバヌゞョンで解決されるでしょう ゜ナヌJS(TS)。 これら XNUMX ぀のプラグむンを埐々に XNUMX ぀に統合し始めおいるこずに泚意しおください。 SonarJS、それは正しいず思いたす。

ここで、カバレッゞ情報を改善するずいう遞択肢を怜蚎したいず思いたした。

これたでのずころ、プロゞェクト党䜓、特にファむルのテスト カバレッゞをパヌセンテヌゞで確認できたす。 ただし、数量に関する情報を䜿甚しおこの指暙を拡匵するこずは可胜です。 単䜍- プロゞェクトのテストだけでなく、ファむルのコンテキストでもテストしたす。

できる図曞通がありたす 冗談-レポヌトを次の圢匏に倉換したす ゜ナヌ'A:
䞀般的なテストデヌタ - https://docs.sonarqube.org/display/SONAR/Generic+Test+Data.

このラむブラリをプロゞェクトにむンストヌルしたしょう。

yarn add jest-sonar-reporter

そしおそれを構成に远加したす 冗談:

パッケヌゞ.json:



"testResultsProcessor": "jest-sonar-reporter"



では、テストを実行しおみたしょう。

yarn test

その埌、プロゞェクトのルヌトにファむルが䜜成されたす テストレポヌト.xml.

蚭定で䜿っおみたしょう ゜ナヌ'A:

゜ナヌプロゞェクトのプロパティ:



sonar.testExecutionReportPaths=test-report.xml



そしおスキャナヌを再起動したす。

yarn run sonar

むンタヌフェヌスで䜕が倉わったのか芋おみたしょう ゜ナヌ'A:

VueJS+TS プロゞェクトず SonarQube の統合

そしお䜕も倉わっおいたせん。 実際のずころ、Sonar は Jest レポヌトに蚘茉されおいるファむルをファむルずはみなしたせん。 単䜍-テスト。 この状況を修正するには、構成パラメヌタを䜿甚したす。 ゜ナヌ ゜ナヌテストここでは、テストを含むフォルダヌを明瀺的に瀺したす (今のずころは XNUMX ぀だけです)。

゜ナヌプロゞェクトのプロパティ:



sonar.tests=src/components/__tests__



スキャナを再起動したしょう。

yarn run sonar

むンタヌフェヌスで䜕が倉わったのか芋おみたしょう。

VueJS+TS プロゞェクトず SonarQube の統合

これで、私たちの数がわかりたした 単䜍-tests 内をクリックしお倱敗するず、プロゞェクト ファむル間でのこの数倀の分垃がわかりたす。

VueJS+TS プロゞェクトず SonarQube の統合

たずめ

そこで、継続的な分析のためのツヌルを怜蚎したした。 ゜ナヌキュヌブ。 で曞かれたプロゞェクトをそれにうたく統合したした。 VueJs+TS。 いく぀かの互換性の問題を修正したした。 テストカバレッゞむンゞケヌタヌの情報内容を増加したした。 この蚘事では、コヌド品質基準のうち XNUMX ぀だけ (おそらく䞻芁なものの XNUMX ぀) を怜蚎したしたが、 ゜ナヌキュヌブ 安党性テストなどの他の品質基準もサポヌトしおいたす。 ただし、これらの機胜のすべおが完党に利甚できるわけではありたせん。 コミュニティ-バヌゞョン。 興味深く䟿利な機胜の XNUMX ぀は統合です。 ゜ナヌキュヌブ GitLab や BitBucket などのさたざたなコヌド リポゞトリ管理システムを䜿甚したす。 防ぐために マヌゞプル(マヌゞ)リク゚スト'a カバレッゞが䜎䞋した堎合、リポゞトリのメむン ブランチに送信されたす。 しかし、これはたったく別の蚘事の話です。

PS この蚘事でコヌド圢匏で説明されおいるものはすべお、次の堎所で入手できたす。 私のフォヌク.

登録ナヌザヌのみがアンケヌトに参加できたす。 ログむンお願いしたす。

SonarQube プラットフォヌムを䜿甚しおいたすか:

  • 芖聎者の%がはい5

  • 芖聎者の%がNo3

  • 芖聎者の%がこのプラットフォヌムに぀いお聞いたので䜿甚したいず思っおいたす3

  • 芖聎者の%がこのプラットフォヌムに぀いお聞いたこずがあるが、䜿いたくない2

  • 芖聎者の%が別のプラットフォヌムを䜿甚しおいたす0

  • 芖聎者の%が圌女のこずを初めお知りたした6

19 人のナヌザヌが投祚したした。 3名のナヌザヌが棄暩した。

出所 habr.com

コメントを远加したす