SonarQubeを使用したコードの品質保証

こんにちは、2年目の加藤です!

私は現在、データエンジニアとして、Google Cloudを活用したデータの取得や加工、整形などを担当しています。データ取得をCloud Run上でPythonを動かしたりすることがあるのですが、Pythonコードの品質担保のためにコードレビューを行っています。しかし、コードレビューだけではバグを見落としたり、コードレビュー者の経験や実力に依存したものとなってしまいます。そのため、私たちはSonarQubeを使用することでコードの品質を担保しています。そこで、本記事ではSonarQubeについて紹介したいと思います。

本記事でわかること

  • SonarQubeの概要
  • SonarQubeでできること
  • SonarQubeのCI連携方法

SonarQube Cloudとは

ソフトウェアのコード品質とセキュリティを継続的に分析・評価するためのオープンソースのプラットフォームです。

SonarQube Cloudには下記のような特徴があります。

  • 多くのプログラミング言語に対応
  • 自動分析が可能で、導入が容易
  • コード品質の要件を自在に定義できる
  • CIパイプラインとの統合が容易にできる

SonarQube Cloudを導入することで、コード品質とセキュリティをコード変更のたびに自動的にチェックすることができ、コードの品質基準を容易に担保をすることができます。

SonarQube詳細内容

SonarQubeにはデフォルトで設定されているコード品質の要件があります。

評価指標 基準 説明
Reliability Rating
A以上 コードのバグの数
A = バグなし
B = 軽微なバグが1つ以上
C =メジャーなバグが1つ以上
D = クリティカルなバグが1つ以上
E = 最重要なバグが1つ以上
Security Rating A以上 脆弱性が検知された件数
A = 脆弱性なし
B = 軽微な脆弱性が1つ以上
C =メジャーな脆弱性が1つ以上
D = クリティカルな脆弱性が1つ以上
E = 最重要な脆弱性が1つ以上
Maintainability Rating A以上 技術的負債の開発比率:
開発するためにかかる推定コストと、将来的に修正や改善が必要となる問題点のコストの比率
A ≤ 5%
B ≥ 5% to <10%
C ≥ 10% to <20%
D ≥ 20% to < 50%
E ≥ 50%
Security Hotspots Reviewed 100%以上 発見されたセキュリティ上の懸念点(ホットスポット)のうち、どれくらいの割合がすでに確認・検討されたかを表す指標
Coverage(テスト網羅率) 80%以上 単体テストによってカバーされたコードの割合
Duplicated Lines(重複コード率) 3.0%以下 ソフトウェアのコード全体の中で、どれくらいの割合のコードが重複しているかを示す指標
SonarQube Cloudでは、単体テストまではサポートしていないので、サードパーティーの単体テストツール(Pytest、Jestなど)を使用して評価する必要があります。

SonarQubeのCI連携方法

モチベーション

  • GitHubで管理しているコードをローカル上で、脆弱性の手動スキャンを行わなくても、GitHubへのプッシュをトリガーに自動で脆弱性スキャンをしてくれるようにしたい
  • 脆弱性だけではなく、単体テストのカバレッジ結果もひとつの統合サービスから閲覧できるようにしたい

前提

CIツールとして、本記事ではGitHubとGitHub Actionsを使用します

  • SonarQubeにてアカウントが作成されていること
  • GitHubアカウントが作成されていること

手順

【SonarQube Cloud 導入方法】

詳細はこちら:SonarQube Cloud: 開発者ガイド |ソナー

  1. SonarQube Cloud にサインアップする サインアップは、GitHubのアカウントを使用してサインアップすることができます。
  2. GitHubから組織をインポートするために、[Import an organization]を押下する
  3. 下記から、インストールするGitHubリポジトリを選択し、[Save]を押下する
    • All repositories
    • Only select repositories
  4. 「Create an organization」に移動後、組織の名前とキーを決定する
  5. 無料プランを選択する
  6. [Create Organization]を押下する
  7. 「Analyze projects」で脆弱性スキャン・単体テストを行いたい、リポジトリを選択する

上記で、SonarQube Cloudの初期設定は完了です。

