SonarQube スキャンの構成

SonarQube は、ソース・コードの全体的な正常性と品質の概要を提供し、新しいコード内で見つかった問題を強調表示します。 コード・アナライザーは、20 を超えるコーディング言語において、NULL ポインター間接参照などの注意を要するバグ、論理エラー、リソース・リークを検出します。

以下のようにして、ソース・コードの品質を継続的に分析および測定するように SonarQube を構成します。

  1. IBM Cloudコンソールで、メニューアイコンのハンバーガーアイコン>Platform Automation>Toolchains をクリックします。 「ツールチェーン」ページで、ツールチェーンをクリックしてその「概要」ページを開きます。 あるいは、アプリの「概要」ページの「継続的デリバリー」カードで、**「ツールチェーンの表示」をクリックします。 次に、「概要」**をクリックします。

    a. **「ツールの追加」**をクリックします。

    b. 「ツール統合」セクションで**「SonarQube」**をクリックします。

  2. SonarQube ツール統合のこのインスタンスの名前を入力します。

  3. ツールチェーンから SonarQube カードをクリックしたときに開くようにしたい SonarQube インスタンスの URL を入力します。

  4. オプション: SonarQube サーバーへの接続に使用するユーザー名を入力します。

    ユーザー名を指定する必要があるのは、パスワードを使用して SonarQube サーバーに接続する場合のみです。 接続に認証トークンを使用する場合は、このフィールドを空のままにしてください。

  5. SonarQube サーバーへの接続に使用するパスワードまたは認証トークンを入力します。

  6. サーバーが公共のインターネット上に存在できない場合は、 [詳細設定 ]を選択します。 IBM Cloud、提供された接続の詳細を検証できず、このサーバーへの API アクセスを必要とする一部の機能が無効になります。 デリバリー・パイプラインは、このサーバーにネットワーク経由でアクセスできるプライベート・ワーカーを使用しないと機能しません。

  7. 「統合の作成」 をクリックします。

  8. ツールチェーンの「概要」ページの**「サード・パーティー・ツール」カードで、「SonarQube」**をクリックして、接続先の SonarQube インスタンスのダッシュボードを表示します。

継続的統合パイプラインへの Sonarqube の追加

デフォルトの SonarQube インスタンス

  • sonarqube-configdefault に設定されている場合、デフォルトで SonarQube がスキャンに使用されます。 このスキャンは、 Docker-in-Dockerとして実行されます。

使用されるインスタンスは、実行中にのみ使用可能です。 したがって、ダッシュボードにアクセスできません。

  • デフォルトでは、パイプラインは SonarQube コミュニティー・エディションを使用します。このコミュニティー・エディションの checks.Many 脆弱性ルールとホスト・スポットの問題は、 Community Editionではカバーされていません。

  • Community Edition で脆弱性がチェックされているかどうかを確認するには、 Sonarqube コミュニティーの質問のスレッド を参照してください。

SonarQube,をダウンロードするには、SonarQubeダウンロード を参照してください

開発クラスター上の SonarQube インスタンス

sonarqube-configcluster に設定されている場合、パイプラインは dev クラスターでのパイプライン実行中に SonarQube インスタンスを作成します。 このインスタンスには、静的スキャン・ステージが正常に runs.You SonarQube ダッシュボードには、ポート転送を使用してローカルでアクセスできます。

既存の SonarQube インスタンス

既存のパイプラインに独自の SonarQube インスタンスを追加するには、 sonarqube-configcustom に設定し、ツール統合をツールチェーンに追加し、 SonarQube ツール統合パラメータをパイプラインに追加します。 詳しくは、 SonarQubeの構成 を参照してください。

自己署名証明書付きSonarqubeサーバー

既存のsonarqubeサーバーを 使用するため、 sonarqube-configcustom に設定し、サーバーに自己署名証明書がある場合、ソナースキャナーがsonarqubeサーバーに正常に接続するには、自己署名証明書を 信頼済みCA証明書に追加 する必要があります。

