Azure DevOps、Visual Studio、Sonarlint、SonarCloudを利用する 

Azure DevOps、Visual StudioでC#アプリ開発をするにあたって静的コード分析を導入する手順をまとめます。

**前提**
- Visual Studio 2022
- Sonarlint for Visual Studio 2022
- Sonarcloud
- Azure DevOps Repos Git

AZ-400のハンズオンラボに詳しくまとまっていることの走り書きです。

https://microsoftlearning.github.io/AZ400-DesigningandImplementingMicrosoftDevOpsSolutions.ja-jp/Instructions/Labs/AZ400_M07_L14_Managing_technical_debt_with_SonarQube_and_Azure_DevOps.html

今回Sonarを利用する理由としては、Microsoftが出している静的解析は廃止予定。MS自身が別ツールを入れてくれと言っているので、とりあえず有名どころのSonarCloudを入れる。
> 注意
> 2022 年 12 月 31 日より、Microsoft Security Code Analysis (MSCA) 拡張機能は廃止される予定です。 既存の MSCA のお客様は、2022 年 12 月 31 日まで MSCA にアクセスできます。 Azure DevOps の代替のオプションについては、OWASP ソースコード分析ツールに関するページを参照してください。 GitHub への移行を計画しているお客様については、GitHub Advanced Security に関するページをご確認ください


https://learn.microsoft.com/ja-jp/azure/security/develop/security-code-analysis-overview

# VS側の設定
C#のアプリケーションをロードした状態から。VSに必要な拡張機能をインストール、VSを再起動。

### [Sonarlint](https://marketplace.visualstudio.com/items?itemName=SonarSource.sonarlint-vscode#connected-mode)をインストール。
初回はRun code anaysis on Solutionが必要。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/9fc8a1af-72e2-71e2-4888-c6020a0e0aa9.png)

それ以降はコードを書くとリアルタイムでWarningを出してくれるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/027db170-54c4-a748-a464-2ceffaef7d2c.png)

Code列の番号を押すとエラーの内容や直し方を教えてくれる。

https://rules.sonarsource.com/csharp/RSPEC-1481

### プロジェクトにEditorConfigを入れる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/94f3f923-1b07-d584-57d5-6e52edb22aca.png)
設定はとりあえずデフォルトで。Ctrl+K, Fで自動整形できるようになる。これにより変なエディタの設定をしている人を振るい落とす。

https://maku.blog/p/7aoa6x5/

### [Code Cleanup On Save](https://marketplace.visualstudio.com/items?itemName=MadsKristensen.CodeCleanupOnSave)。Ctrl+K, Fで自動整形が面倒な場合入れる。


個人開発なら以上でいいかもしれない。以下はチーム開発等でAzure DevOpsを使って、CIをしたい場合。


# Azure DevOps側の設定
SonarにはSonarCloudとSonarQubeの2種類があります。SonarCloudはSaaS版でSonarQubeは自分でサーバを立てるためひと手間必要になる模様。今回はAzure DevOpsともデフォルトで連携できるSonarCloudを選択。

https://community.sonarsource.com/t/sonarcloud-vs-sonarqube/9557

### Azure DevOpsとSonarCloudの連携
基本的にはSonarが出しているオフィシャルドキュメントに従えばできた。

https://docs.sonarcloud.io/getting-started/azure-devops/

### 静的解析を呼び出すPipelineを作ってみる

Azure DevOpsとSonarCloudの連携が済み、OrganizationにSonarCloudのExtensionを入れた状態で、Azure DevOpsのPipelineを作ってみる。
トリガーをDevブランチとかにするとDevが変更されるたびに呼ばれるようになるのでいいかもしれない。
Prepare > Build > Analyze > Publish　の順番に設定する。

https://docs.sonarcloud.io/advanced-setup/ci-based-analysis/sonarcloud-extension-for-azure-devops/

```
# 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'
```


これでSonarCloud側で結果が見れるようになる。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/c5a66ce2-c702-94c4-bedb-3cd471e7a3ff.png)

結果の見方はこちら。

https://blog.tagbangers.co.jp/ja/2019/09/30/sonar_analytics


Dashboardはあまり詳細な情報は見れない。残念(´・ω・｀)。ちゃんと結果を見るにはSonarCloudで見るしかない。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/773b0e77-043a-a8ec-a903-39f98871b92b.png)

### Pull Requestを静的分析の対象にする

https://docs.sonarcloud.io/advanced-setup/ci-based-analysis/sonarcloud-extension-for-azure-devops/#branch-and-pull-request-analysis

SonarCloudのページで左下のGeneral Settings > Pull Requestsを設定
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/4cc0317f-7025-40af-0d3b-a0d6477ab7bf.png)

Azure DevOpsのMasterでBranch Policyを設定（Devにするべきだった）
- Status checks
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/bc57af89-a68f-44c4-24da-8a23c395777f.png)

- Build Validation
Build Pipelineには先ほど作ったPipelineの名前を入力する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/f33499cb-16e3-d831-b500-3eb88eee7e16.png)

試しに適当にソースを修正してPull Requestを作ってみると、、、差分だけが静的分析の対象となり、PullRequestに自動的に警告コメントを入れてくれる。今回は未使用の変数を入れてみたので、コードスメルとして検知された。また、警告が解決されないとMergeできないようになっている。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/bdf8ae9d-54fb-0d87-89b7-b783fcd16d1a.png)


# SonarcloudとVisual Studio（Sonarlint）をConnectedModeで連携する

必須ではないかもしれせんが、SonarcloudとVisual Studio（Sonarlint）を連携することで、チーム開発用の機能が使えるようになる。簡単に言うと、個々人がローカルのVS（Sonarlint）で実施した設定をSonarcloud経由で連携したり、分析ルールをチームで共有できるようになる模様。

https://github.com/SonarSource/sonarlint-visualstudio/wiki/Connected-Mode#setting-up-connected-mode

https://github.com/SonarSource/sonarlint-visualstudio/wiki/Connected-Mode-configuration-for--C%23-and-Visual-Basic-projects

Username/TokenにはTokenだけを入れて、Passwordは空にする。（ここで引っかかった。。）
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/a720178a-6606-1973-647a-313de1ec6980.png)

Bindする。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/654538/1e4586a2-09a5-6505-6123-68c2e590afcf.png)