Azure DevOps、Visual StudioでC#アプリ開発をするにあたって静的コード分析を導入する手順をまとめます。
前提
- Visual Studio 2022
- Sonarlint for Visual Studio 2022
- Sonarcloud
- Azure DevOps Repos Git
AZ-400のハンズオンラボに詳しくまとまっていることの走り書きです。
今回Sonarを利用する理由としては、Microsoftが出している静的解析は廃止予定。MS自身が別ツールを入れてくれと言っているので、とりあえず有名どころのSonarCloudを入れる。
注意
2022 年 12 月 31 日より、Microsoft Security Code Analysis (MSCA) 拡張機能は廃止される予定です。 既存の MSCA のお客様は、2022 年 12 月 31 日まで MSCA にアクセスできます。 Azure DevOps の代替のオプションについては、OWASP ソースコード分析ツールに関するページを参照してください。 GitHub への移行を計画しているお客様については、GitHub Advanced Security に関するページをご確認ください
VS側の設定
C#のアプリケーションをロードした状態から。VSに必要な拡張機能をインストール、VSを再起動。
Sonarlintをインストール。
初回はRun code anaysis on Solutionが必要。
それ以降はコードを書くとリアルタイムでWarningを出してくれるようになる。
Code列の番号を押すとエラーの内容や直し方を教えてくれる。
プロジェクトにEditorConfigを入れる。
設定はとりあえずデフォルトで。Ctrl+K, Fで自動整形できるようになる。これにより変なエディタの設定をしている人を振るい落とす。
Code Cleanup On Save。Ctrl+K, Fで自動整形が面倒な場合入れる。
個人開発なら以上でいいかもしれない。以下はチーム開発等でAzure DevOpsを使って、CIをしたい場合。
Azure DevOps側の設定
SonarにはSonarCloudとSonarQubeの2種類があります。SonarCloudはSaaS版でSonarQubeは自分でサーバを立てるためひと手間必要になる模様。今回はAzure DevOpsともデフォルトで連携できるSonarCloudを選択。
Azure DevOpsとSonarCloudの連携
基本的にはSonarが出しているオフィシャルドキュメントに従えばできた。
静的解析を呼び出すPipelineを作ってみる
Azure DevOpsとSonarCloudの連携が済み、OrganizationにSonarCloudのExtensionを入れた状態で、Azure DevOpsのPipelineを作ってみる。
トリガーをDevブランチとかにするとDevが変更されるたびに呼ばれるようになるのでいいかもしれない。
Prepare > Build > Analyze > Publish の順番に設定する。
# ASP.NET
# Build and test ASP.NET projects.
# Add steps that publish symbols, save build artifacts, deploy, and more:
# https://docs.microsoft.com/azure/devops/pipelines/apps/aspnet/build-aspnet-4
trigger:
none
pool:
vmImage: 'windows-latest'
variables:
solution: '**/*.sln'
buildPlatform: 'Any CPU'
buildConfiguration: 'Release'
steps:
- task: NuGetToolInstaller@1
- task: NuGetCommand@2
inputs:
restoreSolution: '$(solution)'
- task: SonarCloudPrepare@1
inputs:
SonarCloud: 'sonarcloud'
organization: 'devopssimaoh'
scannerMode: 'MSBuild'
projectKey: 'DevOpsSimaOH_PartsUnlimited'
projectName: 'PartsUnlimited'
- task: VSBuild@1
inputs:
solution: '$(solution)'
msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactStagingDirectory)"'
platform: '$(buildPlatform)'
configuration: '$(buildConfiguration)'
- task: SonarCloudAnalyze@1
- task: SonarCloudPublish@1
inputs:
pollingTimeoutSec: '300'
結果の見方はこちら。
Dashboardはあまり詳細な情報は見れない。残念(´・ω・`)。ちゃんと結果を見るにはSonarCloudで見るしかない。
Pull Requestを静的分析の対象にする
SonarCloudのページで左下のGeneral Settings > Pull Requestsを設定
Azure DevOpsのMasterでBranch Policyを設定(Devにするべきだった)
試しに適当にソースを修正してPull Requestを作ってみると、、、差分だけが静的分析の対象となり、PullRequestに自動的に警告コメントを入れてくれる。今回は未使用の変数を入れてみたので、コードスメルとして検知された。また、警告が解決されないとMergeできないようになっている。
SonarcloudとVisual Studio(Sonarlint)をConnectedModeで連携する
必須ではないかもしれせんが、SonarcloudとVisual Studio(Sonarlint)を連携することで、チーム開発用の機能が使えるようになる。簡単に言うと、個々人がローカルのVS(Sonarlint)で実施した設定をSonarcloud経由で連携したり、分析ルールをチームで共有できるようになる模様。