証明書を PEM フォーマット( base64 エンコードされたシークレット値または PEM フォーマットされたプレーンテキストのいずれか)でパイプライン/トリガープロパティ sonarqube-root-certificate の値として提供することで、maven のための SonarScanner、gradle sonar のための SonarScanner、または Docker で呼び出される SonarScanner の使用状況に応じて構成が追加されます。

パラメーター

SonarQube スキャンを実行するには、パイプラインに以下の継続的統合パラメーターが必要です。

Continuous integration pipeline parameters
名前 タイプ 説明 必須またはオプションです
クラスター名 テキスト Docker ビルド・クラスターの名前。 必須
dev-region テキスト クラスターをホストしている IBM Cloud リージョン。 必須
opt-in-sonar テキスト sonarQube スキャンを有効にするオプション。 必須
sonarqube ツール統合 Sonarqube ツール統合。 オプション
ソナクベ設定 テキスト 分離された Docker-in-Docker コンテナー (デフォルト構成) または既存の開発 Kubernetes クラスター (クラスター構成) で SonarQube スキャンを実行します。 あるいは、独自の SonarQube インスタンスを持ち込み、 SonarQube ツール統合 (カスタム構成) を構成することもできます。 オプション: defaultcluster、または custom。 デフォルトは default。 詳しくは、継続的統合パイプラインへの SonarQube の追加 を参照してください。 必須
opt-in-sonar-ホット・スポット テキスト ホット・スポットを検出するための Sonarqube スキャン。 オプション
オプトイン・ソナー・クオリティ・ゲート テキスト Sonarqubeスキャンで品質ゲートの不具合を検出できるようにする。 オプション
オプトイン・ソナーpr分析 テキスト Sonarqube スキャンによるプルリクエストの分析を許可する (このオプションは、PR がフォークされたリポジトリから投稿されていない場合にのみ機能します)。 このパラメータは App-preview PR pipeline に対してのみ有効である。 オプション
sonarqube-ユーザー-トークン シークレット sonarqube-config の場合、API アクセスに使用するユーザートークンを渡します。 custom オプション
ソナークベ-ルート証明書 テキストまたはセカート sonarqube-configcustom に設定されている場合、自己署名入り証明書を PEM フォーマッ ト・テキストまたは base64 エンコードされたシークレットとして渡す オプション

パイプラインのパラメーターについて詳しくは、パイプラインのパラメーターを参照してください。

複数の SonarQube ツール統合をパイプラインに追加した場合は、ツール統合パラメーターである sonarqube パイプライン・パラメーターの値を変更して、それらのツール統合を切り替えることができます。

SonarQube にインストールされたプラグイン

DevSecOpsPipelinesは、デフォルトでSonarQubeバージョン10.0を使用します。

プリインストールされているプラグインのリストについて詳しくは、 プラグイン を参照してください。

SonarQube から報告された問題

DevSecOpsPipelinesは、SonarQubeのスキャン中に報告された問題をフィルタリングします。 パイプラインは、 CODE_SMELL タイプでも BUG タイプでもない問題に対して、コンプライアンス・インCcidencesを排他的に作成します。 パイプラインは、状況が CLOSED である問題もスキップします。

App PreviewのPRパイプラインでPull Request分析を有効にする

PR分析オプションは、PRがターゲットリポジトリと同じリポジトリから来ている(フォークではない)場合、 App Preview PR pipeline。 SonarqubeインスタンスはPR分析もサポートする必要がある。 sonarqube Developer Editionからプルリクエスト解析が可能になったため、 cluster および dind モードで使用するデフォルトのsonarqubeインスタンスは、この機能をサポートしていません。 環境変数 opt-in-sonar-pr-analysis をパイプラインに追加し、その値が空であってはならない。

SonarQube プロジェクトでクオリティ・ゲートの結果処理を有効にする

SonarQube におけるクオリティゲートとは、プロジェクトが要求されるコード品質基準を満たすかどうかを決定する一連の条件のことである。 クオリティ・ゲートの詳細については、 SonarQube ドキュメンテーションを参照。

SonarQube issueパーサーは、 Quality Gateの結果を処理することをサポートし、それが原因で障害が発生した場合、issueを作成します。 SonarQube クオリティ・ゲートの結果を処理できるようにするには、環境プロパティ opt-in-sonar-quality-gates1 に設定します。

