From 59f366609f5a9f959229317f8039cbce99870987 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 -> 3979 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 fc88550..23aceec 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@v4 - 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 - with: - pollingTimeoutSec: 600 - 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@v4 + 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 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 + with: + pollingTimeoutSec: 600 + 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 `pollingTimeoutSec` property in your step, to avoid wasting action minutes per month (see above example). If not provided, the default value of 300s is applied. @@ -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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 wk#I|p4Ht9YS3