SonarQube step configuration
Scan code repositories with SonarQube.
Harness STO integrates with SonarQube to scan your code repositories for vulnerabilities, enforce policies, and maintain code quality. The SonarQube step supports all the three STO scan modes: Orchestration, Ingestion, and Extraction.
Language Support: All languages supported by SonarQube are compatible. Refer to the SonarQube language reference for prerequisites specific to your repository's language.
SonarQube Issue categorization in STO
STO categorizes the SonarQube issues with severities: Critical, High, Medium, Low, and Info, refer to STO severity levels for more details. The table below outlines how specific SonarQube issue types are classified in STO.
Vulnerabilities
Imported, normalized, deduplicated and assigned STO severity levels. See severity mapping table below.
Code Smells, Bug Smells
By default, imported and categorized under Info severity.
If you enable the Treat Code Smells and Bug Smells as Vulnerabilities in Default Settings at Account level Settings (disabled by default), STO imports these issues with their original severities. See severity mapping table below.
Maintainability issues
Imported and categorized under Info severity.
Imported and categorized as policy issues with Info severity.
Imported as both a step output variable and a policy issue with Info severity.
Hotspots
Currently not supported by STO.
SonarQube Severity Mapping
When STO imports SonarQube issues, it maps the SonarQube severity levels to the STO severity levels as follows:
INFO
Info
MINOR
Low
MAJOR
Medium
CRITICAL
High
BLOCKER
Critical
Step configuration guidelines
Use the following guidelines when configuring and running SonarQube scans in STO:
Resource Allocation
By default, STO allocates 500Mi memory for SonarQube scans, suitable primarily for Ingestion scans.
For Orchestration and Extraction scans, allocate at least 2GB memory. Customize resource limits per Set Container Resources.
Certificates and Root Access
Run scans with root access if adding trusted certificates at runtime.
Alternatively, configure STO images and pipelines to run as non-root users and manage self-signed certificates. For details, see Configure your pipeline to use STO images from private registry.
SonarQube step settings
The recommended workflow is to add a SonarQube step to a Security or Build stage and then configure it as described below.
A Docker-in-Docker background step is not required for this workflow.
Scan
Scan Mode
Scan Configuration
The predefined configuration to use for the scan.
Default Extract results for the Main branch defined in SonarQube. SonarQube Community Edition supports extracting scan results for the Main branch only.
Branch Scan In Orchestration or Extraction mode, extract results based on how the pipeline is executed:
Manual executions - The branch defined in SonarQube (Target variant)
Triggered executions - The pull request defined in SonarQube
Target
Type
Target and Variant Detection
Name
If you're running an Extraction scan, this field should match the code repository name in SonarQube.
Variant
If you're running an Extraction scan, this field should match the branch or PR defined in SonarQube.
Workspace
Ingestion File
Authentication
Domain
The URL of the SonarQube server. This is required for Orchestration and Extraction scans. This value corresponds to the sonar.host.url setting in SonarQube.
Enforce SSL
Access Token
Scan Tool
Project key
The unique key of the SonarQube project to scan.
Exclude
If you want to exclude some files from a scan, you can use this setting to configure the sonar.exclusions in your SonarQube project. For more information, go to Narrowing the Focus in the SonarQube docs.
Java Libraries
A comma-separated list of paths to files with third-party libraries used by your tests. For SonarQube scans, this corresponds to the sonar.java.libraries parameter.
Java Binaries
A comma-separated list of paths to the folders with the bytecode files you want to scan. For SonarQube scans, this corresponds to the sonar.java.binaries parameter.
Log Level
Additional CLI flags
You can add CLI flags to run the sonar-scanner binary with specific command-line arguments. Here are some examples:
-Dsonar.ws.timeout=300: Suppose the scan is experiencing timeouts due to long response times from a web service. This flag increases the timeout window.-Dsonar.projectName=<project_name>: The project name.-Dsonar.projectVersion=<version_number>: The project version to scan.-Dsonar.projectKey=<project_key>: The unique key of the project to scan.-Dsonar.test.exclusions=**src/test/**/*.*: The test files to exclude from the scan.-Dsonar.organization=<your-org-key>: Your SonarCloud organization key. Required for SonarCloud Orchestration scans only. Not required for self-hosted SonarQube or SonarCloud Extraction scans.
YAML example
Fail on Severity
Settings
Use this field to add environment variables to your SonarQube scans. For example, you can add proxy settings if your SonarQube instance is behind a proxy.
SonarCloud Organization ID
If you're using SonarCloud, add the following key-value pair under Settings:
product_organization_id
Your SonarCloud organization key (e.g., my-org-key)
This setting is required for both Extraction and Orchestration scans with SonarCloud. It is not required for self-hosted SonarQube.
Additional Configuration
Advanced settings
Proxy settings
View scan results in SonarQube portal
You can access scan results for your targets in the SonarQube portal. These results are organized under projects titled with your target/repository name. Further, you can view scan results specific to branches, PRs, and tags based on the scans performed in STO.
Locate STO scan results in SonarQube portal
Branch scan results: If you scanned a branch, you can find the results in SonarQube with the same branch name.
Pull Request scan results: If you scanned a PR, the results are located under the name
refs/pull/<PR_NUMBER>, where<PR_NUMBER>is the specific number of the pull request.Tag scan results: If you scanned a tag, the results are available with the same tag name.
Set the name for your scans
When using the scan configuration Branch Scan, you can set the naming of the scan as it will appear in the SonarQube portal. This can be configured as follows:
Under Scan Tool, set the Analysis Type to Manual.
Set the Branch Name to the name you want to use for your scan results in the SonarQube portal.
Best practices
You can use Harness expressions to automatically populate values from triggers. For example, you can define the "Branch Name" as <+trigger.sourceBranch>/<+trigger.prNumber>. This will generate a naming convention in the format SOURCE_BRANCH_NAME/PR_NUMBER, which is particularly useful when triggering scans on a specific PR.
This setup ensures that the scan result name reflects both the branch and the PR, making it easier to identify and manage scan results in the SonarQube portal.
View SonarQube quality gate failures
SonarQube quality gate failures will appear in scan results as 'Info' severity issues, with the issue type set to EXTERNAL_POLICY. Additionally, you can apply an OPA policy to fail the pipeline based on the quality gate failures. This can be achieved using the Security Tests - External Policy Failures policy from the security tests policy samples.
To retrieve quality gate failure data from SonarQube, ensure the access token used in the SonarQube step configuration has Browse Project or Administer permissions for the project being scanned.
Configure External Policy Failures
You can configure Harness STO to treat external policy failures as vulnerabilities. To do this, navigate to Account Settings, go to the Default Settings page, select Security Test Orchestration, and click the External Policy Failures setting.
Enable the external policy failures setting to map them to a selected severity level — Critical, High, Medium, or Low to treat them as vulnerabilities instead of Info level issues. This setting takes effect from the next pipeline execution.
View SonarQube code coverage results
SonarQube code coverage data appears in the scan results as Info issues. To locate it, search for Code Coverage within the Info issues, the issue type will be labeled as Code Coverage. Additionally, you can apply an OPA policy to fail the pipeline based on the code coverage results. This can be achieved using the Security Tests - Code Coverage policy from the security tests policy samples.
To retrieve code coverage data from SonarQube, ensure the access token used in the SonarQube step configuration has Browse Project or Administer permissions for the project being scanned.
Generate coverage reports and upload to SonarQube
You can set up your pipeline to generate test coverage reports and then get them pushed up to your SonarQube instance. To do this:
Add a Run step to your pipeline before the SonarQube step.
Set the Image field to a base image that's compatible with the repo you're scanning.
Add commands to install the binary and any other dependencies required to generate the coverage report.
Add the commands necessary to generate the report.
Add a failure strategy to the Run step and configure it to ignore all failures.
This step is required if you want the pipeline to proceed even if it can't generate a coverage report.
Update your SonarQube step with the path to the coverage report.
This step is required only if you saved your report to a non-default folder and/or filename.
To specify the report path, add the CLI argument for the report path to Additional CLI Flags in your SonarQube scan step.
Example: generate a Python coverage report
Here's an example workflow for generating a Python 3.9 coverage report:
Add the Run step.
Set the Image to
python:3.9-alpine.Add commands to install
coverageand any other dependencies required to generate the report.Add a
coveragecommand to generate a coverage report. The specific usage depends on the language and platform.Add a second
coveragecommand to convert the report to a SonarQube-compatible XML report.If the Run step saves the coverage report to a non-default location, add the report path to Additional CLI Flags in your SonarQube scan step. For example:
-Dsonar.python.coverage.reportPaths=/shared/sonarqube/coverage.xml.
Here's what the Run step looks like in YAML:
Troubleshoot Sonar Scans
Can't generate SonarQube report due to shallow clone
Error message:
Shallow clone detected, no blame information will be provided. You can convert to non-shallow with 'git fetch --unshallow'Cause: If the depth setting in your pipeline's codebase configuration is shallow, SonarQube can't generate a report. This is a known SonarQube issue.
Solution: Change the
depthto0.
Add the sonar.projectVersion to a Harness pipeline
In your SonarQube step, declare -Dsonar.projectVersion under Additional CLI Flags.
SonarQube doesn't scan the main branch and pull request branches in the same pipeline
If SonarQube doesn't scan both the main branch and pull request (PR) branches within the same pipeline, it might indicate an issue with the pull request setup in SonarQube.
One potential solution involves configuring conditional arguments within the Harness Platform to handle PR and branch scan requests separately. To implement this solution, you can use conditional executions to run specific steps based on whether it's a PR scan request or a branch scan request. For example, your conditional executions could use JEXL expressions with codebase variables like <+codebase.build.type>=="branch" or <+codebase.build.type>=="pr".
This approach ensures proper configuration and execution of SonarQube scans for both main and PR branches within your pipeline.
Last updated
Was this helpful?