opt-in-sonar-quality-gates1 として設定され、 独自の SonarQube インスタンスを 統合として使用している場合( sonarqube-configcustom として設定されている)、品質ゲート名をフェッチするには、 SonarQube Web API にアクセスするために必要な権限を持つ SonarQube ユーザートークンを生成し、トークンをシークレット値としてパイプライン環境プロパティ sonarqube-user-token を設定します。 必要なトークン権限の詳細については、 SonarQube トークン権限を 参照してください。

パイプラインが作成した SonarQube インスタンスまたはカスタム SonarQube ツール統合を使用する場合は、以下の手順に従って SonarQube ダッシュボードをナビゲートします:

  1. static-scan タスクのパイプライン・ログの URL を使用して、作成された SonarQube ダッシュボードに移動します。

    SonarQubeダッシュボード
    SonarQubeダッシュボード

  2. デフォルトでは、 Sonar way 品質ゲートは、特定の品質ゲートに明示的に関連付けられていないすべてのプロジェクトに関連付けられます。 カスタム測定条件を持つ新しい品質ゲートも作成できる。

    • ダッシュボードでクオリティ・ゲートのリストを探すには、上部のナビ・バーからクオリティ・ゲートをクリックする。

      SonarQube デフォルト・クオリティ・ゲート デフォルト・クオリティ・ゲート
      SonarQube

    • 新しいクオリティ・ゲートを作成するには、上部のナビ・バーからクオリティ・ゲートをクリックし、次に作成をクリックします。 品質ゲートに名前を追加し、条件メトリクスの追加/削除/更新を行うことができます。

    • プロジェクトに関連付けられている品質ゲートを検索するには、プロジェクトを選択し、[ プロジェクト設定 ] > [ 品質ゲート] をクリックします。

      SonarQube プロジェクト品質ゲート プロジェクトに関連する品質ゲート
      SonarQube

    • 特定のプロジェクトに(デフォルト以外の)品質ゲートを関連付けるには、プロジェクトを選択し、[ プロジェクト設定 ] > [ 品質ゲート ] > [ 常に特定の品質ゲートを使用 ] > ドロップダウンから必要な品質ゲートを選択 > [ 保存] をクリックします

      caption-side=bottom"
      SonarQube プロジェクト品質ゲート プロジェクトと品質ゲートを関連付ける。

  3. 新しいスキャンはこの品質ゲートで評価され、エビデンスはこの品質ゲートの結果から作成されるようになります。 課題は、クオリティ・ゲートの失敗の原因となった条件に基づいて作成される。

    Sonarqube API の応答である品質ゲートステータスの結果フォーマットの例: ${SONAR_HOST_URL}/api/qualitygates/project_status?projectKey=${SONAR_PROJECT_KEY}

    {
       "projectStatus": {
          "status": "ERROR",
          "conditions": [
             {
             "status": "ERROR",
             "metricKey": "new_coverage",
             "comparator": "LT",
             "errorThreshold": "80",
             "actualValue": "0.0"
             },
             {
             "status": "OK",
             "metricKey": "new_duplicated_lines_density",
             "comparator": "GT",
             "errorThreshold": "3",
             "actualValue": "0.0"
             },
             {
             "status": "ERROR",
             "metricKey": "new_security_hotspots_reviewed",
             "comparator": "LT",
             "errorThreshold": "100",
             "actualValue": "0.0"
             },
             {
             "status": "ERROR",
             "metricKey": "new_violations",
             "comparator": "GT",
             "errorThreshold": "0",
             "actualValue": "14"
             }
          ],
          "ignoredConditions": false,
          "period": {
             "mode": "PREVIOUS_VERSION",
             "date": "2025-03-18T09:43:25+0000"
          },
          "caycStatus": "compliant",
          "additional": {
             "qualityGateName": "Sonar way",
             "projectKey": "hello-compliance-app-compliance-check",
             "dashboardUrl": "http://localhost:9001/dashboard?id=hello-compliance-app-compliance-check"
          }
       }
    }
    
    

    SonarQube API の詳細については、 Sonarqube WebAPI ドキュメントを参照してください

    ステータスが ERROR である各メトリック・キーに対して課題が作成され、すべての失敗したメトリックが個別に追跡され、対処されることが保証される。

    例題:

    caption-side=bottom"
    SonarQube issue 失敗したメトリックに関する Sonarqube issue

    例 SonarQube クオリティ・ゲートの失敗による証拠不成立:

    {
       "id": "abc",
       "evidence_type_id": "com.ibm.static_scan",
       "evidence_type_version": "1.0.0",
       "date": "2025-03-18T11:22:35.086Z",
       "origin": {
       },
       "details": {
          "result": "failure",
          "tool": "sonarqube",
          "failure_reason": "tool_detected_vulnerabilities"
       },
       "issues": [
          "https://github.com/<org-name>/compliance-issues-20250310111628285/issues/14",
          "https://github.com/<org-name>/compliance-issues-20250310111628285/issues/15"
       ],
       "findings": [
          {
             "id": "Metric: new_coverage",
             "due_date": "n/a",
             "severity": "high",
             "first_found": "2025-03-18",
             "url": "https://github.com/<org-name>/compliance-issues-repo/issues/14",
             "found_status": "existing",
             "has_exempt": false,
             "cvss": "n/a",
             "package": []
          },
          {
             "id": "Metric: new_security_hotspots_reviewed",
             "due_date": "n/a",
             "severity": "high",
             "first_found": "2025-03-18",
             "url": "https://github.com/<org-name>/compliance-issues-repo/issues/15",
             "found_status": "existing",
             "has_exempt": false,
             "cvss": "n/a",
             "package": []
          }
       ],
       "attachments": [
          {
             "hash": "d10a1e5d727b4f778a1d70c2ebaa2060251d56dd79",
             "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/d10a1e5d727b4f778a1d70c2e/content",
             "label": "app_issues"
          },
          {
             "hash": "d76d356cc4da1afc942a6259c1222a7b079607ea7e0d64",
             "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/d76d356cc4da1afc942a6259c1222a7b0/content",
             "label": "app_hotspots"
          },
          {
             "hash": "f0f84a2c2210a9c65c8430d577dafdd71bee6df5da",
             "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/f0f84a2c2210a9c65c8430d577dafdd71bee6e/content",
             "label": "app_quality_status_updated"
          }
       ],
       "assets": [
          {
             "hash": "1812f77dfc646c93320794810460acd3e53",
             "uri": "https://github.com/<org-name>/abcd/compliance-app-20250310111628285.git#7a06e70001a59032d1",
             "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/assets/1812f77dfc646c93320794810460acd3e/index.json"
          }
       ]
    }
    
    

