From 8aed7b3cb142c960c1e13d0ce8d3b8a632cf5cef Mon Sep 17 00:00:00 2001 From: 7PH Date: Fri, 15 Nov 2024 11:26:28 +0100 Subject: [PATCH] SQQGGHA-9 Use new SonarQube (Server, Cloud) product names --- README.md | 73 +++++++++++++++--------------- action.yml | 4 +- images/SonarQube-72px.png | Bin 9894 -> 0 bytes images/SonarQubeServer.png | Bin 0 -> 8124 bytes script/check-quality-gate.sh | 4 +- test/check-quality-gate-test.bats | 4 +- 6 files changed, 42 insertions(+), 43 deletions(-) delete mode 100644 images/SonarQube-72px.png create mode 100644 images/SonarQubeServer.png diff --git a/README.md b/README.md index 58a5a51..ab21e0d 100644 --- a/README.md +++ b/README.md @@ -1,10 +1,10 @@ -# SonarQube Quality Gate check [![QA](https://github.com/SonarSource/sonarqube-quality-gate-action/actions/workflows/run-qa.yml/badge.svg)](https://github.com/SonarSource/sonarqube-quality-gate-action/actions/workflows/run-qa.yml) +# SonarQube Server Quality Gate check [![QA](https://github.com/SonarSource/sonarqube-quality-gate-action/actions/workflows/run-qa.yml/badge.svg)](https://github.com/SonarSource/sonarqube-quality-gate-action/actions/workflows/run-qa.yml) -Check the Quality Gate of your code with [SonarQube](https://www.sonarqube.org/) to ensure your code meets your own quality standards before you release or deploy new features. +Check the Quality Gate of your code with [SonarQube Server](https://www.sonarsource.com/products/sonarqube/) to ensure your code meets your own quality standards before you release or deploy new features. - + -SonarQube is the leading product for Continuous Code Quality & Code Security. It supports most popular programming languages, including Java, JavaScript, TypeScript, C#, Python, C, C++, and many more. +SonarQube Server is the leading product for Continuous Code Quality & Code Security. It supports most popular programming languages, including Java, JavaScript, TypeScript, C#, Python, C, C++, and many more. ## Requirements @@ -19,44 +19,43 @@ The workflow YAML file will usually look something like this:: ```yaml on: # Trigger analysis when pushing in master or pull requests, and when creating - # a pull request. + # a pull request. push: branches: - master pull_request: - types: [opened, synchronize, reopened] + types: [opened, synchronize, reopened] name: Main Workflow jobs: sonarqube: runs-on: ubuntu-latest steps: - - uses: actions/checkout@v3 - with: - # Disabling shallow clone is recommended for improving relevancy of reporting. - fetch-depth: 0 - - # Triggering SonarQube analysis as results of it are required by Quality Gate check. - - name: SonarQube Scan - uses: sonarsource/sonarqube-scan-action@master - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} - - # Check the Quality Gate status. - - name: SonarQube Quality Gate check - id: sonarqube-quality-gate-check - uses: sonarsource/sonarqube-quality-gate-action@master - # Force to fail step after specific time. - timeout-minutes: 5 - env: - SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} - SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} #OPTIONAL - - # Optionally you can use the output from the Quality Gate in another step. - # The possible outputs of the `quality-gate-status` variable are `PASSED`, `WARN` or `FAILED`. - - name: "Example show SonarQube Quality Gate Status value" - run: echo "The Quality Gate status is ${{ steps.sonarqube-quality-gate-check.outputs.quality-gate-status }}" - + - uses: actions/checkout@v3 + with: + # Disabling shallow clone is recommended for improving relevancy of reporting. + fetch-depth: 0 + + # Triggering SonarQube Server analysis as results of it are required by Quality Gate check. + - name: SonarQube Server Scan + uses: sonarsource/sonarqube-scan-action@master + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} + + # Check the Quality Gate status. + - name: SonarQube Server Quality Gate check + id: sonarqube-quality-gate-check + uses: sonarsource/sonarqube-quality-gate-action@master + # Force to fail step after specific time. + timeout-minutes: 5 + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }} #OPTIONAL + + # Optionally you can use the output from the Quality Gate in another step. + # The possible outputs of the `quality-gate-status` variable are `PASSED`, `WARN` or `FAILED`. + - name: "Example show SonarQube Server Quality Gate Status value" + run: echo "The Quality Gate status is ${{ steps.sonarqube-quality-gate-check.outputs.quality-gate-status }}" ``` Make sure to set up `timeout-minutes` property in your step, to avoid wasting action minutes per month (see above example). @@ -72,7 +71,7 @@ Typically, report metadata file for different scanners can vary and can be locat Example usage: ```yaml -- name: SonarQube Quality Gate check +- name: SonarQube Server Quality Gate check uses: sonarsource/sonarqube-quality-gate-action@master with: scanMetadataReportFile: target/sonar/report-task.txt @@ -80,11 +79,11 @@ Example usage: ### Environment variables -- `SONAR_TOKEN` – **Required** this is the token used to authenticate access to SonarQube. You can read more about security tokens [here](https://docs.sonarqube.org/latest/user-guide/user-token/). You can set the `SONAR_TOKEN` environment variable in the "Secrets" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). +- `SONAR_TOKEN` – **Required** this is the token used to authenticate access to SonarQube Server. You can read more about security tokens [here](https://docs.sonarqube.org/latest/user-guide/user-token/). You can set the `SONAR_TOKEN` environment variable in the "Secrets" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). -- `SONAR_HOST_URL` – **Optional** this tells the scanner where SonarQube is hosted, otherwise it will get the one from the scan report. You can set the `SONAR_HOST_URL` environment variable in the "Secrets" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). +- `SONAR_HOST_URL` – **Optional** this tells the scanner where SonarQube Server is hosted, otherwise it will get the one from the scan report. You can set the `SONAR_HOST_URL` environment variable in the "Secrets" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). -- `SONAR_ROOT_CERT` – Holds an additional root certificate (in PEM format) that is used to validate the SonarQube server certificate. You can set the `SONAR_ROOT_CERT` environment variable in the "Secrets" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). +- `SONAR_ROOT_CERT` – Holds an additional root certificate (in PEM format) that is used to validate the SonarQube Server certificate. You can set the `SONAR_ROOT_CERT` environment variable in the "Secrets" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). ## Quality Gate check run diff --git a/action.yml b/action.yml index 5f932ba..574a7bf 100644 --- a/action.yml +++ b/action.yml @@ -1,4 +1,4 @@ -name: SonarQube Quality Gate Check +name: SonarQube Server Quality Gate Check description: > Check if a project / analysis passed the Quality Gate check branding: @@ -16,7 +16,7 @@ inputs: required: false default: .scannerwork/report-task.txt pollingTimeoutSec: - description: "The maximum time (in seconds) to poll for SonarQube's Quality Gate status. Default: 300." + description: "The maximum time (in seconds) to poll for SonarQube Server's Quality Gate status. Default: 300." required: false default: "300" outputs: diff --git a/images/SonarQube-72px.png b/images/SonarQube-72px.png deleted file mode 100644 index ab7712b8f08047fbd37c3e199bf2e47e0d16e27a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 9894 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