sonarcloudとGitHubをつなげて静的コード解析を手に入れる

# 概要

SpringBoot2.5によるRestAPIのサンプルプロジェクトを作っていて、色々調べ物をしていたときに、この記事に出会いました。
https://qiita.com/nagareboshi/items/04e3c0be148b5dd9feee

この記事で紹介されている、GitHubのコードはPublicで公開した方が良い理由の1つに[sonarcloud](https://sonarcloud.io/)の利用が挙げられていました。

> ・sonarcloudが無料で使えます
>  書いたコードの品質を自動でレビューし、指摘箇所があればなぜ悪いのかを理由付きで教えてくれます

このサービスを初めて知り、GitHubのPublic公開リポジトリであれば、無料で利用できるということなので、組み込んでみようというのがこの記事の趣旨です。

# まずはsonarcloudで色々設定する

## sonarcloudとGitHubを連携

sonarcloudのサイトへアクセスし、GitHubのボタンを押下する。
https://sonarcloud.io/

![スクリーンショット 2021-06-09 19.36.48.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8b74f887-b8e8-5e76-1cac-a69c110be200.png)

sonarcloudとGitHubを関連づけるため`Authorize SonarCloud`ボタンを押下して認証する。

![スクリーンショット 2021-06-09 19.37.54.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/ee96447f-c38d-24a8-b42a-72481ea9f736.png)

## GitHubのリポジトリをsonarcloudへインポート

自分のGitHubでPublic公開しているリポジトリをsonarcloudへインポートする。
`Import projects from GitHub`ボタンを押下。

![スクリーンショット 2021-06-09 19.38.52.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/cb479e8f-4209-1d1c-2370-fc7472934633.png)

`All repositories`という選択肢もあるようですが、分析したいのはあくまでもSpringBootで開発しているRestAPIのプロジェクトだけなので、今回は`Only select repositories`を選択して、RestAPIプロジェクトのリポジトリを選択し、`Install`ボタンを押下する。

![スクリーンショット 2021-06-09 19.40.12.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/96d8dabe-6c2e-ccc7-f303-d8fddfbbf624.png)

GitHub側のパスワード認証を求められるため、パスワードを入力して`Confirm password`ボタンを押下

![スクリーンショット 2021-06-09 19.41.25.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/d1679b6a-afac-88f5-e2e9-25098ffe143c.png)

## sonarcloud側に組織情報を定義

`Key`は、組織を一意に識別するためのコードを指定し、組織名や個人の名前など、どのようなものでもOKとのこと。
ただし、一度指定したら、変更することができないため、`test`みたいな適当な名前はやめといた方が良さそうです。

![スクリーンショット 2021-06-09 19.43.22.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/4dbfa2c1-9cb2-76cd-e402-420b9d7643df.png)

GitHubのPublicリポジトリ1つのみを選択しているため、Free Planで問題ないはず。
FreePlanを選択して`Create Organization`ボタンを押下

![スクリーンショット 2021-06-09 19.44.58.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/abd16793-bdba-0103-ea12-5f32b9548d94.png)

## 分析するプロジェクトを選択

sonarcloudで分析するプロジェクトにチェックをつけて`Set Up`ボタンを押下

![スクリーンショット 2021-06-09 19.45.41.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/233bf428-680e-8b72-505d-b44c043d6d5a.png)

Preparing Analysisとか表示されてしばらくすると、ConfigureタブにいくつかのAnalysis Methodが表示されます。

![スクリーンショット 2021-06-09 19.46.17.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/dff3ba98-7235-1a2f-d28d-0843035348b4.png)

## sonarcloudの分析処理へ連携するための設定（GitHub Actions）

sonarcloudで分析処理をさせるために、何らかの処理をトリガーを設定する必要があります。
各種CIにも対応しているようですが、ここでは`GitHub Actions`を利用した方法を採用します。

![スクリーンショット 2021-06-09 19.47.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/edb8bc75-c7cf-d4ca-6b3a-f53bf49e12cb.png)

### GitHub Actions用のSecretを作成

Analyze with a GitHub Actionというページで、1つ目の手順としては`Create a GitHub Secret`という手順（設定）をします。

> In your GitHub repository, go to Settings > Secrets and create a new secret with the following details:

とのことなので、GitHubの自分のリポジトリの設定で、指定された通り、静的コード解析をしたいGitHubのリポジトリに遷移します。

![スクリーンショット 2021-06-09 19.48.24.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8487dc02-d644-6f82-0a1b-b4acd9f0f319.png)

対象となるリポジトリの `Settings`タブに遷移し、`New repository secret`ボタンを押下。

![スクリーンショット 2021-06-09 19.52.45.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/d667c1de-83d0-9e3e-9580-0dcbd7174ded.png)

GitHub Actionsで利用するためのSecretを作成します。

- Analyze with a GitHub Actionのページに表示されていた値を利用して設定する。
  - Name : In the Name field, enter `SONAR_TOKEN` と表示されていた部分の値
  - Value : In the Value field, enter `*********` と表示されていた部分の値

![スクリーンショット 2021-06-09 19.54.28.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8c8c33c4-a3f3-8c38-3eff-1a07c15052f1.png)

### GitHub Actionsのbuild.ymlファイルを作成

`1.Create a GitHub Secret`の手順が完了すると、今度は`Create or update a .github/workflows/build.yml` fileの手順（設定）を行います。

私の場合はMavenでプロジェクトの構成管理を行っています。そのため、ここでは `Maven`を選択して手順を進めていきます。
`Maven`を選択すると、`Update your pom.xml file with the following properties`という項目が表示され、pom.xmlの`<properties>`に3つの定義を追加する必要があるとのこと。
内容をそのままコピーして、自分のプロジェクトのpom.xmlに追加します。

![スクリーンショット 2021-06-12 13.34.10.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/206ca460-65b1-1c36-532c-f5f75aba729b.png)

続いて、`Create or update your .github/workflows/build.yml`という指示があり、そのbuild.ymlの内容について次のような指定があります。

![screencapture-sonarcloud-io-project-configuration-2021-06-09-19_57_57.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/583b8f63-b5fa-64da-012e-05a1bfb115c9.png)

GitHubのリポジトリに遷移し、`Actions`タブにアクセスして、`New Workflow`から`build.yml`ファイルを作成し、内容を次のように指定します。

```yaml:.github/workflows/build.yml
name: Build
on:
  push:
    branches:
      - main   # ← sonarcloudの指定だとmasterとなっているが、GitHubのデフォルトがmainなので注意
  pull_request:
    types: [opened, synchronize, reopened]
jobs:
  build:
    name: Build
    runs-on: ubuntu-latest
    steps:
      - uses: actions/checkout@v2
        with:
          fetch-depth: 0  # Shallow clones should be disabled for a better relevancy of analysis
      - name: Set up JDK 11
        uses: actions/setup-java@v1
        with:
          java-version: 11
      - name: Cache SonarCloud packages
        uses: actions/cache@v1
        with:
          path: ~/.sonar/cache
          key: ${{ runner.os }}-sonar
          restore-keys: ${{ runner.os }}-sonar
      - name: Cache Maven packages
        uses: actions/cache@v1
        with:
          path: ~/.m2
          key: ${{ runner.os }}-m2-${{ hashFiles('**/pom.xml') }}
          restore-keys: ${{ runner.os }}-m2
      - name: Build and analyze
        env:
          GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}  # Needed to get PR information, if any
          SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
        run: mvn -B verify org.sonarsource.scanner.maven:sonar-maven-plugin:sonar
```

![スクリーンショット 2021-06-09 20.06.38.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/2115a715-b59d-4780-ecc4-355e1196f29d.png)

# GitHubのmainリポジトリにpushしてGitHub Actionsを動かす

とりあえず、適当にコードなどを修正して、それをGitHubのmainリポジトリにpushする。
すると、定義したGitHub Actionsが動作してしばらくするとグリーンのチェックに変わる。
（過去２回エラーが出ているのは、pom.xmlの定義が悪かったり、テストコードに不具合があったりしたためエラーがでていました。）

![スクリーンショット 2021-06-12 12.58.55.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/80e72955-ed00-74ea-8eae-7d695fb17da8.png)
![スクリーンショット 2021-06-12 13.01.40.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/bebdaef4-9dba-e61f-82d7-f7c411026aa7.png)

# sonarcloudでの分析結果を確認する

以下にアクセスして分析結果を確認してみます。
https://sonarcloud.io/projects

![スクリーンショット 2021-06-12 13.04.27.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/df07f4d6-5758-62c1-3d05-d2cfe6f3e9d8.png)

RestController Sampleのプロジェクト内にアクセスすると`Overview`タブでこのように表示されました。

![screencapture-sonarcloud-io-dashboard-2021-06-12-13_04_51.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/1e47256f-119f-a20c-44fc-fbda5436f5cf.png)

Bugsのリンク先に遷移すると、静的コード解析の結果、Bugのあるコードを指摘してくれています。

![スクリーンショット 2021-06-12 13.51.42.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/8d98bf9e-4fb5-b706-9cc9-22b8f65d2ea2.png)

さらに中に遷移するとこんな感じ

![スクリーンショット 2021-06-12 13.53.35.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/246556/9f017b24-b78e-454b-d1b0-2b2fa3af603c.png)

なんかこうやって毎回数値化されて状況が確認できるだけで、ワクワクするし開発のモチベーションにもなるし、
もうちょっと顧客向けのレポートとか出せるなら、顧客向けの開発進捗状況の報告用にも使えそうでいいですね。

Surefire Reportとかも出せないかしら。