CIパイプラインで有効になっている場合は、CCで opt-in-sonar-quality-gates。 そうでなければ、CCによって発見されたクオリティ・ゲートの問題はオートクローズされることになる。 現在、この矛盾に関する警告メッセージをログに表示しています。

SonarQube,、詳しくは SonarQube ドキュメントを参照。

SonarQube ホットスポット処理の有効化

SonarQube ホットスポットは、セキュリティ上重要なコードを強調表示するもので、そのコードが本当のリスクをもたらすかどうかを判断するために、手作業によるレビューが必要である。 誤検知を発生させることなく、開発者が潜在的な脆弱性に集中できるようにする。 ホットスポットの管理について詳しくは、 SonarQube ドキュメントをご覧ください。

SonarQube ホットスポットの処理を有効にするには、環境プロパティ opt-in-sonar-hotspots1 に設定します。

opt-in-sonar-hotspots1 に設定され、 SonarQube インスタンスを インテグレーションとして使用している場合 ( sonarqube-configcustom に設定されている場合)、Web API を使用して Sonarqube が検出したホットスポットを取得するには、 SonarQube Web API にアクセスするために必要な権限を持つ SonarQube ユーザートークンを生成し、パイプライン環境プロパティ sonarqube-user-token にトークンをシークレット値として設定します。 必要なトークン権限の詳細については、 SonarQube トークン権限を 参照してください。

  • SonarQube で検出されたプロジェクトのセキュリティホットスポットを確認するには、プロジェクトを選択し、「 Security Hotspots(セキュリティホットスポット) 」をクリックします。

    SonarQube プロジェクト ホットスポット ホットスポットを検出
    SonarQube

  • 検出されたホットスポットを確認するには、ホットスポットを選択して [Review] をクリックします。 モーダルが表示され、レビューステータスを以下のいずれかに設定できます: To Review AcknowledgedFixedSafe

    SonarQube project ホットスポット レビュー ホットスポット
    SonarQube