【SonarQube Cloud CIへの適用方法】

  1. CI(GitHub Action)で使用するトークンをSonarQube Cloudで発行する SonarCloudの画面右上の自分のアイコン > [My Account] > [Security] に移動します。「Generate Tokens」 で、トークン名(例: GITHUB_ACTIONS_TOKEN)を入力し、[Generate] を押下します。生成されたトークンをコピーして安全な場所に一時保管します。
  2. SonarQube Cloudの下記情報をメモしておく
    キー 説明
    Organization Key SonarCloudの組織名(通常はGitHubの組織名やユーザー名)
    Project Key SonarCloudがリポジトリに対して自動生成したキー(通常は GitHubユーザー名_リポジトリ名 のような形式)
  3. トークンをGitHub上のシークレットに登録する GitHubリポジトリに移動し、[Settings] > [Secrets and variables] > [Actions] を選択します。[New repository secret] を押下し、Name に「SONAR_TOKEN」 を入力します。Secretに先ほどSonarCloudで生成・コピーしたトークンを貼り付け、[Add secret] を押下します。
  4. 2でメモしたキーをGitHub上の変数として登録する [Settings] > [Secrets and variables] > [Actions] > [Variables] を選択し、[New repository variables]を押下します。 Name に「SONAR_ORGANIZATION」を入力し、Valueに先ほどメモしたキーを貼り付け、[Add variable]を押下します。同様にして、「Project Key」も変数として登録します。
  5. GitHub Actionsのワークフローファイルを作成する GitHubリポジトリの[Actions]タブを選択し、Simple workflowの[configure]を押下します。
    CI/CDを設定したいGitHubリポジトリのルートに、 .github という名前のディレクトリを作成し、さらにその中に workflows という名前のディレクトリを作成します。GitHub Actionsはこのディレクトリ内のYAMLファイルを自動的に認識し、ワークフローとして実行してくれます。上記を手順5を行うことでディレクトリを自動で作成してくれます。
  6. コードの単体テストを実施しない場合)ワークフローを定義する SonarQubeを動作させるための以下コードをコピー&ペーストし、[Commit changes…]を押下します。
    name: SonarQube Scan
    on:
      pull_request:
        types: [opened, reopened, ready_for_review, synchronize]
    jobs:
       sonar_qube_scan:
        runs-on: ubuntu-latest
        name: SonarQube Scan
        steps:
          # リポジトリのソースコードをチェックアウト
          - name: Checkout
            uses: actions/checkout@v4
          # SonarQubeスキャンを実行(カバレッジレポート無)
          - name: SonarQube Scan
            uses: SonarSource/sonarqube-scan-action@v4
            env:
              SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
            with:
              args: >
                -Dsonar.projectKey=${{ vars.SONAR_PROJECT_KEY }} -Dsonar.organization=${{ vars.SONAR_ORGANIZATION }}
    on では、ワークフローのトリガー条件を記載します。今回の場合では、プルリクエストが作成、再作成、ドラフト状態からレビュー待ち、コミットされた際に動作するように設定してあります。
    jobs では、実際のワークフローを定義します。
  7. (コードの単体テストを実施したい場合)ワークフローを定義する SonarQubeを動作させるための以下コードをコピー&ペーストし、[Commit changes…]を押下します。今回は、例としてJavaScriptコードを単体テストツールJestを使用して評価しています。
    name: Run JavaScript Unit Tests
    on:
      pull_request:
        types: [opened, reopened, ready_for_review, synchronize]
    jobs:
      unit-tests-with-jest:
        name: unit tests with jest
        runs-on: ubuntu-latest
    
        steps:
          # 1. リポジトリのコードを取得
          - name: Checkout code
            uses: actions/checkout@v4
            with:
              fetch-depth: 0
          
          # 2. Node.js 環境のセットアップ
          - name: Setup Node.js
            uses: actions/setup-node@v4
            with:
              node-version: 18
    
          # 3. Jestをインストール
          - name: Install Jest
            run: npm install --save-dev jest
    
          # 4. カバレッジレポートをcoverage/lcov.infoに出力
          - name: Generate lcov report
            run: npm test -- --coverage --coverageDirectory=coverage --coverageReporters=lcov
          
          # 5. SonarQubeにカバレッジレポートを送信
          - name: SonarQube Scan
            uses: SonarSource/sonarqube-scan-action@v4
            env:
              SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
            with:
              args: >
                -Dsonar.projectKey=${{ vars.SONAR_PROJECT_KEY }}
                -Dsonar.organization=${{ vars.SONAR_ORGANIZATION }}
                -Dsonar.sources=src
                -Dsonar.javascript.lcov.reportPaths=coverage/lcov.info
    

上記で、GitHub Actionsのワークフロー設定は完了です。

実行結果は下記のようになります。GitHub Actions上のワークフローでチェックマークが表示されていれば、解析が問題なく完了していることを表しています。SonarQubeスキャンログを下の方までいくと、SonarQube CloudへのURLが出力されており、そこから解析結果に遷移することができます。

まとめ

今回は、SonarQube Cloudのご紹介をさせていただきました。

最近、開発だけではなく、品質の担保も重要だということを学び、このサービス一つで全部できるじゃん!と改めて世の中便利なサービスが多いことを実感しました。

アプリ開発を担当している方は一度、コードの品質保証のためにSonarQubeの導入を考えてみてはいかがでしょうか?

タイトルとURLをコピーしました