こんにちは、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のCI連携方法
モチベーション
- GitHubで管理しているコードをローカル上で、脆弱性の手動スキャンを行わなくても、GitHubへのプッシュをトリガーに自動で脆弱性スキャンをしてくれるようにしたい
- 脆弱性だけではなく、単体テストのカバレッジ結果もひとつの統合サービスから閲覧できるようにしたい
前提
CIツールとして、本記事ではGitHubとGitHub Actionsを使用します
- SonarQubeにてアカウントが作成されていること
- GitHubアカウントが作成されていること
手順
【SonarQube Cloud 導入方法】
詳細はこちら:SonarQube Cloud: 開発者ガイド |ソナー
- SonarQube Cloud にサインアップする サインアップは、GitHubのアカウントを使用してサインアップすることができます。
- GitHubから組織をインポートするために、[Import an organization]を押下する
- 下記から、インストールするGitHubリポジトリを選択し、[Save]を押下する
- All repositories
- Only select repositories
- 「Create an organization」に移動後、組織の名前とキーを決定する
- 無料プランを選択する
- [Create Organization]を押下する
- 「Analyze projects」で脆弱性スキャン・単体テストを行いたい、リポジトリを選択する
上記で、SonarQube Cloudの初期設定は完了です。
【SonarQube Cloud CIへの適用方法】
- CI(GitHub Action)で使用するトークンをSonarQube Cloudで発行する SonarCloudの画面右上の自分のアイコン > [My Account] > [Security] に移動します。「Generate Tokens」 で、トークン名(例: GITHUB_ACTIONS_TOKEN)を入力し、[Generate] を押下します。生成されたトークンをコピーして安全な場所に一時保管します。
- SonarQube Cloudの下記情報をメモしておく
キー 説明 Organization Key SonarCloudの組織名(通常はGitHubの組織名やユーザー名) Project Key SonarCloudがリポジトリに対して自動生成したキー(通常は GitHubユーザー名_リポジトリ名 のような形式) - トークンをGitHub上のシークレットに登録する GitHubリポジトリに移動し、[Settings] > [Secrets and variables] > [Actions] を選択します。[New repository secret] を押下し、Name に「SONAR_TOKEN」 を入力します。Secretに先ほどSonarCloudで生成・コピーしたトークンを貼り付け、[Add secret] を押下します。
- 2でメモしたキーをGitHub上の変数として登録する [Settings] > [Secrets and variables] > [Actions] > [Variables] を選択し、[New repository variables]を押下します。 Name に「SONAR_ORGANIZATION」を入力し、Valueに先ほどメモしたキーを貼り付け、[Add variable]を押下します。同様にして、「Project Key」も変数として登録します。
- GitHub Actionsのワークフローファイルを作成する GitHubリポジトリの[Actions]タブを選択し、Simple workflowの[configure]を押下します。
- コードの単体テストを実施しない場合)ワークフローを定義する 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 }}
- (コードの単体テストを実施したい場合)ワークフローを定義する 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の導入を考えてみてはいかがでしょうか?