opt-in-sonar-hotspots フラグを有効にすると、 SonarQube によってホットスポットが検出され、レビューステータスが設定されていない場合、issue が作成されます: Acknowledged Fixed および Safe

SonarQube ホットスポットの問題 ホットスポットの問題
SonarQube

SonarQube API の応答であるホットスポットの結果フォーマットの例:${SONAR_HOST_URL}/api/hotspots/search?projectKey=${SONAR_PROJECT_KEY}&p=$page&status=TO_REVIEW"

{
   "hotspots": [
      {
         "key": "AYLD_a1_Hqacjdg4wbDR",
         "component": "hello-compliance-app-compliance-check:index.js",
         "project": "hello-compliance-app-compliance-check",
         "securityCategory": "others",
         "vulnerabilityProbability": "LOW",
         "status": "TO_REVIEW",
         "line": 74,
         "message": "Make sure disabling content security policy frame-ancestors directive is safe here.",
         "author": "abc@1.com",
         "creationDate": "2022-04-01T06:29:13+0000",
         "updateDate": "2022-08-22T05:18:31+0000",
         "textRange": {
         "startLine": 74,
         "endLine": 84,
         "startOffset": 0,
         "endOffset": 1
         },
         "flows": [
         {
            "locations": [
               {
               "component": "hello-compliance-app-compliance-check:app.js",
               "textRange": {
                  "startLine": 76,
                  "endLine": 82,
                  "startOffset": 4,
                  "endOffset": 5
               }
               }
            ]
         }
         ],
         "rule": {
         "key": "javascript:S5732"
         }
      }
   ]
}

先のAPIの結果で To Review ステータスのホットスポットに遭遇した場合、 findings セクションにホットスポット情報を含む失敗エビデンスが収集される。

例 SonarQube ホットスポット検出による証拠失敗:

{
  "id": "62fc60140b2a761a969c6ad4f64d93d9c0f8f2301b1",
  "evidence_type_id": "com.ibm.static_scan",
  "evidence_type_version": "1.0.0",
  "date": "2025-03-18T10:29:00.896Z",
  "origin": {
  },
  "details": {
    "result": "failure",
    "tool": "sonarqube",
    "failure_reason": "tool_detected_vulnerabilities"
  },
  "issues": [
    "https://github.com/<org-name>/compliance-issues-20250310111628285/issues/13"
  ],
  "findings": [
    {
      "id": "javascript:S4426",
      "due_date": "n/a",
      "severity": "high",
      "first_found": "2025-03-18",
      "url": "https://github.com/<org-name>/compliance-issues-20250310111628285/issues/12",
      "found_status": "new",
      "has_exempt": false,
      "cvss": "n/a",
      "package": []
    },
    {
      "id": "Hotspot: javascript:S2068",
      "due_date": "n/a",
      "severity": "high",
      "first_found": "2025-03-18",
      "url": "https://github.com/<org-name>/compliance-issues-20250310111628285/issues/13",
      "found_status": "new",
      "has_exempt": false,
      "cvss": "n/a",
      "package": []
    },
  ],
  "attachments": [
    {
      "hash": "e579a1ab8025d280d5870eb8d4464d6d6a41a22",
      "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/e579a1ab8025d280d5870eb8d4464d6d6a41a/content",
      "label": "app_issues"
    },
    {
      "hash": "6defa891c320ae2b80ae76d03e168edc2379",
      "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/6defa891c320ae2b80ae76d03e168edc2379748d9/content",
      "label": "app_hotspots"
    },
    {
      "hash": "060a60e2d693427cde6064f72743ebb9e1d6",
      "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/attachments/060a60e2d693427cde6064f72743ebb9e1d/content",
      "label": "app_quality_status_updated"
    }
  ],
  "assets": [
    {
      "hash": "d7391b3273e5e52852f293031d62b9",
      "uri": "https://github.com/<org-name>/compliance-app-20250310111628285.git#4eadaaf7454b8cb0edad927",
      "url": "https://s3.us-south.cloud-object-storage.appdomain.cloud/assets/d7391b3273e5e52852f293031d62b9bf0/index.json"
    }
  ]
}

