From 19888635fa64d24e533d388efe8264402dfd721b Mon Sep 17 00:00:00 2001 From: Marharyta Date: Wed, 8 May 2024 10:35:05 +0200 Subject: [PATCH 01/35] SCSCANGHA-3 Update the condition to detect "build.gradle.kts" files (#71) --- entrypoint.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/entrypoint.sh b/entrypoint.sh index d6922f4..5c26844 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -12,7 +12,7 @@ if [[ -f "${INPUT_PROJECTBASEDIR%/}/pom.xml" ]]; then exit 1 fi -if [[ -f "${INPUT_PROJECTBASEDIR%/}/build.gradle" ]]; then +if [[ -f "${INPUT_PROJECTBASEDIR%/}/build.gradle" || -f "${INPUT_PROJECTBASEDIR%/}/build.gradle.kts" ]]; then echo "Gradle project detected. You should use the SonarQube plugin for Gradle during build rather than using this GitHub Action." exit 1 fi From 0861f01544857d159912c78ca5f7b90d172173d5 Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Mon, 13 May 2024 11:23:03 +0200 Subject: [PATCH 02/35] SCSCANGHA-6 Add Github Actions tests --- .github/workflows/qa.yml | 128 ++++++++++++++++++++ Dockerfile | 1 - test/assertFileContains | 10 ++ test/assertFileExists | 8 ++ test/gradle-project-kotlin/build.gradle.kts | 0 test/gradle-project/build.gradle | 1 + test/maven-project/pom.xml | 1 + 7 files changed, 148 insertions(+), 1 deletion(-) create mode 100644 .github/workflows/qa.yml create mode 100755 test/assertFileContains create mode 100755 test/assertFileExists create mode 100644 test/gradle-project-kotlin/build.gradle.kts create mode 100644 test/gradle-project/build.gradle create mode 100644 test/maven-project/pom.xml diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml new file mode 100644 index 0000000..ab7870f --- /dev/null +++ b/.github/workflows/qa.yml @@ -0,0 +1,128 @@ +name: QA + +on: + push: + branches: + - main + pull_request: + types: [opened, synchronize, reopened] + +jobs: + argsInputTest: + name: > + 'args' input + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action with args + uses: ./ + with: + args: -Dsonar.someArg=aValue -Dsonar.scanner.dumpToFile=./output.properties + env: + SONAR_TOKEN: FAKE_TOKEN + - name: Assert + run: | + ./test/assertFileContains ./output.properties "sonar.someArg=aValue" + projectBaseDirInputTest: + name: > + 'projectBaseDir' input + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - run: | + mkdir -p ./baseDir + - name: Run action with projectBaseDir + uses: ./ + with: + args: -Dsonar.scanner.dumpToFile=./output.properties + projectBaseDir: ./baseDir + env: + SONAR_TOKEN: FAKE_TOKEN + - name: Assert + run: | + ./test/assertFileContains ./output.properties "sonar.projectBaseDir=.*/baseDir" + sonarTokenRequiredTest: + name: > + 'SONAR_TOKEN' env var required + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action without SONAR_TOKEN + uses: ./ + with: + args: -Dsonar.scanner.dumpToFile=./output.properties + continue-on-error: true + - name: Previous should have failed + if: ${{ steps.runTest.outcome == 'success'}} + run: | + echo "Expected previous step to fail" + exit 1 + failFastGradleTest: + name: > + Fail fast on Gradle project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action on Gradle project + id: runTest + uses: ./ + continue-on-error: true + env: + SONAR_TOKEN: FAKE_TOKEN + with: + projectBaseDir: ./test/gradle-project + - name: Previous should have failed + if: ${{ steps.runTest.outcome == 'success'}} + run: | + echo "Expected previous step to fail" + exit 1 + failFastGradleKotlinTest: + name: > + Fail fast on Kotlin Gradle project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action on Kotlin Gradle project + id: runTest + uses: ./ + continue-on-error: true + env: + SONAR_TOKEN: FAKE_TOKEN + with: + projectBaseDir: ./test/gradle-project-kotlin + - name: Previous should have failed + if: ${{ steps.runTest.outcome == 'success'}} + run: | + echo "Expected previous step to fail" + exit 1 + failFastMavenTest: + name: > + Fail fast on Maven project + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action on Maven project + id: runTest + uses: ./ + continue-on-error: true + env: + SONAR_TOKEN: FAKE_TOKEN + with: + projectBaseDir: ./test/maven-project + - name: Previous should have failed + if: ${{ steps.runTest.outcome == 'success'}} + run: | + echo "Expected previous step to fail" + exit 1 diff --git a/Dockerfile b/Dockerfile index 7f0d45f..d7e9d66 100644 --- a/Dockerfile +++ b/Dockerfile @@ -25,4 +25,3 @@ RUN chmod +x /entrypoint.sh COPY cleanup.sh /cleanup.sh RUN chmod +x /cleanup.sh ENTRYPOINT ["/entrypoint.sh"] - diff --git a/test/assertFileContains b/test/assertFileContains new file mode 100755 index 0000000..69380e1 --- /dev/null +++ b/test/assertFileContains @@ -0,0 +1,10 @@ +#!/bin/bash + +error() { echo -e "\\e[31m✗ $*\\e[0m"; } + +assertFileExists $1 + +if ! grep -q $2 $1; then + error "'$2' not found in '$1'" + exit 1 +fi \ No newline at end of file diff --git a/test/assertFileExists b/test/assertFileExists new file mode 100755 index 0000000..8f04686 --- /dev/null +++ b/test/assertFileExists @@ -0,0 +1,8 @@ +#!/bin/bash + +error() { echo -e "\\e[31m✗ $*\\e[0m"; } + +if [ ! -f $1 ]; then + error "File '$1' not found" + exit 1 +fi \ No newline at end of file diff --git a/test/gradle-project-kotlin/build.gradle.kts b/test/gradle-project-kotlin/build.gradle.kts new file mode 100644 index 0000000..e69de29 diff --git a/test/gradle-project/build.gradle b/test/gradle-project/build.gradle new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/test/gradle-project/build.gradle @@ -0,0 +1 @@ + diff --git a/test/maven-project/pom.xml b/test/maven-project/pom.xml new file mode 100644 index 0000000..8b13789 --- /dev/null +++ b/test/maven-project/pom.xml @@ -0,0 +1 @@ + From 3da91d8a6aff5e898114575b30c6dc1e4787a254 Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Thu, 16 May 2024 13:08:11 +0200 Subject: [PATCH 03/35] SCSCANGHA-6 Fix main branch name in GitHub workflow --- .github/workflows/qa.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index ab7870f..7f98e93 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -3,7 +3,7 @@ name: QA on: push: branches: - - main + - master pull_request: types: [opened, synchronize, reopened] From 49689c44074ddbc5afef45d88e4a0f9bcf94e51a Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Mon, 20 May 2024 15:13:57 +0200 Subject: [PATCH 04/35] SCSCANGHA-9 Enable Mend scan --- .cirrus.star | 4 ++++ .cirrus.yml | 35 ++++++++++++++++++++++++++++++++ .cirrus/wss-unified-agent.config | 4 ++++ 3 files changed, 43 insertions(+) create mode 100644 .cirrus.star create mode 100644 .cirrus.yml create mode 100644 .cirrus/wss-unified-agent.config diff --git a/.cirrus.star b/.cirrus.star new file mode 100644 index 0000000..28b17b7 --- /dev/null +++ b/.cirrus.star @@ -0,0 +1,4 @@ +load("github.com/SonarSource/cirrus-modules@v2", "load_features") + +def main(ctx): + return load_features(ctx) diff --git a/.cirrus.yml b/.cirrus.yml new file mode 100644 index 0000000..e2c861c --- /dev/null +++ b/.cirrus.yml @@ -0,0 +1,35 @@ +env: + CIRRUS_VAULT_URL: https://vault.sonar.build:8200 + CIRRUS_VAULT_AUTH_PATH: jwt-cirrusci + CIRRUS_VAULT_ROLE: cirrusci-${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME} + + # Staging image configuration + STAGING_IMAGE_NAME: sonarsource/sonarcloud-github-action + CURRENT_TAG: master + +vm_instance_template: &VM_TEMPLATE + experimental: true # see https://github.com/cirruslabs/cirrus-ci-docs/issues/1051 + image: docker-builder-v* + type: t2.small + region: eu-central-1 + subnet_id: ${CIRRUS_AWS_SUBNET} + disk: 10 + cpu: 4 + memory: 16G + +mend_task: + ec2_instance: + <<: *VM_TEMPLATE + # run only on master and long-term branches + only_if: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_TAG == "" && ($CIRRUS_BRANCH == "master" || $CIRRUS_BRANCH =~ "branch-.*") + env: + MEND_API_KEY: VAULT[development/kv/data/mend data.apikey] + setup_script: + - docker build --tag "${STAGING_IMAGE_NAME}:${CURRENT_TAG}" . + - apt-get remove -y unattended-upgrades + - apt-get update && apt-get install -y --no-install-recommends openjdk-17-jre + - curl -sSL https://unified-agent.s3.amazonaws.com/wss-unified-agent.jar -o wss-unified-agent.jar + - echo "docker.includes=${CURRENT_TAG}" >> .cirrus/wss-unified-agent.config + scan_script: + - echo "Scan the ${STAGING_IMAGE_NAME}:${CURRENT_TAG} image" + - java -jar wss-unified-agent.jar -c .cirrus/wss-unified-agent.config -apiKey $MEND_API_KEY diff --git a/.cirrus/wss-unified-agent.config b/.cirrus/wss-unified-agent.config new file mode 100644 index 0000000..d23b6de --- /dev/null +++ b/.cirrus/wss-unified-agent.config @@ -0,0 +1,4 @@ +docker.projectNameFormat=repositoryNameAndTag +docker.scanImages=true +wss.url=https://saas-eu.whitesourcesoftware.com/agent +productName=GitHubAction/SonarCloudGitHubAction From 1373cf75e259ec3132e780bfb8c6e4bce4fbb80d Mon Sep 17 00:00:00 2001 From: Ari Becker Date: Tue, 21 May 2024 14:50:39 +0300 Subject: [PATCH 05/35] SCSCANGHA-14 Enable debug logging when GitHub Actions debug logging is enabled (#43) --- entrypoint.sh | 8 +++++++- 1 file changed, 7 insertions(+), 1 deletion(-) diff --git a/entrypoint.sh b/entrypoint.sh index 5c26844..664602f 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -20,5 +20,11 @@ fi if [[ -z "${SONARCLOUD_URL}" ]]; then SONARCLOUD_URL="https://sonarcloud.io" fi + +debug_flag='' +if [[ "$RUNNER_DEBUG" == '1' ]]; then + debug_flag=' --debug ' +fi + unset JAVA_HOME -sonar-scanner -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} -Dsonar.host.url=${SONARCLOUD_URL} ${INPUT_ARGS} +sonar-scanner $debug_flag -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} -Dsonar.host.url=${SONARCLOUD_URL} ${INPUT_ARGS} From 714bd356bff7a469fc67bb81ede7cdd0a17371ac Mon Sep 17 00:00:00 2001 From: Istvan Bodo <127833893+istvan-bodo-sonarsource@users.noreply.github.com> Date: Wed, 22 May 2024 09:56:47 +0200 Subject: [PATCH 06/35] SCSCANGHA-15 Add test for scanner debug logging (#77) --- .github/workflows/qa.yml | 18 ++++++++++++++++++ 1 file changed, 18 insertions(+) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 7f98e93..ba76818 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -126,3 +126,21 @@ jobs: run: | echo "Expected previous step to fail" exit 1 + runnerDebugUsedTest: + name: > + 'RUNNER_DEBUG' is used + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action with debug mode + uses: ./ + with: + args: -Dsonar.scanner.dumpToFile=./output.properties + env: + RUNNER_DEBUG: 1 + SONAR_TOKEN: FAKE_TOKEN + - name: Assert + run: | + ./test/assertFileContains ./output.properties "sonar.verbose=true" From f1d5a2ae707b7e1fafb1050fa8e2e9cb75db3d1e Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Mon, 20 May 2024 15:47:23 +0200 Subject: [PATCH 07/35] SCSCANGHA-13 Warning instead of failure for Maven/Gradle projects --- .github/workflows/qa.yml | 34 ++++++++++++++++------------------ entrypoint.sh | 8 ++++---- 2 files changed, 20 insertions(+), 22 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index ba76818..f3af6f1 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -63,9 +63,9 @@ jobs: run: | echo "Expected previous step to fail" exit 1 - failFastGradleTest: + dontFailGradleTest: name: > - Fail fast on Gradle project + Don't fail on Gradle project runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -79,14 +79,13 @@ jobs: SONAR_TOKEN: FAKE_TOKEN with: projectBaseDir: ./test/gradle-project - - name: Previous should have failed - if: ${{ steps.runTest.outcome == 'success'}} + args: -Dsonar.scanner.dumpToFile=./output.properties + - name: Assert run: | - echo "Expected previous step to fail" - exit 1 - failFastGradleKotlinTest: + ./test/assertFileExists ./output.properties + dontFailGradleKotlinTest: name: > - Fail fast on Kotlin Gradle project + Don't fail on Kotlin Gradle project runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -100,14 +99,13 @@ jobs: SONAR_TOKEN: FAKE_TOKEN with: projectBaseDir: ./test/gradle-project-kotlin - - name: Previous should have failed - if: ${{ steps.runTest.outcome == 'success'}} + args: -Dsonar.scanner.dumpToFile=./output.properties + - name: Assert run: | - echo "Expected previous step to fail" - exit 1 - failFastMavenTest: + ./test/assertFileExists ./output.properties + dontFailMavenTest: name: > - Fail fast on Maven project + Don't fail on Maven project runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 @@ -121,11 +119,10 @@ jobs: SONAR_TOKEN: FAKE_TOKEN with: projectBaseDir: ./test/maven-project - - name: Previous should have failed - if: ${{ steps.runTest.outcome == 'success'}} + args: -Dsonar.scanner.dumpToFile=./output.properties + - name: Assert run: | - echo "Expected previous step to fail" - exit 1 + ./test/assertFileExists ./output.properties runnerDebugUsedTest: name: > 'RUNNER_DEBUG' is used @@ -144,3 +141,4 @@ jobs: - name: Assert run: | ./test/assertFileContains ./output.properties "sonar.verbose=true" + diff --git a/entrypoint.sh b/entrypoint.sh index 664602f..9cd1c40 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -8,13 +8,13 @@ if [[ -z "${SONAR_TOKEN}" ]]; then fi if [[ -f "${INPUT_PROJECTBASEDIR%/}/pom.xml" ]]; then - echo "Maven project detected. You should run the goal 'org.sonarsource.scanner.maven:sonar' during build rather than using this GitHub Action." - exit 1 + echo "WARNING! Maven project detected. Sonar recommends running the 'org.sonarsource.scanner.maven:sonar-maven-plugin:sonar' goal during the build process instead of using this GitHub Action + to get more accurate results." fi if [[ -f "${INPUT_PROJECTBASEDIR%/}/build.gradle" || -f "${INPUT_PROJECTBASEDIR%/}/build.gradle.kts" ]]; then - echo "Gradle project detected. You should use the SonarQube plugin for Gradle during build rather than using this GitHub Action." - exit 1 + echo "WARNING! Gradle project detected. Sonar recommends using the SonarQube plugin for Gradle during the build process instead of using this GitHub Action + to get more accurate results." fi if [[ -z "${SONARCLOUD_URL}" ]]; then From a69a8edf1df352adece45acf0c3b810050657eda Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Wed, 22 May 2024 11:17:24 +0200 Subject: [PATCH 08/35] SCSCANGHA-5 Update the base image --- Dockerfile | 9 +++++++-- 1 file changed, 7 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index d7e9d66..3e7aee8 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM sonarsource/sonar-scanner-cli:5.0 +FROM sonarsource/sonar-scanner-cli:10.0 -LABEL version="0.0.1" \ +LABEL version="2.2.0" \ repository="https://github.com/sonarsource/sonarcloud-github-action" \ homepage="https://github.com/sonarsource/sonarcloud-github-action" \ maintainer="SonarSource" \ @@ -19,9 +19,14 @@ ENV LC_ALL="C.UTF-8" WORKDIR /opt +# GitHub actions should be run under ROOT +# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem +USER 0 + # Prepare entrypoint COPY entrypoint.sh /entrypoint.sh RUN chmod +x /entrypoint.sh COPY cleanup.sh /cleanup.sh RUN chmod +x /cleanup.sh + ENTRYPOINT ["/entrypoint.sh"] From d08d592c0b694607865c089cba90bbf87c9a6d89 Mon Sep 17 00:00:00 2001 From: Istvan Bodo <127833893+istvan-bodo-sonarsource@users.noreply.github.com> Date: Thu, 23 May 2024 10:49:51 +0200 Subject: [PATCH 09/35] SCSCANGHA-16 Support passing args with spaces (#79) --- .github/workflows/qa.yml | 5 +++-- entrypoint.sh | 4 +++- 2 files changed, 6 insertions(+), 3 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index f3af6f1..dfe76d6 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -19,12 +19,13 @@ jobs: - name: Run action with args uses: ./ with: - args: -Dsonar.someArg=aValue -Dsonar.scanner.dumpToFile=./output.properties + args: >- + "-Dsonar.someArg=a value with spaces" -Dsonar.scanner.dumpToFile=./output.properties env: SONAR_TOKEN: FAKE_TOKEN - name: Assert run: | - ./test/assertFileContains ./output.properties "sonar.someArg=aValue" + ./test/assertFileContains ./output.properties "sonar.someArg=a value with spaces" projectBaseDirInputTest: name: > 'projectBaseDir' input diff --git a/entrypoint.sh b/entrypoint.sh index 9cd1c40..af68fa6 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -27,4 +27,6 @@ if [[ "$RUNNER_DEBUG" == '1' ]]; then fi unset JAVA_HOME -sonar-scanner $debug_flag -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} -Dsonar.host.url=${SONARCLOUD_URL} ${INPUT_ARGS} + +eval "args=(${INPUT_ARGS})" +sonar-scanner $debug_flag "-Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR}" "-Dsonar.host.url=${SONARCLOUD_URL}" "${args[@]}" From 9c11606f1328e4a0d52d6df7cbe4b21e62b8dfdc Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Thu, 23 May 2024 11:56:27 +0200 Subject: [PATCH 10/35] Use a placeholder for the action version in README --- README.md | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/README.md b/README.md index 52aa45d..356ade0 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ jobs: # Disabling shallow clone is recommended for improving relevancy of reporting fetch-depth: 0 - name: SonarCloud Scan - uses: sonarsource/sonarcloud-github-action@master + uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan env: GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} @@ -57,7 +57,7 @@ jobs: You can change the analysis base directory by using the optional input `projectBaseDir` like this: ```yaml -uses: sonarsource/sonarcloud-github-action@master +uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan with: projectBaseDir: my-custom-directory ``` @@ -66,7 +66,7 @@ In case you need to add additional analysis parameters, you can use the `args` o ```yaml - name: Analyze with SonarCloud - uses: sonarsource/sonarcloud-github-action@master + uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan with: projectBaseDir: my-custom-directory args: > From 4006f663ecaf1f8093e8e4abb9227f6041f52216 Mon Sep 17 00:00:00 2001 From: Bogdana Date: Thu, 9 Feb 2023 14:44:35 +0100 Subject: [PATCH 11/35] SC-6818 drop GH token from README --- README.md | 1 - 1 file changed, 1 deletion(-) diff --git a/README.md b/README.md index 356ade0..fe15a1e 100644 --- a/README.md +++ b/README.md @@ -50,7 +50,6 @@ jobs: - name: SonarCloud Scan uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan env: - GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }} SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} ``` From 13d84ab51ea6fc29e22a1288ec28cc71fd2eb19e Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Thu, 23 May 2024 16:50:14 +0200 Subject: [PATCH 12/35] SCSCANGHA-18 Add workflow to automate tags creation upon release --- .github/workflows/update-tags.yml | 32 +++++++++++++++++++++++++++++++ 1 file changed, 32 insertions(+) create mode 100644 .github/workflows/update-tags.yml diff --git a/.github/workflows/update-tags.yml b/.github/workflows/update-tags.yml new file mode 100644 index 0000000..a07d193 --- /dev/null +++ b/.github/workflows/update-tags.yml @@ -0,0 +1,32 @@ +name: Update Tags + +on: + push: + tags: + - v*.*.* + +jobs: + generate: + runs-on: ubuntu-latest + permissions: + contents: write + + steps: + - name: Checkout + uses: actions/checkout@v4 + + - name: Parse semver + uses: madhead/semver-utils@40bbdc6e50b258c09f35f574e83c51f60d2ce3a2 # v4.0.0 + id: version + with: + version: ${{ github.ref_name }} + + - name: Update tags + run: | + TAGS='v${{ steps.version.outputs.major }} v${{ steps.version.outputs.major }}.${{ steps.version.outputs.minor }}' + + for t in $TAGS; do + git tag -f "$t" + git push origin ":$t" 2>/dev/null || true + git push origin "$t" + done From e44258b109568baa0df60ed515909fc6c72cba92 Mon Sep 17 00:00:00 2001 From: csaba-feher-sonarsource <93765926+csaba-feher-sonarsource@users.noreply.github.com> Date: Thu, 13 Jun 2024 14:34:22 +0200 Subject: [PATCH 13/35] Revert "SCSCANGHA-16 Support passing args with spaces (#79)" (#83) This reverts commit d08d592c0b694607865c089cba90bbf87c9a6d89. --- .github/workflows/qa.yml | 5 ++--- entrypoint.sh | 4 +--- 2 files changed, 3 insertions(+), 6 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index dfe76d6..f3af6f1 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -19,13 +19,12 @@ jobs: - name: Run action with args uses: ./ with: - args: >- - "-Dsonar.someArg=a value with spaces" -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.someArg=aValue -Dsonar.scanner.dumpToFile=./output.properties env: SONAR_TOKEN: FAKE_TOKEN - name: Assert run: | - ./test/assertFileContains ./output.properties "sonar.someArg=a value with spaces" + ./test/assertFileContains ./output.properties "sonar.someArg=aValue" projectBaseDirInputTest: name: > 'projectBaseDir' input diff --git a/entrypoint.sh b/entrypoint.sh index af68fa6..9cd1c40 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -27,6 +27,4 @@ if [[ "$RUNNER_DEBUG" == '1' ]]; then fi unset JAVA_HOME - -eval "args=(${INPUT_ARGS})" -sonar-scanner $debug_flag "-Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR}" "-Dsonar.host.url=${SONARCLOUD_URL}" "${args[@]}" +sonar-scanner $debug_flag -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} -Dsonar.host.url=${SONARCLOUD_URL} ${INPUT_ARGS} From f4a7a62a4338b4becc0a60899ffd56de935dcd42 Mon Sep 17 00:00:00 2001 From: Piotr Idzik <65706193+vil02@users.noreply.github.com> Date: Fri, 12 Jul 2024 10:29:30 +0200 Subject: [PATCH 14/35] NO-JIRA Prevent globbing and word splitting (#84) * Prevent globbing and word splitting * Revert changes in `entrypoint.sh` --- cleanup.sh | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cleanup.sh b/cleanup.sh index 72d5f41..8a5e4c9 100644 --- a/cleanup.sh +++ b/cleanup.sh @@ -10,5 +10,5 @@ fi _tmp_file=$(ls "${INPUT_PROJECTBASEDIR}/" | head -1) PERM=$(stat -c "%u:%g" "${INPUT_PROJECTBASEDIR}/$_tmp_file") -chown -R $PERM "${INPUT_PROJECTBASEDIR}/.scannerwork/" +chown -R "$PERM" "${INPUT_PROJECTBASEDIR}/.scannerwork/" From b7cc8bf2004f4a9ef190137d8831630e9ae5d2e7 Mon Sep 17 00:00:00 2001 From: "antoine.vinot" Date: Fri, 12 Jul 2024 10:17:09 +0200 Subject: [PATCH 15/35] NO-JIRA Bump cirrus module version --- .cirrus.star | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.cirrus.star b/.cirrus.star index 28b17b7..9f91e15 100644 --- a/.cirrus.star +++ b/.cirrus.star @@ -1,4 +1,4 @@ -load("github.com/SonarSource/cirrus-modules@v2", "load_features") +load("github.com/SonarSource/cirrus-modules@v3", "load_features") def main(ctx): return load_features(ctx) From 3bf6e4b720a4d3daa14ada88a4ee5e81d092adab Mon Sep 17 00:00:00 2001 From: Pierre Date: Wed, 24 Jul 2024 18:10:13 +0200 Subject: [PATCH 16/35] test QA with no GITHUB_TOKEN permissions --- .github/workflows/qa.yml | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index f3af6f1..d73c25f 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -12,6 +12,7 @@ jobs: name: > 'args' input runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: @@ -29,6 +30,7 @@ jobs: name: > 'projectBaseDir' input runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: @@ -49,6 +51,7 @@ jobs: name: > 'SONAR_TOKEN' env var required runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: @@ -67,6 +70,7 @@ jobs: name: > Don't fail on Gradle project runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: @@ -87,6 +91,7 @@ jobs: name: > Don't fail on Kotlin Gradle project runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: @@ -107,6 +112,7 @@ jobs: name: > Don't fail on Maven project runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: @@ -127,6 +133,7 @@ jobs: name: > 'RUNNER_DEBUG' is used runs-on: ubuntu-latest + permissions: {} steps: - uses: actions/checkout@v4 with: From f5003fc9688ade81ce47b57a3fa97a8d3f12de4c Mon Sep 17 00:00:00 2001 From: Pierre Date: Wed, 24 Jul 2024 18:16:38 +0200 Subject: [PATCH 17/35] Revert "test QA with no GITHUB_TOKEN permissions" This reverts commit 3bf6e4b720a4d3daa14ada88a4ee5e81d092adab. --- .github/workflows/qa.yml | 7 ------- 1 file changed, 7 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index d73c25f..f3af6f1 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -12,7 +12,6 @@ jobs: name: > 'args' input runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: @@ -30,7 +29,6 @@ jobs: name: > 'projectBaseDir' input runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: @@ -51,7 +49,6 @@ jobs: name: > 'SONAR_TOKEN' env var required runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: @@ -70,7 +67,6 @@ jobs: name: > Don't fail on Gradle project runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: @@ -91,7 +87,6 @@ jobs: name: > Don't fail on Kotlin Gradle project runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: @@ -112,7 +107,6 @@ jobs: name: > Don't fail on Maven project runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: @@ -133,7 +127,6 @@ jobs: name: > 'RUNNER_DEBUG' is used runs-on: ubuntu-latest - permissions: {} steps: - uses: actions/checkout@v4 with: From eb211723266fe8e83102bac7361f0a05c3ac1d1b Mon Sep 17 00:00:00 2001 From: Istvan Bodo <127833893+istvan-bodo-sonarsource@users.noreply.github.com> Date: Tue, 20 Aug 2024 10:54:41 +0200 Subject: [PATCH 18/35] SCSCANGHA-23 Update scanner cli to v11.0 (#90) --- .github/workflows/qa.yml | 14 +++++++------- Dockerfile | 4 ++-- 2 files changed, 9 insertions(+), 9 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index f3af6f1..92c0135 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -19,7 +19,7 @@ jobs: - name: Run action with args uses: ./ with: - args: -Dsonar.someArg=aValue -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.someArg=aValue -Dsonar.scanner.internal.dumpToFile=./output.properties env: SONAR_TOKEN: FAKE_TOKEN - name: Assert @@ -38,7 +38,7 @@ jobs: - name: Run action with projectBaseDir uses: ./ with: - args: -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.scanner.internal.dumpToFile=./output.properties projectBaseDir: ./baseDir env: SONAR_TOKEN: FAKE_TOKEN @@ -56,7 +56,7 @@ jobs: - name: Run action without SONAR_TOKEN uses: ./ with: - args: -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.scanner.internal.dumpToFile=./output.properties continue-on-error: true - name: Previous should have failed if: ${{ steps.runTest.outcome == 'success'}} @@ -79,7 +79,7 @@ jobs: SONAR_TOKEN: FAKE_TOKEN with: projectBaseDir: ./test/gradle-project - args: -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.scanner.internal.dumpToFile=./output.properties - name: Assert run: | ./test/assertFileExists ./output.properties @@ -99,7 +99,7 @@ jobs: SONAR_TOKEN: FAKE_TOKEN with: projectBaseDir: ./test/gradle-project-kotlin - args: -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.scanner.internal.dumpToFile=./output.properties - name: Assert run: | ./test/assertFileExists ./output.properties @@ -119,7 +119,7 @@ jobs: SONAR_TOKEN: FAKE_TOKEN with: projectBaseDir: ./test/maven-project - args: -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.scanner.internal.dumpToFile=./output.properties - name: Assert run: | ./test/assertFileExists ./output.properties @@ -134,7 +134,7 @@ jobs: - name: Run action with debug mode uses: ./ with: - args: -Dsonar.scanner.dumpToFile=./output.properties + args: -Dsonar.scanner.internal.dumpToFile=./output.properties env: RUNNER_DEBUG: 1 SONAR_TOKEN: FAKE_TOKEN diff --git a/Dockerfile b/Dockerfile index 3e7aee8..05ec9e7 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM sonarsource/sonar-scanner-cli:10.0 +FROM sonarsource/sonar-scanner-cli:11.0 -LABEL version="2.2.0" \ +LABEL version="3.0.0" \ repository="https://github.com/sonarsource/sonarcloud-github-action" \ homepage="https://github.com/sonarsource/sonarcloud-github-action" \ maintainer="SonarSource" \ From 2900b02098e8818d13060762140fad033f7b746d Mon Sep 17 00:00:00 2001 From: Samir M Date: Fri, 23 Aug 2024 16:00:06 +0200 Subject: [PATCH 19/35] BUILD-6088 Fix bad link in SECURITY.md file --- SECURITY.md | 13 +++++++++++++ 1 file changed, 13 insertions(+) create mode 100644 SECURITY.md diff --git a/SECURITY.md b/SECURITY.md new file mode 100644 index 0000000..3989705 --- /dev/null +++ b/SECURITY.md @@ -0,0 +1,13 @@ +# Reporting Security Issues + +A mature software vulnerability treatment process is a cornerstone of a robust information security management system. Contributions from the community play an important role in the evolution and security of our products, and in safeguarding the security and privacy of our users. + +If you believe you have discovered a security vulnerability in Sonar's products, we encourage you to report it immediately. + +To responsibly report a security issue, please email us at [security@sonarsource.com](mailto:security@sonarsource.com). Sonar’s security team will acknowledge your report, guide you through the next steps, or request additional information if necessary. Customers with a support contract can also report the vulnerability directly through the support channel. + +For security vulnerabilities found in third-party libraries, please also contact the library's owner or maintainer directly. + +## Responsible Disclosure Policy + +For more information about disclosing a security vulnerability to Sonar, please refer to our community post: [Responsible Vulnerability Disclosure](https://community.sonarsource.com/t/responsible-vulnerability-disclosure/9317). \ No newline at end of file From 383f7e52eae3ab0510c3cb0e7d9d150bbaeab838 Mon Sep 17 00:00:00 2001 From: Julien HENRY Date: Thu, 3 Oct 2024 11:33:42 +0200 Subject: [PATCH 20/35] SCSCANGHA-24 Update the Docker base image to the latest minor 11.1 --- .github/workflows/qa.yml | 20 +++++++++++++++++++- Dockerfile | 4 ++-- entrypoint.sh | 16 ++++++++++------ test/assertFileContains | 5 ++++- test/assertFileExists | 2 ++ 5 files changed, 37 insertions(+), 10 deletions(-) diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index 92c0135..dcf9500 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -141,4 +141,22 @@ jobs: - name: Assert run: | ./test/assertFileContains ./output.properties "sonar.verbose=true" - + overrideSonarcloudUrlTest: + name: > + 'SONARCLOUD_URL' is used + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + with: + token: ${{ secrets.GITHUB_TOKEN }} + - name: Run action with SONARCLOUD_URL + uses: ./ + with: + args: -Dsonar.scanner.internal.dumpToFile=./output.properties + env: + SONARCLOUD_URL: mirror.sonarcloud.io + SONAR_TOKEN: FAKE_TOKEN + - name: Assert + run: | + ./test/assertFileContains ./output.properties "sonar.host.url=mirror.sonarcloud.io" + ./test/assertFileContains ./output.properties "sonar.scanner.sonarcloudUrl=mirror.sonarcloud.io" diff --git a/Dockerfile b/Dockerfile index 05ec9e7..3cc91c6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,6 @@ -FROM sonarsource/sonar-scanner-cli:11.0 +FROM sonarsource/sonar-scanner-cli:11.1 -LABEL version="3.0.0" \ +LABEL version="3.1.0" \ repository="https://github.com/sonarsource/sonarcloud-github-action" \ homepage="https://github.com/sonarsource/sonarcloud-github-action" \ maintainer="SonarSource" \ diff --git a/entrypoint.sh b/entrypoint.sh index 9cd1c40..d8e59e0 100755 --- a/entrypoint.sh +++ b/entrypoint.sh @@ -1,6 +1,8 @@ #!/bin/bash -set -e +set -eo pipefail + +declare -a args=() if [[ -z "${SONAR_TOKEN}" ]]; then echo "Set the SONAR_TOKEN env variable." @@ -17,14 +19,16 @@ if [[ -f "${INPUT_PROJECTBASEDIR%/}/build.gradle" || -f "${INPUT_PROJECTBASEDIR% to get more accurate results." fi -if [[ -z "${SONARCLOUD_URL}" ]]; then - SONARCLOUD_URL="https://sonarcloud.io" +if [[ ${SONARCLOUD_URL} ]]; then + args+=("-Dsonar.scanner.sonarcloudUrl=${SONARCLOUD_URL}") fi -debug_flag='' if [[ "$RUNNER_DEBUG" == '1' ]]; then - debug_flag=' --debug ' + args+=("--debug") fi unset JAVA_HOME -sonar-scanner $debug_flag -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} -Dsonar.host.url=${SONARCLOUD_URL} ${INPUT_ARGS} + +args+=("-Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR}") + +sonar-scanner "${args[@]}" ${INPUT_ARGS} diff --git a/test/assertFileContains b/test/assertFileContains index 69380e1..88a5dd2 100755 --- a/test/assertFileContains +++ b/test/assertFileContains @@ -1,10 +1,13 @@ #!/bin/bash +set -eo pipefail + error() { echo -e "\\e[31m✗ $*\\e[0m"; } -assertFileExists $1 +. ${BASH_SOURCE%/*}/assertFileExists $1 if ! grep -q $2 $1; then error "'$2' not found in '$1'" + cat $1 exit 1 fi \ No newline at end of file diff --git a/test/assertFileExists b/test/assertFileExists index 8f04686..1b7f79a 100755 --- a/test/assertFileExists +++ b/test/assertFileExists @@ -1,5 +1,7 @@ #!/bin/bash +set -eo pipefail + error() { echo -e "\\e[31m✗ $*\\e[0m"; } if [ ! -f $1 ]; then From 9f9bba2c7aaf7a55eac26abbac906c3021d211b2 Mon Sep 17 00:00:00 2001 From: Evgeny Mandrikov <138671+Godin@users.noreply.github.com> Date: Fri, 11 Oct 2024 15:21:47 +0200 Subject: [PATCH 21/35] Recommend to not use this action for analysis of Dart code --- README.md | 1 + 1 file changed, 1 insertion(+) diff --git a/README.md b/README.md index fe15a1e..c0a4606 100644 --- a/README.md +++ b/README.md @@ -114,6 +114,7 @@ Want to see more examples of SonarCloud in action? You can [explore current Open * Your code is built with Gradle: use the SonarQube plugin for Gradle during the build * You want to analyze a .NET solution: Follow our interactive tutorial for GitHub Actions after importing your project directly into SonarCloud * You want to analyze C and C++ code: rely on our [SonarCloud Scan for C and C++](https://github.com/marketplace/actions/sonarcloud-scan-for-c-and-c) and look at [our sample C and C++ project](https://github.com/sonarsource-cfamily-examples?q=gh-actions-sc&type=all&language=&sort=) +* You want to analyze Dart code: use [SonarScanner CLI](https://docs.sonarsource.com/sonarcloud/advanced-setup/ci-based-analysis/sonarscanner-cli/) during the build ## Have questions or feedback? From 982992a35a56c6bebd7c76c65e5c3e4c18e634c8 Mon Sep 17 00:00:00 2001 From: Pavel Mikula Date: Wed, 27 Nov 2024 14:29:52 +0100 Subject: [PATCH 22/35] Add Jira integration --- .github/PULL_REQUEST_TEMPLATE.md | 7 ++++++ .github/workflows/PullRequestClosed.yml | 29 +++++++++++++++++++++++ .github/workflows/PullRequestCreated.yml | 29 +++++++++++++++++++++++ .github/workflows/RequestReview.yml | 28 ++++++++++++++++++++++ .github/workflows/SubmitReview.yml | 30 ++++++++++++++++++++++++ 5 files changed, 123 insertions(+) create mode 100644 .github/PULL_REQUEST_TEMPLATE.md create mode 100644 .github/workflows/PullRequestClosed.yml create mode 100644 .github/workflows/PullRequestCreated.yml create mode 100644 .github/workflows/RequestReview.yml create mode 100644 .github/workflows/SubmitReview.yml diff --git a/.github/PULL_REQUEST_TEMPLATE.md b/.github/PULL_REQUEST_TEMPLATE.md new file mode 100644 index 0000000..4ae3727 --- /dev/null +++ b/.github/PULL_REQUEST_TEMPLATE.md @@ -0,0 +1,7 @@ +Part of + diff --git a/.github/workflows/PullRequestClosed.yml b/.github/workflows/PullRequestClosed.yml new file mode 100644 index 0000000..b50896e --- /dev/null +++ b/.github/workflows/PullRequestClosed.yml @@ -0,0 +1,29 @@ +name: Pull Request Closed + +on: + pull_request: + types: [closed] + +jobs: + PullRequestMerged_job: + name: Pull Request Merged + runs-on: ubuntu-latest + permissions: + id-token: write + pull-requests: read + # For external PR, ticket should be moved manually + if: | + github.event.pull_request.head.repo.full_name == github.repository + && github.event.pull_request.merged + steps: + - id: secrets + uses: SonarSource/vault-action-wrapper@v3 + with: + secrets: | + development/kv/data/jira user | JIRA_USER; + development/kv/data/jira token | JIRA_TOKEN; + - uses: sonarsource/gh-action-lt-backlog/PullRequestClosed@v2 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + jira-user: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_USER }} + jira-token: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_TOKEN }} diff --git a/.github/workflows/PullRequestCreated.yml b/.github/workflows/PullRequestCreated.yml new file mode 100644 index 0000000..fc20e4a --- /dev/null +++ b/.github/workflows/PullRequestCreated.yml @@ -0,0 +1,29 @@ +name: Pull Request Created + +on: + pull_request: + types: ["opened"] + +jobs: + PullRequestCreated_job: + name: Pull Request Created + runs-on: ubuntu-latest + permissions: + id-token: write + # For external PR, ticket should be created manually + if: | + github.event.pull_request.head.repo.full_name == github.repository + steps: + - id: secrets + uses: SonarSource/vault-action-wrapper@v3 + with: + secrets: | + development/github/token/{REPO_OWNER_NAME_DASH}-jira token | GITHUB_TOKEN; + development/kv/data/jira user | JIRA_USER; + development/kv/data/jira token | JIRA_TOKEN; + - uses: sonarsource/gh-action-lt-backlog/PullRequestCreated@v2 + with: + github-token: ${{ fromJSON(steps.secrets.outputs.vault).GITHUB_TOKEN }} + jira-user: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_USER }} + jira-token: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_TOKEN }} + jira-project: SCSCANGHA diff --git a/.github/workflows/RequestReview.yml b/.github/workflows/RequestReview.yml new file mode 100644 index 0000000..5eac0d5 --- /dev/null +++ b/.github/workflows/RequestReview.yml @@ -0,0 +1,28 @@ +name: Request review + +on: + pull_request: + types: ["review_requested"] + +jobs: + RequestReview_job: + name: Request review + runs-on: ubuntu-latest + permissions: + id-token: write + # For external PR, ticket should be moved manually + if: | + github.event.pull_request.head.repo.full_name == github.repository + steps: + - id: secrets + uses: SonarSource/vault-action-wrapper@v3 + with: + secrets: | + development/github/token/{REPO_OWNER_NAME_DASH}-jira token | GITHUB_TOKEN; + development/kv/data/jira user | JIRA_USER; + development/kv/data/jira token | JIRA_TOKEN; + - uses: sonarsource/gh-action-lt-backlog/RequestReview@v2 + with: + github-token: ${{ fromJSON(steps.secrets.outputs.vault).GITHUB_TOKEN }} + jira-user: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_USER }} + jira-token: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_TOKEN }} diff --git a/.github/workflows/SubmitReview.yml b/.github/workflows/SubmitReview.yml new file mode 100644 index 0000000..d5f22e6 --- /dev/null +++ b/.github/workflows/SubmitReview.yml @@ -0,0 +1,30 @@ +name: Submit Review + +on: + pull_request_review: + types: [submitted] + +jobs: + SubmitReview_job: + name: Submit Review + runs-on: ubuntu-latest + permissions: + id-token: write + pull-requests: read + # For external PR, ticket should be moved manually + if: | + github.event.pull_request.head.repo.full_name == github.repository + && (github.event.review.state == 'changes_requested' + || github.event.review.state == 'approved') + steps: + - id: secrets + uses: SonarSource/vault-action-wrapper@v3 + with: + secrets: | + development/kv/data/jira user | JIRA_USER; + development/kv/data/jira token | JIRA_TOKEN; + - uses: sonarsource/gh-action-lt-backlog/SubmitReview@v2 + with: + github-token: ${{secrets.GITHUB_TOKEN}} + jira-user: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_USER }} + jira-token: ${{ fromJSON(steps.secrets.outputs.vault).JIRA_TOKEN }} From 48d9e10f8a0c9c63a55ab961986769bd8a750032 Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Thu, 31 Oct 2024 18:40:29 +0100 Subject: [PATCH 23/35] SCSCANGHA-25 Replace the Docker action by a composite action forwarding to the SonarQube action --- .github/workflows/qa.yml | 127 +++++--------------- Dockerfile | 32 ----- README.md | 11 +- action.yml | 36 ++++-- cleanup.sh | 14 --- entrypoint.sh | 34 ------ test/assertFileDoesntExist | 8 ++ test/gradle-project-kotlin/build.gradle.kts | 0 test/gradle-project/build.gradle | 1 - test/maven-project/pom.xml | 1 - 10 files changed, 76 insertions(+), 188 deletions(-) delete mode 100644 Dockerfile delete mode 100644 cleanup.sh delete mode 100755 entrypoint.sh create mode 100755 test/assertFileDoesntExist delete mode 100644 test/gradle-project-kotlin/build.gradle.kts delete mode 100644 test/gradle-project/build.gradle delete mode 100644 test/maven-project/pom.xml diff --git a/.github/workflows/qa.yml b/.github/workflows/qa.yml index dcf9500..5fc2cbf 100644 --- a/.github/workflows/qa.yml +++ b/.github/workflows/qa.yml @@ -11,7 +11,10 @@ jobs: argsInputTest: name: > 'args' input - runs-on: ubuntu-latest + strategy: + matrix: + os: [ ubuntu-latest, windows-latest, macos-latest ] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: @@ -28,7 +31,10 @@ jobs: projectBaseDirInputTest: name: > 'projectBaseDir' input - runs-on: ubuntu-latest + strategy: + matrix: + os: [ ubuntu-latest, windows-latest, macos-latest ] + runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 with: @@ -45,118 +51,51 @@ jobs: - name: Assert run: | ./test/assertFileContains ./output.properties "sonar.projectBaseDir=.*/baseDir" - sonarTokenRequiredTest: + scannerVersionTest: name: > - 'SONAR_TOKEN' env var required - runs-on: ubuntu-latest + 'scannerVersion' input + runs-on: ubuntu-latest # assumes default RUNNER_ARCH for linux is X64 steps: - uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - - name: Run action without SONAR_TOKEN + - name: Run action with scannerVersion uses: ./ with: + scannerVersion: 6.1.0.4477 args: -Dsonar.scanner.internal.dumpToFile=./output.properties - continue-on-error: true - - name: Previous should have failed - if: ${{ steps.runTest.outcome == 'success'}} - run: | - echo "Expected previous step to fail" - exit 1 - dontFailGradleTest: - name: > - Don't fail on Gradle project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run action on Gradle project - id: runTest - uses: ./ - continue-on-error: true env: - SONAR_TOKEN: FAKE_TOKEN - with: - projectBaseDir: ./test/gradle-project - args: -Dsonar.scanner.internal.dumpToFile=./output.properties + NO_CACHE: true # force install-sonar-scanner-cli.sh execution + SONAR_HOST_URL: http://not_actually_used + SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}' - name: Assert run: | - ./test/assertFileExists ./output.properties - dontFailGradleKotlinTest: + ./test/assertFileExists "$RUNNER_TEMP/sonarscanner/sonar-scanner-cli-6.1.0.4477-linux-x64.zip" + scannerBinariesUrlTest: name: > - Don't fail on Kotlin Gradle project - runs-on: ubuntu-latest + 'scannerBinariesUrl' input with invalid URL + runs-on: ubuntu-latest # assumes default RUNNER_ARCH for linux is X64 steps: - uses: actions/checkout@v4 with: token: ${{ secrets.GITHUB_TOKEN }} - - name: Run action on Kotlin Gradle project + - name: Run action with scannerBinariesUrl id: runTest uses: ./ continue-on-error: true - env: - SONAR_TOKEN: FAKE_TOKEN with: - projectBaseDir: ./test/gradle-project-kotlin - args: -Dsonar.scanner.internal.dumpToFile=./output.properties - - name: Assert - run: | - ./test/assertFileExists ./output.properties - dontFailMavenTest: - name: > - Don't fail on Maven project - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run action on Maven project - id: runTest - uses: ./ - continue-on-error: true + scannerVersion: 6.2.1.4610 + scannerBinariesUrl: https://invalid_uri/Distribution/sonar-scanner-cli env: - SONAR_TOKEN: FAKE_TOKEN - with: - projectBaseDir: ./test/maven-project - args: -Dsonar.scanner.internal.dumpToFile=./output.properties - - name: Assert - run: | - ./test/assertFileExists ./output.properties - runnerDebugUsedTest: - name: > - 'RUNNER_DEBUG' is used - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run action with debug mode - uses: ./ - with: - args: -Dsonar.scanner.internal.dumpToFile=./output.properties - env: - RUNNER_DEBUG: 1 - SONAR_TOKEN: FAKE_TOKEN - - name: Assert + NO_CACHE: true # force install-sonar-scanner-cli.sh execution + SONAR_HOST_URL: http://not_actually_used + SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}' + - name: Fail if action succeeded + if: steps.runTest.outcome == 'success' + run: exit 1 + - name: Assert Sonar Scanner CLI was not downloaded run: | - ./test/assertFileContains ./output.properties "sonar.verbose=true" - overrideSonarcloudUrlTest: - name: > - 'SONARCLOUD_URL' is used - runs-on: ubuntu-latest - steps: - - uses: actions/checkout@v4 - with: - token: ${{ secrets.GITHUB_TOKEN }} - - name: Run action with SONARCLOUD_URL - uses: ./ - with: - args: -Dsonar.scanner.internal.dumpToFile=./output.properties - env: - SONARCLOUD_URL: mirror.sonarcloud.io - SONAR_TOKEN: FAKE_TOKEN - - name: Assert + ./test/assertFileDoesntExist "$RUNNER_TEMP/sonarscanner/sonar-scanner-cli-6.2.1.4610-linux-x64.zip" + - name: Assert Sonar Scanner CLI was not executed run: | - ./test/assertFileContains ./output.properties "sonar.host.url=mirror.sonarcloud.io" - ./test/assertFileContains ./output.properties "sonar.scanner.sonarcloudUrl=mirror.sonarcloud.io" + ./test/assertFileDoesntExist ./output.properties diff --git a/Dockerfile b/Dockerfile deleted file mode 100644 index 3cc91c6..0000000 --- a/Dockerfile +++ /dev/null @@ -1,32 +0,0 @@ -FROM sonarsource/sonar-scanner-cli:11.1 - -LABEL version="3.1.0" \ - repository="https://github.com/sonarsource/sonarcloud-github-action" \ - homepage="https://github.com/sonarsource/sonarcloud-github-action" \ - maintainer="SonarSource" \ - com.github.actions.name="SonarCloud Scan" \ - com.github.actions.description="Scan your code with SonarCloud to detect bugs, vulnerabilities and code smells in more than 25 programming languages." \ - com.github.actions.icon="check" \ - com.github.actions.color="green" - -ARG SONAR_SCANNER_HOME=/opt/sonar-scanner -ARG NODEJS_HOME=/opt/nodejs - -ENV PATH=${PATH}:${SONAR_SCANNER_HOME}/bin:${NODEJS_HOME}/bin - -# set up local envs in order to allow for special chars (non-asci) in filenames -ENV LC_ALL="C.UTF-8" - -WORKDIR /opt - -# GitHub actions should be run under ROOT -# https://docs.github.com/en/actions/using-github-hosted-runners/about-github-hosted-runners/about-github-hosted-runners#docker-container-filesystem -USER 0 - -# Prepare entrypoint -COPY entrypoint.sh /entrypoint.sh -RUN chmod +x /entrypoint.sh -COPY cleanup.sh /cleanup.sh -RUN chmod +x /cleanup.sh - -ENTRYPOINT ["/entrypoint.sh"] diff --git a/README.md b/README.md index c0a4606..99428e9 100644 --- a/README.md +++ b/README.md @@ -81,6 +81,14 @@ In case you need to add additional analysis parameters, you can use the `args` o More information about possible analysis parameters is found in the documentation at: https://docs.sonarcloud.io/advanced-setup/analysis-parameters +In case you need to specify the version of the Sonar Scanner, you can use the `scannerVersion` option: + +```yaml +uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan +with: + scannerVersion: 6.2.0.4584 +``` + See also example configurations at: https://github.com/sonarsource/sonarcloud-github-action-samples/ @@ -114,7 +122,6 @@ Want to see more examples of SonarCloud in action? You can [explore current Open * Your code is built with Gradle: use the SonarQube plugin for Gradle during the build * You want to analyze a .NET solution: Follow our interactive tutorial for GitHub Actions after importing your project directly into SonarCloud * You want to analyze C and C++ code: rely on our [SonarCloud Scan for C and C++](https://github.com/marketplace/actions/sonarcloud-scan-for-c-and-c) and look at [our sample C and C++ project](https://github.com/sonarsource-cfamily-examples?q=gh-actions-sc&type=all&language=&sort=) -* You want to analyze Dart code: use [SonarScanner CLI](https://docs.sonarsource.com/sonarcloud/advanced-setup/ci-based-analysis/sonarscanner-cli/) during the build ## Have questions or feedback? @@ -122,6 +129,4 @@ To provide feedback (requesting a feature or reporting a bug) please post on the ## License -The Dockerfile and associated scripts and documentation in this project are released under the LGPLv3 License. - Container images built with this project include third-party materials. diff --git a/action.yml b/action.yml index de11390..9573796 100644 --- a/action.yml +++ b/action.yml @@ -1,20 +1,38 @@ name: SonarCloud Scan description: > - Scan your code with SonarCloud to detect bugs, vulnerabilities and code smells - in 26+ programming languages. + Scan your code with SonarQube Cloud to detect coding issues in 30+ + languages, frameworks, and IaC platforms. + The solution also provides fix recommendations leveraging AI with + Sonar's AI CodeFix capability. (Formerly SonarCloud) branding: icon: check color: green -runs: - using: docker - image: Dockerfile - entrypoint: "/entrypoint.sh" - post-entrypoint: "/cleanup.sh" inputs: args: - description: Additional arguments to the sonarcloud scanner + description: Additional arguments to the Sonar Scanner CLI required: false projectBaseDir: description: Set the sonar.projectBaseDir analysis property required: false - default: . + scannerVersion: + description: Version of the Sonar Scanner CLI to use + required: false + default: 6.2.1.4610 + scannerBinariesUrl: + description: URL to download the Sonar Scanner CLI binaries from + required: false + default: https://binaries.sonarsource.com/Distribution/sonar-scanner-cli +runs: + using: "composite" + steps: + - name: Deprecation warning + shell: bash + run: | + echo "::warning title=SonarScanner::This action is deprecated and will be removed in a future release. Please use the sonarqube-scan-action action instead. The sonarqube-scan-action is a drop-in replacement for this action." + - name: SonarQube Cloud Scan + uses: SonarSource/sonarqube-scan-action@v4.1.0 + with: + args: ${{ inputs.args }} + projectBaseDir: ${{ inputs.projectBaseDir }} + scannerVersion: ${{ inputs.scannerVersion }} + scannerBinariesUrl: ${{ inputs.scannerBinariesUrl }} diff --git a/cleanup.sh b/cleanup.sh deleted file mode 100644 index 8a5e4c9..0000000 --- a/cleanup.sh +++ /dev/null @@ -1,14 +0,0 @@ -#!/bin/bash - -set -e - -if [ ! -d "${INPUT_PROJECTBASEDIR}/.scannerwork" ]; then - echo ".scannerwork directory not found; nothing to clean up." - exit -fi - -_tmp_file=$(ls "${INPUT_PROJECTBASEDIR}/" | head -1) -PERM=$(stat -c "%u:%g" "${INPUT_PROJECTBASEDIR}/$_tmp_file") - -chown -R "$PERM" "${INPUT_PROJECTBASEDIR}/.scannerwork/" - diff --git a/entrypoint.sh b/entrypoint.sh deleted file mode 100755 index d8e59e0..0000000 --- a/entrypoint.sh +++ /dev/null @@ -1,34 +0,0 @@ -#!/bin/bash - -set -eo pipefail - -declare -a args=() - -if [[ -z "${SONAR_TOKEN}" ]]; then - echo "Set the SONAR_TOKEN env variable." - exit 1 -fi - -if [[ -f "${INPUT_PROJECTBASEDIR%/}/pom.xml" ]]; then - echo "WARNING! Maven project detected. Sonar recommends running the 'org.sonarsource.scanner.maven:sonar-maven-plugin:sonar' goal during the build process instead of using this GitHub Action - to get more accurate results." -fi - -if [[ -f "${INPUT_PROJECTBASEDIR%/}/build.gradle" || -f "${INPUT_PROJECTBASEDIR%/}/build.gradle.kts" ]]; then - echo "WARNING! Gradle project detected. Sonar recommends using the SonarQube plugin for Gradle during the build process instead of using this GitHub Action - to get more accurate results." -fi - -if [[ ${SONARCLOUD_URL} ]]; then - args+=("-Dsonar.scanner.sonarcloudUrl=${SONARCLOUD_URL}") -fi - -if [[ "$RUNNER_DEBUG" == '1' ]]; then - args+=("--debug") -fi - -unset JAVA_HOME - -args+=("-Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR}") - -sonar-scanner "${args[@]}" ${INPUT_ARGS} diff --git a/test/assertFileDoesntExist b/test/assertFileDoesntExist new file mode 100755 index 0000000..032a07c --- /dev/null +++ b/test/assertFileDoesntExist @@ -0,0 +1,8 @@ +#!/bin/bash + +error() { echo -e "\\e[31m✗ $*\\e[0m"; } + +if [ -f $1 ]; then + error "File '$1' found" + exit 1 +fi \ No newline at end of file diff --git a/test/gradle-project-kotlin/build.gradle.kts b/test/gradle-project-kotlin/build.gradle.kts deleted file mode 100644 index e69de29..0000000 diff --git a/test/gradle-project/build.gradle b/test/gradle-project/build.gradle deleted file mode 100644 index 8b13789..0000000 --- a/test/gradle-project/build.gradle +++ /dev/null @@ -1 +0,0 @@ - diff --git a/test/maven-project/pom.xml b/test/maven-project/pom.xml deleted file mode 100644 index 8b13789..0000000 --- a/test/maven-project/pom.xml +++ /dev/null @@ -1 +0,0 @@ - From 4afec8845b1f72780b5e4dcb03ce8338fce48f9c Mon Sep 17 00:00:00 2001 From: Antonio Aversa Date: Tue, 19 Nov 2024 10:29:09 +0100 Subject: [PATCH 24/35] SCSCANGHA-28 Rebranding --- README.md | 133 ++++++++++++--------- action.yml | 2 +- images/SQ_Logo_Cloud_Dark_Backgrounds.png | Bin 0 -> 21928 bytes images/SQ_Logo_Cloud_Light_Backgrounds.png | Bin 0 -> 23073 bytes images/SonarCloud-72px.png | Bin 3735 -> 0 bytes images/SonarCloud-analysis-in-Checks.png | Bin 96420 -> 0 bytes 6 files changed, 77 insertions(+), 58 deletions(-) create mode 100644 images/SQ_Logo_Cloud_Dark_Backgrounds.png create mode 100644 images/SQ_Logo_Cloud_Light_Backgrounds.png delete mode 100644 images/SonarCloud-72px.png delete mode 100644 images/SonarCloud-analysis-in-Checks.png diff --git a/README.md b/README.md index 99428e9..7a40440 100644 --- a/README.md +++ b/README.md @@ -1,131 +1,150 @@ -# Analyze your code for free with SonarCloud +# Scan your code with SonarQube Cloud [![QA](https://github.com/SonarSource/sonarcloud-github-action/actions/workflows/qa.yml/badge.svg)](https://github.com/SonarSource/sonarcloud-github-action/actions/workflows/qa.yml) -This SonarSource project, available as a GitHub Action, scans your projects with SonarCloud, and helps developers produce -[Clean Code](https://www.sonarsource.com/solutions/clean-code/?utm_medium=referral&utm_source=github&utm_campaign=clean-code&utm_content=sonarqube-scan-action). +> [!WARNING] +> This action is deprecated and will be removed in a future release. +> Please use the `sonarqube-scan-action` action instead. +> The `sonarqube-scan-action` is a drop-in replacement for this action. - +This SonarSource project, available as a GitHub Action, scans your projects with SonarQube [Cloud](https://www.sonarsource.com/products/sonarcloud/). -[SonarCloud](https://www.sonarsource.com/products/sonarcloud/) is a widely used static analysis solution for continuous code quality and security inspection. -It helps developers identify and fix issues in their code that could lead to bugs, vulnerabilities, or decreased development velocity. -SonarCloud supports the most popular programming languages, including Java, JavaScript, TypeScript, C#, Python, C, C++, and [many more](https://www.sonarsource.com/knowledge/languages/). +![Logo](./images/SQ_Logo_Cloud_Dark_Backgrounds.png#gh-dark-mode-only) +![Logo](./images/SQ_Logo_Cloud_Light_Backgrounds.png#gh-light-mode-only) + +SonarQube [Cloud](https://www.sonarsource.com/products/sonarcloud/) (formerly SonarCloud) is a widely used static analysis solution for continuous code quality and security inspection. + +It helps developers detect coding issues in 30+ languages, frameworks, and IaC platforms, including Java, JavaScript, TypeScript, C#, Python, C, C++, and [many more](https://www.sonarsource.com/knowledge/languages/). + +The solution also provides fix recommendations leveraging AI with Sonar's AI CodeFix capability. ## Requirements -* Create your account on SonarCloud. Sign up for free now if it's not already the case! [SonarCloud Sign up](https://www.sonarsource.com/products/sonarcloud/signup/?utm_medium=referral&utm_source=github&utm_campaign=sc-signup&utm_content=signup-sonarcloud-listing-x-x&utm_term=ww-psp-x) -* The repository to analyze is set up on SonarCloud. [Set it up](https://sonarcloud.io/projects/create) in just one click. +* Create your account on SonarQube Cloud. [Sign up for free](https://www.sonarsource.com/products/sonarcloud/signup/?utm_medium=referral&utm_source=github&utm_campaign=sc-signup&utm_content=signup-sonarcloud-listing-x-x&utm_term=ww-psp-x) now if it's not already the case! +* The repository to analyze is set up on SonarQube Cloud. [Set it up](https://sonarcloud.io/projects/create) in just one click. ## Usage Project metadata, including the location of the sources to be analyzed, must be declared in the file `sonar-project.properties` in the base directory: ```properties -sonar.organization= -sonar.projectKey= +sonar.organization= +sonar.projectKey= # relative paths to source directories. More details and properties are described -# in https://sonarcloud.io/documentation/project-administration/narrowing-the-focus/ +# at https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/analysis-scope/ sonar.sources=. ``` -The workflow, usually declared in `.github/workflows/build.yml`, looks like: +The workflow, usually declared under `.github/workflows`, looks like: ```yaml on: - # Trigger analysis when pushing in master or pull requests, and when creating - # a pull request. + # Trigger analysis when pushing to your main branches, and when creating a pull request. push: branches: + - main - master + - develop + - 'releases/**' pull_request: types: [opened, synchronize, reopened] + name: Main Workflow jobs: - sonarcloud: + sonarqube: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 with: - # Disabling shallow clone is recommended for improving relevancy of reporting + # Disabling shallow clones is recommended for improving the relevancy of reporting fetch-depth: 0 - - name: SonarCloud Scan - uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan + - name: SonarQube Scan + uses: sonarsource/sonarcloud-github-action@ # Ex: v4.0.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan env: SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} ``` +## Action parameters + You can change the analysis base directory by using the optional input `projectBaseDir` like this: ```yaml -uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan -with: - projectBaseDir: my-custom-directory +- uses: sonarsource/sonarcloud-github-action@ + with: + projectBaseDir: app/src +``` + +In case you need to specify the version of the Sonar Scanner, you can use the `scannerVersion` option: + +```yaml +- uses: sonarsource/sonarcloud-github-action@ + with: + scannerVersion: 6.2.0.4584 ``` -In case you need to add additional analysis parameters, you can use the `args` option: +In case you need to add additional analysis parameters, and you do not wish to set them in the `sonar-project.properties` file, you can use the `args` option: ```yaml -- name: Analyze with SonarCloud - uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan +- uses: sonarsource/sonarcloud-github-action@ with: - projectBaseDir: my-custom-directory + projectBaseDir: app/src args: > -Dsonar.organization=my-organization -Dsonar.projectKey=my-projectkey -Dsonar.python.coverage.reportPaths=coverage.xml -Dsonar.sources=lib/ - -Dsonar.test.exclusions=tests/** -Dsonar.tests=tests/ + -Dsonar.test.exclusions=tests/** -Dsonar.verbose=true ``` -More information about possible analysis parameters is found in the documentation at: -https://docs.sonarcloud.io/advanced-setup/analysis-parameters - -In case you need to specify the version of the Sonar Scanner, you can use the `scannerVersion` option: +You can also specify the URL where to retrieve the SonarScanner CLI from. +The specified URL overrides the default address: `https://binaries.sonarsource.com/Distribution/sonar-scanner-cli`. +This can be useful when the runner executing the action is self-hosted and has regulated or no access to the Internet: ```yaml -uses: sonarsource/sonarcloud-github-action@ # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/sonarcloud-scan -with: - scannerVersion: 6.2.0.4584 +- uses: sonarsource/sonarcloud-github-action@ + with: + scannerBinariesUrl: https://my.custom.binaries.url.com/Distribution/sonar-scanner-cli/ ``` -See also example configurations at: -https://github.com/sonarsource/sonarcloud-github-action-samples/ +More information about possible analysis parameters can be found in the [Analysis parameters page](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/analysis-parameters/) of the SonarQube Cloud documentation. -### Secrets +### Environment variables -- `SONAR_TOKEN` – **Required** this is the token used to authenticate access to SonarCloud. You can generate a token on your [Security page in SonarCloud](https://sonarcloud.io/account/security/). You can set the `SONAR_TOKEN` environment variable in the "Secrets" settings page of your repository. +- `SONAR_TOKEN` – **Required** this is the token used to authenticate access to SonarQube. You can read more about security tokens in the [documentation](https://docs.sonarsource.com/sonarqube-cloud/managing-your-account/managing-tokens/). 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). - *`GITHUB_TOKEN` – Provided by Github (see [Authenticating with the GITHUB_TOKEN](https://help.github.com/en/actions/automating-your-workflow-with-github-actions/authenticating-with-the-github_token)).* +- `SONAR_ROOT_CERT` – Holds an additional certificate (in PEM format) that is used to validate the certificate of a secured proxy to SonarQube Cloud. 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). -## Error cleaning up workspace +Here is an example of how you can pass a certificate (in PEM format) to the Scanner truststore: -In some cases, the checkout action may fail to clean up the workspace. This is a known problem for GitHub actions implemented as a docker container (such as `sonarcloud-github-actions`) when self-hosted runners are used. -Example of the error message: `File was unable to be removed Error: EACCES: permission denied, unlink '/actions-runner/_work//project/.scannerwork/.sonar_lock'` -To work around the problem, `sonarcloud-github-action` attempts to fix the permission of the temporary files that it creates. If that doesn't work, you can manually clean up the workspace by running the following action: -``` -- name: Clean the workspace - uses: docker://alpine - with: - args: /bin/sh -c "find \"${GITHUB_WORKSPACE}\" -mindepth 1 ! -name . -prune -exec rm -rf {} +" +```yaml +- uses: sonarsource/sonarcloud-github-action@ + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + SONAR_ROOT_CERT: ${{ secrets.SONAR_ROOT_CERT }} ``` -You can find more info [here](https://github.com/actions/runner/issues/434). -## Example of pull request analysis +If your source code file names contain special characters that are not covered by the locale range of `en_US.UTF-8`, you can configure your desired locale like this: - +```yaml +- uses: sonarsource/sonarcloud-github-action@ + env: + SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }} + LC_ALL: "ru_RU.UTF-8" +``` -Want to see more examples of SonarCloud in action? You can [explore current Open Source projects in SonarCloud](https://sonarcloud.io/explore/projects?sort=-analysis_date?utm_medium=referral&utm_source=github&utm_campaign=sc-signup&utm_content=signup-sonarcloud-listing-x-x&utm_term=ww-psp-x) that are using the Clean as You Code methodology. +## Alternatives for Java, .NET, and C/C++ projects -## Do not use this GitHub action if you are in the following situations +This GitHub Action will not work for all technologies. If you are in one of the following situations, you should use the following alternatives: -* Your code is built with Maven: run 'org.sonarsource.scanner.maven:sonar' during the build -* Your code is built with Gradle: use the SonarQube plugin for Gradle during the build -* You want to analyze a .NET solution: Follow our interactive tutorial for GitHub Actions after importing your project directly into SonarCloud -* You want to analyze C and C++ code: rely on our [SonarCloud Scan for C and C++](https://github.com/marketplace/actions/sonarcloud-scan-for-c-and-c) and look at [our sample C and C++ project](https://github.com/sonarsource-cfamily-examples?q=gh-actions-sc&type=all&language=&sort=) +* Your code is built with Maven. Read the documentation about our [SonarScanner for Maven](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/ci-based-analysis/sonarscanner-for-maven/). +* Your code is built with Gradle. Read the documentation about our [SonarScanner for Gradle](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/ci-based-analysis/sonarscanner-for-gradle/). +* You want to analyze a .NET solution. Read the documentation about our [SonarScanner for .NET](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/ci-based-analysis/sonarscanner-for-dotnet/introduction/). +* You want to analyze C or C++ code. Starting from SonarQube 10.6, this GitHub Action will scan C and C++ out of the box. If you want to have better control over the scan configuration/setup, you can switch to the [SonarQube Cloud Scan for C and C++](https://github.com/marketplace/actions/sonarcloud-scan-for-c-and-c) GitHub Action - look at [our sample C and C++ project](https://github.com/sonarsource-cfamily-examples?q=gh-actions-sc&type=all&language=&sort=). ## Have questions or feedback? -To provide feedback (requesting a feature or reporting a bug) please post on the [SonarSource Community Forum](https://community.sonarsource.com/) with the tag `sonarcloud`. +To provide feedback (requesting a feature or reporting a bug) please post on the [SonarSource Community Forum](https://community.sonarsource.com/tags/c/help/sc/9/github-actions). ## License diff --git a/action.yml b/action.yml index 9573796..f4d07e9 100644 --- a/action.yml +++ b/action.yml @@ -1,4 +1,4 @@ -name: SonarCloud Scan +name: SonarQube Cloud Scan description: > Scan your code with SonarQube Cloud to detect coding issues in 30+ languages, frameworks, and IaC platforms. diff --git a/images/SQ_Logo_Cloud_Dark_Backgrounds.png b/images/SQ_Logo_Cloud_Dark_Backgrounds.png new file mode 100644 index 0000000000000000000000000000000000000000..9e9a1f41fbee273783b6a7d7ab70eca31d1cb103 GIT binary patch literal 21928 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 R@|EL?cl1njOKv)Z{|~^DYvup| literal 0 HcmV?d00001 diff --git a/images/SQ_Logo_Cloud_Light_Backgrounds.png b/images/SQ_Logo_Cloud_Light_Backgrounds.png new file mode 100644 index 0000000000000000000000000000000000000000..4a7f25ef944058ce6f86ee030af45739b8a8314f GIT binary patch literal 23073 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 HIK28Fw3+~m literal 0 HcmV?d00001 diff --git a/images/SonarCloud-72px.png b/images/SonarCloud-72px.png deleted file mode 100644 index 98ce8c1da0763aa83b8d9cbd12c377aa21524ab1..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 3735 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 diff --git a/images/SonarCloud-analysis-in-Checks.png b/images/SonarCloud-analysis-in-Checks.png deleted file mode 100644 index 2f025a4b8764d83cf2215d5ede992cebd030da1e..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 96420 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 Date: Thu, 5 Dec 2024 09:13:10 +0100 Subject: [PATCH 25/35] Shorten description and remove mend docker check --- .cirrus.star | 4 ---- .cirrus.yml | 35 ----------------------------------- action.yml | 4 +--- 3 files changed, 1 insertion(+), 42 deletions(-) delete mode 100644 .cirrus.star delete mode 100644 .cirrus.yml diff --git a/.cirrus.star b/.cirrus.star deleted file mode 100644 index 9f91e15..0000000 --- a/.cirrus.star +++ /dev/null @@ -1,4 +0,0 @@ -load("github.com/SonarSource/cirrus-modules@v3", "load_features") - -def main(ctx): - return load_features(ctx) diff --git a/.cirrus.yml b/.cirrus.yml deleted file mode 100644 index e2c861c..0000000 --- a/.cirrus.yml +++ /dev/null @@ -1,35 +0,0 @@ -env: - CIRRUS_VAULT_URL: https://vault.sonar.build:8200 - CIRRUS_VAULT_AUTH_PATH: jwt-cirrusci - CIRRUS_VAULT_ROLE: cirrusci-${CIRRUS_REPO_OWNER}-${CIRRUS_REPO_NAME} - - # Staging image configuration - STAGING_IMAGE_NAME: sonarsource/sonarcloud-github-action - CURRENT_TAG: master - -vm_instance_template: &VM_TEMPLATE - experimental: true # see https://github.com/cirruslabs/cirrus-ci-docs/issues/1051 - image: docker-builder-v* - type: t2.small - region: eu-central-1 - subnet_id: ${CIRRUS_AWS_SUBNET} - disk: 10 - cpu: 4 - memory: 16G - -mend_task: - ec2_instance: - <<: *VM_TEMPLATE - # run only on master and long-term branches - only_if: $CIRRUS_USER_COLLABORATOR == 'true' && $CIRRUS_TAG == "" && ($CIRRUS_BRANCH == "master" || $CIRRUS_BRANCH =~ "branch-.*") - env: - MEND_API_KEY: VAULT[development/kv/data/mend data.apikey] - setup_script: - - docker build --tag "${STAGING_IMAGE_NAME}:${CURRENT_TAG}" . - - apt-get remove -y unattended-upgrades - - apt-get update && apt-get install -y --no-install-recommends openjdk-17-jre - - curl -sSL https://unified-agent.s3.amazonaws.com/wss-unified-agent.jar -o wss-unified-agent.jar - - echo "docker.includes=${CURRENT_TAG}" >> .cirrus/wss-unified-agent.config - scan_script: - - echo "Scan the ${STAGING_IMAGE_NAME}:${CURRENT_TAG} image" - - java -jar wss-unified-agent.jar -c .cirrus/wss-unified-agent.config -apiKey $MEND_API_KEY diff --git a/action.yml b/action.yml index f4d07e9..4ea3284 100644 --- a/action.yml +++ b/action.yml @@ -1,9 +1,7 @@ name: SonarQube Cloud Scan description: > Scan your code with SonarQube Cloud to detect coding issues in 30+ - languages, frameworks, and IaC platforms. - The solution also provides fix recommendations leveraging AI with - Sonar's AI CodeFix capability. (Formerly SonarCloud) + languages. (Formerly SonarCloud) branding: icon: check color: green From f1700773ebdb6efe6b3f8a5cf66150027dda8f5e Mon Sep 17 00:00:00 2001 From: Pierre Date: Fri, 7 Feb 2025 16:38:10 +0100 Subject: [PATCH 26/35] SCSCANGHA-37 Update CODEOWNERS (#100) --- .github/CODEOWNERS | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 3f43f0d..e182dab 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1 +1 @@ -.github/CODEOWNERS @sonarsource/analysis-experience-squad +.github/CODEOWNERS @sonarsource/orchestration-processing-squad From 0f7db2562533d56de798d35cbff6263db1b33728 Mon Sep 17 00:00:00 2001 From: Tudgwal Date: Wed, 19 Feb 2025 17:08:18 +0100 Subject: [PATCH 27/35] fix dockerfile --- Dockerfile | 28 ++++++++++++++++++++++++++++ 1 file changed, 28 insertions(+) create mode 100644 Dockerfile diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..6df3f94 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,28 @@ +FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 + +LABEL version="0.0.1" \ + repository="https://github.com/sonarsource/sonarcloud-github-action" \ + homepage="https://github.com/sonarsource/sonarcloud-github-action" \ + maintainer="SonarSource" \ + com.github.actions.name="SonarCloud Scan" \ + com.github.actions.description="Scan your code with SonarCloud to detect bugs, vulnerabilities and code smells in more than 25 programming languages." \ + com.github.actions.icon="check" \ + com.github.actions.color="green" + +ARG SONAR_SCANNER_HOME=/opt/sonar-scanner +ARG NODEJS_HOME=/opt/nodejs + +ENV PATH=${PATH}:${SONAR_SCANNER_HOME}/bin:${NODEJS_HOME}/bin + +# set up local envs in order to allow for special chars (non-asci) in filenames +ENV LC_ALL="C.UTF-8" + +WORKDIR /opt + +# https://help.github.com/en/actions/creating-actions/dockerfile-support-for-github-actions#user +USER root + +# Prepare entrypoint +COPY entrypoint.sh /entrypoint.sh +RUN chmod +x /entrypoint.sh +ENTRYPOINT ["/entrypoint.sh"] From 8afd7b3509bc7cbafc9666d59e4015090ea7f6a1 Mon Sep 17 00:00:00 2001 From: Yohann Fabri <11197007+YoranSys@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:04:08 +0200 Subject: [PATCH 28/35] Update Dockerfile --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index 6df3f94..5c8aa2a 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,3 +1,6 @@ +ARG CACHE_DOCKER_REGISTRY_URL +ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT + FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 LABEL version="0.0.1" \ From c241aa337db04aa453dcb0503c5b62e31271e6c9 Mon Sep 17 00:00:00 2001 From: Yohann Fabri <11197007+YoranSys@users.noreply.github.com> Date: Mon, 18 Sep 2023 16:23:43 +0200 Subject: [PATCH 29/35] Permit usage of CACHE_DOCKER_REGISTRY_URL --- Dockerfile | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Dockerfile b/Dockerfile index 5c8aa2a..4896cff 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,5 @@ -ARG CACHE_DOCKER_REGISTRY_URL -ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT +ARG CACHE_DOCKER_REGISTRY_URL="harbor.harbor:80/" +ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 From 16568989440de1254dfff2d29a1897ff4f87b78f Mon Sep 17 00:00:00 2001 From: Yohann Fabri <11197007+YoranSys@users.noreply.github.com> Date: Mon, 18 Dec 2023 09:35:50 -0400 Subject: [PATCH 30/35] Update harbor url --- Dockerfile | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Dockerfile b/Dockerfile index 4896cff..1975b15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,4 +1,4 @@ -ARG CACHE_DOCKER_REGISTRY_URL="harbor.harbor:80/" +ARG CACHE_DOCKER_REGISTRY_URL="harbor.tech.padam.io:443/" ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 From 74060975931c08fb483f0ae9fdb5026bd721aafe Mon Sep 17 00:00:00 2001 From: Tudgwal Date: Wed, 19 Feb 2025 17:15:15 +0100 Subject: [PATCH 31/35] fix dockerfile --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index 1975b15..3908a26 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,9 @@ +<<<<<<< HEAD ARG CACHE_DOCKER_REGISTRY_URL="harbor.tech.padam.io:443/" ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" +======= +>>>>>>> 0f7db25 (fix dockerfile) FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 LABEL version="0.0.1" \ From 097540eee79dfb84f05ffa1f5f84e6773469d83e Mon Sep 17 00:00:00 2001 From: Tudgwal Date: Wed, 19 Feb 2025 17:15:29 +0100 Subject: [PATCH 32/35] fix dockerfile --- Dockerfile | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/Dockerfile b/Dockerfile index 3908a26..314a146 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,9 +1,15 @@ <<<<<<< HEAD +<<<<<<< HEAD ARG CACHE_DOCKER_REGISTRY_URL="harbor.tech.padam.io:443/" ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" ======= >>>>>>> 0f7db25 (fix dockerfile) +======= +ARG CACHE_DOCKER_REGISTRY_URL +ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT + +>>>>>>> 8afd7b3 (Update Dockerfile) FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 LABEL version="0.0.1" \ From 942b03475630e33dd2e2f0703384777eab923519 Mon Sep 17 00:00:00 2001 From: Tudgwal Date: Wed, 19 Feb 2025 17:15:42 +0100 Subject: [PATCH 33/35] fix dockerfile --- Dockerfile | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/Dockerfile b/Dockerfile index 314a146..e278baf 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,5 +1,6 @@ <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD ARG CACHE_DOCKER_REGISTRY_URL="harbor.tech.padam.io:443/" ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" @@ -8,6 +9,10 @@ ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" ======= ARG CACHE_DOCKER_REGISTRY_URL ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT +======= +ARG CACHE_DOCKER_REGISTRY_URL="harbor.harbor:80/" +ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" +>>>>>>> c241aa3 (Permit usage of CACHE_DOCKER_REGISTRY_URL) >>>>>>> 8afd7b3 (Update Dockerfile) FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 From 3cd51807429f8ff114a509e2e21dea53947ce086 Mon Sep 17 00:00:00 2001 From: Tudgwal Date: Wed, 19 Feb 2025 17:15:57 +0100 Subject: [PATCH 34/35] fix dockerfile --- Dockerfile | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Dockerfile b/Dockerfile index e278baf..62ed7b6 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,6 +1,9 @@ <<<<<<< HEAD <<<<<<< HEAD <<<<<<< HEAD +<<<<<<< HEAD +======= +>>>>>>> 1656898 (Update harbor url) ARG CACHE_DOCKER_REGISTRY_URL="harbor.tech.padam.io:443/" ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" From 93152165602c20c1e7ab744467fe491ba91e5bf2 Mon Sep 17 00:00:00 2001 From: Tudgwal Date: Wed, 19 Feb 2025 17:23:58 +0100 Subject: [PATCH 35/35] fix dockerfile --- Dockerfile | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/Dockerfile b/Dockerfile index 62ed7b6..1975b15 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,23 +1,6 @@ -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -<<<<<<< HEAD -======= ->>>>>>> 1656898 (Update harbor url) ARG CACHE_DOCKER_REGISTRY_URL="harbor.tech.padam.io:443/" ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" -======= ->>>>>>> 0f7db25 (fix dockerfile) -======= -ARG CACHE_DOCKER_REGISTRY_URL -ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT -======= -ARG CACHE_DOCKER_REGISTRY_URL="harbor.harbor:80/" -ARG CACHE_DOCKER_REGISTRY_PROXY_PROJECT="library/" ->>>>>>> c241aa3 (Permit usage of CACHE_DOCKER_REGISTRY_URL) - ->>>>>>> 8afd7b3 (Update Dockerfile) FROM ${CACHE_DOCKER_REGISTRY_URL}${CACHE_DOCKER_REGISTRY_PROXY_PROJECT}sonarsource/sonar-scanner-cli:5.0 LABEL version="0.0.1" \