CIパイプラインで有効になっている場合は、CCで opt-in-sonar-hotspots。 さもなければ、CCが発見したホットスポットの問題はオートクローズされる。 現在、この矛盾に関する警告メッセージをログに表示しています。

SonarQube トークンのパーミッション

既存の SonarQube インスタンスを使用し、Devops Insights に testrecord を正常にパブリッシュしてプロジェクトの Quality Gate 名を取得する場合、必要な Sonarqube エンポイントへのアクセス権限を提供するために、必要な権限を持つユーザートークンを作成し、env プロパティ sonarqube-user-token にシークレット値として設定する必要があります。

ユーザー・トークン を作成するには、 SonarQube ダッシュボードを開く > プロフィール画像をクリック > マイアカウント を選択 > セキュリティ を選択 > タイプ ドロップダウンから ユーザー・トークン を選択 > をクリックします。 生成する

SonarQube ユーザー・トークン ユーザー・トークン生成
SonarQube

  1. Devops Insightsプラグインは、Sonarqubeサーバーに対して以下のAPIコールを行います:

    • api/qualitygates/project_status を取得

      以下のいずれかの権限が必要:

      • システムの管理
      • 指定されたプロジェクトの「管理者」権限
      • 指定したプロジェクトを「ブラウズ」する
      • 指定したプロジェクトで「分析を実行する
    • api/measures/component を取得

      指定したプロジェクトの 'Browse' 権限が必要です。

    • api/issues/search を取得

      指定したプロジェクトの「Browse」パーミッションが必要です。

    • GET api/ce/task

      以下のいずれかの権限が必要:

      • グローバルまたはプロジェクトレベルでの「管理
      • グローバルまたはプロジェクトレベルでの「分析の実行
  2. クオリティ・ゲートの名前を取得するには、次の SonarQube エンドポイントを使用する:

    • api/qualitygates/get_by_project を取得

      以下のいずれかの権限が必要:

      • システムの管理
      • 指定されたプロジェクトの「管理者」権限
      • 指定したプロジェクトを「ブラウズ」する
  3. SonarQube 検出されたホットスポットを取得するには、次の SonarQube エンドポイントを使用します:

SonarQube Web API へのアクセス権限に関する詳細は、 SonarQube Web API ドキュメントをご参照ください

独自の構成ファイルの使用

独自の SonarQube インスタンスを使用しなくてもデフォルトの構成を変更することができます。 設定ファイルを作成したいリポジトリに sonar-project.properties ファイルを作成します。 IBM のスクリプトは、リポジトリーで既存の構成ファイル configuration sonar-project.properties を検出すると、デフォルトのファイルの代わりにそのファイルを使用します。 コンフィギュレーション・ファイルで可能な分析パラメーターについては、 分析パラメーターを参照してください。

sonarqube-project.properties ファイルに sonar.branch.name が追加されている場合は、デフォルト値として sonar-branch-name env プロパティに設定され、そうでない場合は load_repo <app-name> branch から利用可能なブランチ名が考慮される。 詳しくは、 ブランチ・アナリシスのドキュメントを参照してください。

構成ファイルに正しいログイン資格情報とホスト URL を追加したことを確認してください。

別の静的スキャン実装の使用

.pipeline-config.yaml ファイルを変更して独自のカスタム・スクリプトを static-scan ステージに追加することで、独自の静的スキャン実装を使用できます。

SonarQube に関する詳細

SonarQube,、詳しくは SonarQube ドキュメントを参照。