Compare commits
45 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
1b442ee39a | ||
|
|
f4eddd92b8 | ||
|
|
7b13cfe195 | ||
|
|
1f659fabd3 | ||
|
|
05ca09c2da | ||
|
|
6440c73982 | ||
|
|
94d4f8ac4a | ||
|
|
13990a6956 | ||
|
|
66a0baa492 | ||
|
|
884b79409b | ||
|
|
f885e52a75 | ||
|
|
2af7c4bea3 | ||
|
|
0c0f3958d9 | ||
|
|
8c8682dac7 | ||
|
|
bfafdf2896 | ||
|
|
aecaf43ae5 | ||
|
|
540792c588 | ||
|
|
e56fc172a4 | ||
|
|
94ac847096 | ||
|
|
86fe817756 | ||
|
|
44de84c3e8 | ||
|
|
8c56bc3994 | ||
|
|
e4c4bdc17f | ||
|
|
16be80a080 | ||
|
|
968b486245 | ||
|
|
320b72385a | ||
|
|
fed3555e67 | ||
|
|
9bea6a46af | ||
|
|
d3ca1743de | ||
|
|
0c14a18753 | ||
|
|
f8003d5a3a | ||
|
|
04623c1cb1 | ||
|
|
be64f35726 | ||
|
|
6abcb2537c | ||
|
|
53c3e3207f | ||
|
|
9ad16418d1 | ||
|
|
74e7b4f998 | ||
|
|
1b9d398800 | ||
|
|
ccaf9efb11 | ||
|
|
69c1a75940 | ||
|
|
4b0bfc149f | ||
|
|
9cc4f58b79 | ||
|
|
5829c57497 | ||
|
|
d57dba2a10 | ||
|
|
427bad7016 |
4
.cirrus/wss-unified-agent.config
Normal file
4
.cirrus/wss-unified-agent.config
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
docker.projectNameFormat=repositoryNameAndTag
|
||||||
|
docker.scanImages=true
|
||||||
|
wss.url=https://saas-eu.whitesourcesoftware.com/agent
|
||||||
|
productName=GitHubAction/SonarQubeScanAction
|
||||||
2
.github/CODEOWNERS
vendored
2
.github/CODEOWNERS
vendored
@@ -1 +1 @@
|
|||||||
.github/CODEOWNERS @sonarsource/sonarqube-team
|
.github/CODEOWNERS @sonarsource/analysis-experience-squad
|
||||||
|
|||||||
16
.github/dependabot.yml
vendored
Normal file
16
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
# To get started with Dependabot version updates, you'll need to specify which
|
||||||
|
# package ecosystems to update and where the package manifests are located.
|
||||||
|
# Please see the documentation for all configuration options:
|
||||||
|
# https://docs.github.com/github/administering-a-repository/configuration-options-for-dependency-updates
|
||||||
|
|
||||||
|
version: 2
|
||||||
|
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
timezone: "CET"
|
||||||
|
open-pull-requests-limit: 100
|
||||||
|
commit-message:
|
||||||
|
prefix: "NO-JIRA "
|
||||||
13
.github/qa-nginx-redirecting/compose.yml
vendored
Normal file
13
.github/qa-nginx-redirecting/compose.yml
vendored
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
services:
|
||||||
|
https-proxy:
|
||||||
|
image: nginx
|
||||||
|
ports:
|
||||||
|
- 8080:8080
|
||||||
|
volumes:
|
||||||
|
- $GITHUB_WORKSPACE/.github/qa-nginx-redirecting/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "--fail", "localhost:8080/health"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 20
|
||||||
|
start_period: 2m
|
||||||
32
.github/qa-nginx-redirecting/nginx.conf
vendored
Normal file
32
.github/qa-nginx-redirecting/nginx.conf
vendored
Normal file
@@ -0,0 +1,32 @@
|
|||||||
|
user nginx;
|
||||||
|
worker_processes auto;
|
||||||
|
|
||||||
|
error_log /var/log/nginx/error.log notice;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
include /etc/nginx/conf.d/*.conf;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 8080;
|
||||||
|
|
||||||
|
location /health {
|
||||||
|
add_header 'Content-Type' 'text/plain';
|
||||||
|
return 200 "healthy\n";
|
||||||
|
}
|
||||||
|
|
||||||
|
location ~ /clientRedirectToSonarBinaries/(.*) {
|
||||||
|
return 301 "https://binaries.sonarsource.com/Distribution/sonar-scanner-cli/$1";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
26
.github/qa-sq-behind-ngix/compose.yml
vendored
Normal file
26
.github/qa-sq-behind-ngix/compose.yml
vendored
Normal file
@@ -0,0 +1,26 @@
|
|||||||
|
services:
|
||||||
|
sonarqube:
|
||||||
|
image: sonarqube:lts-community
|
||||||
|
ports:
|
||||||
|
- 9000:9000
|
||||||
|
healthcheck:
|
||||||
|
test: 'grep -Fq "SonarQube is operational" /opt/sonarqube/logs/sonar.log'
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 20
|
||||||
|
start_period: 2m
|
||||||
|
|
||||||
|
https-proxy:
|
||||||
|
image: nginx
|
||||||
|
ports:
|
||||||
|
- 4443:4443
|
||||||
|
volumes:
|
||||||
|
- $GITHUB_WORKSPACE/.github/qa-sq-behind-ngix/nginx.conf:/etc/nginx/nginx.conf:ro
|
||||||
|
- $GITHUB_WORKSPACE/.github/qa-sq-behind-ngix/server.crt:/etc/nginx/server.crt:ro
|
||||||
|
- $GITHUB_WORKSPACE/.github/qa-sq-behind-ngix/server.key:/etc/nginx/server.key:ro
|
||||||
|
healthcheck:
|
||||||
|
test: ["CMD", "curl", "--fail", "localhost:8080/health"]
|
||||||
|
interval: 10s
|
||||||
|
timeout: 5s
|
||||||
|
retries: 20
|
||||||
|
start_period: 2m
|
||||||
43
.github/qa-sq-behind-ngix/nginx.conf
vendored
Normal file
43
.github/qa-sq-behind-ngix/nginx.conf
vendored
Normal file
@@ -0,0 +1,43 @@
|
|||||||
|
user nginx;
|
||||||
|
worker_processes auto;
|
||||||
|
|
||||||
|
error_log /var/log/nginx/error.log notice;
|
||||||
|
|
||||||
|
events {
|
||||||
|
worker_connections 1024;
|
||||||
|
}
|
||||||
|
|
||||||
|
http {
|
||||||
|
include /etc/nginx/mime.types;
|
||||||
|
default_type application/octet-stream;
|
||||||
|
|
||||||
|
sendfile on;
|
||||||
|
|
||||||
|
keepalive_timeout 65;
|
||||||
|
|
||||||
|
include /etc/nginx/conf.d/*.conf;
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 8080;
|
||||||
|
|
||||||
|
location /health {
|
||||||
|
add_header 'Content-Type' 'text/plain';
|
||||||
|
return 200 "healthy\n";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
server {
|
||||||
|
listen 4443 ssl;
|
||||||
|
|
||||||
|
ssl_protocols TLSv1.1 TLSv1.2;
|
||||||
|
ssl_certificate /etc/nginx/server.crt;
|
||||||
|
ssl_certificate_key /etc/nginx/server.key;
|
||||||
|
|
||||||
|
location / {
|
||||||
|
proxy_pass http://sonarqube:9000;
|
||||||
|
proxy_set_header Host $host;
|
||||||
|
proxy_set_header X-Forwarded-For $remote_addr;
|
||||||
|
proxy_set_header X-Forwarded-Proto https;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
615
.github/workflows/qa.yml
vendored
615
.github/workflows/qa.yml
vendored
@@ -1,18 +1,621 @@
|
|||||||
name: QA
|
name: QA
|
||||||
|
|
||||||
on: [push, pull_request]
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- master
|
||||||
|
pull_request:
|
||||||
|
types: [opened, synchronize, reopened]
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
run_qa:
|
noInputsTest:
|
||||||
|
name: >
|
||||||
|
No inputs
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
with:
|
with:
|
||||||
token: ${{ secrets.GITHUB_TOKEN }}
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
- run: ./test/run-qa.sh
|
- name: Run action with args
|
||||||
timeout-minutes: 5
|
uses: ./
|
||||||
|
env:
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileContains ./output.properties "sonar.projectBaseDir=."
|
||||||
|
argsInputTest:
|
||||||
|
name: >
|
||||||
|
'args' input
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Run action with args
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
args: -Dsonar.someArg=aValue -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
env:
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileContains ./output.properties "sonar.someArg=aValue"
|
||||||
|
projectBaseDirInputTest:
|
||||||
|
name: >
|
||||||
|
'projectBaseDir' input
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- run: mkdir -p ./baseDir
|
||||||
|
- name: Run action with projectBaseDir
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
projectBaseDir: ./baseDir
|
||||||
|
env:
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileContains ./output.properties "sonar.projectBaseDir=.*/baseDir"
|
||||||
|
scannerVersionTest:
|
||||||
|
name: >
|
||||||
|
'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 with scannerVersion
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
scannerVersion: 6.1.0.4477
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
env:
|
||||||
|
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 "$RUNNER_TEMP/sonarscanner/sonar-scanner-cli-6.1.0.4477-linux-x64.zip"
|
||||||
|
scannerBinariesUrlTest:
|
||||||
|
name: >
|
||||||
|
'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 with scannerBinariesUrl
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
scannerVersion: 6.2.1.4610
|
||||||
|
scannerBinariesUrl: https://invalid_uri/Distribution/sonar-scanner-cli
|
||||||
|
env:
|
||||||
|
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/assertFileDoesntExist "$RUNNER_TEMP/sonarscanner/sonar-scanner-cli-6.2.1.4610-linux-x64.zip"
|
||||||
|
- name: Assert Sonar Scanner CLI was not executed
|
||||||
|
run: |
|
||||||
|
./test/assertFileDoesntExist ./output.properties
|
||||||
|
scannerBinariesUrlIsEscapedWithWget:
|
||||||
|
name: >
|
||||||
|
'scannerBinariesUrl' is escaped with wget so special chars are not injected in the download command
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Run action with scannerBinariesUrl
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
scannerBinariesUrl: 'http://some_uri;touch file.txt;'
|
||||||
|
env:
|
||||||
|
NO_CACHE: true
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output1.properties"}'
|
||||||
|
- name: Assert file.txt does not exist
|
||||||
|
run: |
|
||||||
|
./test/assertFileDoesntExist "$RUNNER_TEMP/sonarscanner/file.txt"
|
||||||
|
scannerBinariesUrlIsEscapedWithCurl:
|
||||||
|
name: >
|
||||||
|
'scannerBinariesUrl' is escaped with curl so special chars are not injected in the download command
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Remove wget
|
||||||
|
run: sudo apt-get remove -y wget
|
||||||
|
- name: Assert wget is not available
|
||||||
|
run: |
|
||||||
|
if command -v wget 2>&1 >/dev/null
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Run action with scannerBinariesUrl
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
continue-on-error: true
|
||||||
|
with:
|
||||||
|
scannerBinariesUrl: 'http://some_uri http://another_uri''; touch file.txt;'
|
||||||
|
env:
|
||||||
|
NO_CACHE: true
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output1.properties"}'
|
||||||
|
- name: Assert file.txt does not exist
|
||||||
|
run: |
|
||||||
|
./test/assertFileDoesntExist "$RUNNER_TEMP/sonarscanner/file.txt"
|
||||||
|
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_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
with:
|
||||||
|
projectBaseDir: ./test/gradle-project
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ./output.properties
|
||||||
|
dontFailGradleKotlinTest:
|
||||||
|
name: >
|
||||||
|
Don't fail 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_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
with:
|
||||||
|
projectBaseDir: ./test/gradle-project
|
||||||
|
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
|
||||||
|
env:
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
with:
|
||||||
|
projectBaseDir: ./test/maven-project
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ./output.properties
|
||||||
|
runAnalysisTest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
services:
|
services:
|
||||||
sonarqube:
|
sonarqube:
|
||||||
image: sonarqube:8.9-community
|
image: sonarqube:lts-community
|
||||||
ports:
|
ports:
|
||||||
- 9000:9000
|
- 9000:9000
|
||||||
|
volumes:
|
||||||
|
- sonarqube_data:/opt/sonarqube/data
|
||||||
|
- sonarqube_logs:/opt/sonarqube/logs
|
||||||
|
- sonarqube_extensions:/opt/sonarqube/extensions
|
||||||
|
options: >-
|
||||||
|
--health-cmd "grep -Fq \"SonarQube is operational\" /opt/sonarqube/logs/sonar.log"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 10
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Run action on sample project
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
SONAR_HOST_URL: http://localhost:9000
|
||||||
|
with:
|
||||||
|
args: -Dsonar.login=admin -Dsonar.password=admin
|
||||||
|
projectBaseDir: ./test/example-project
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ./test/example-project/.scannerwork/report-task.txt
|
||||||
|
runnerDebugUsedTest:
|
||||||
|
name: >
|
||||||
|
'RUNNER_DEBUG' is used
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
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_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileContains ./output.properties "sonar.verbose=true"
|
||||||
|
runAnalysisWithCacheTest:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
services:
|
||||||
|
sonarqube:
|
||||||
|
image: sonarqube:lts-community
|
||||||
|
ports:
|
||||||
|
- 9000:9000
|
||||||
|
volumes:
|
||||||
|
- sonarqube_data:/opt/sonarqube/data
|
||||||
|
- sonarqube_logs:/opt/sonarqube/logs
|
||||||
|
- sonarqube_extensions:/opt/sonarqube/extensions
|
||||||
|
options: >-
|
||||||
|
--health-cmd "grep -Fq \"SonarQube is operational\" /opt/sonarqube/logs/sonar.log"
|
||||||
|
--health-interval 10s
|
||||||
|
--health-timeout 5s
|
||||||
|
--health-retries 10
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: SonarQube Cache
|
||||||
|
uses: actions/cache@v4
|
||||||
|
with:
|
||||||
|
path: ${{ github.workspace }}/.sonar/cache
|
||||||
|
key: ${{ runner.os }}-${{ runner.arch }}-sonar
|
||||||
|
- name: Run action on sample project
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
SONAR_HOST_URL: http://localhost:9000
|
||||||
|
SONAR_USER_HOME: ${{ github.workspace }}/.sonar
|
||||||
|
with:
|
||||||
|
args: -Dsonar.login=admin -Dsonar.password=admin
|
||||||
|
projectBaseDir: ./test/example-project
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ./test/example-project/.scannerwork/report-task.txt
|
||||||
|
overrideSonarcloudUrlTest:
|
||||||
|
name: >
|
||||||
|
'SONARCLOUD_URL' is used
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
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"
|
||||||
|
dontFailWhenMissingWgetButCurlAvailable:
|
||||||
|
name: Don't fail when missing wget but curl available
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Remove wget
|
||||||
|
run: sudo apt-get remove -y wget
|
||||||
|
- name: Assert wget is not available
|
||||||
|
run: |
|
||||||
|
if command -v wget 2>&1 >/dev/null
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Run action
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
NO_CACHE: true
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
with:
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ./output.properties
|
||||||
|
dontFailWhenMissingCurlButWgetAvailable:
|
||||||
|
name: Don't fail when missing curl but wget available
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Remove curl
|
||||||
|
run: sudo apt-get remove -y curl
|
||||||
|
- name: Assert curl is not available
|
||||||
|
run: |
|
||||||
|
if command -v curl 2>&1 >/dev/null
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Run action
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
NO_CACHE: true
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
with:
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ./output.properties
|
||||||
|
failWhenBothWgetAndCurlMissing:
|
||||||
|
name: Fail when both wget and curl are missing
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Remove wget and curl
|
||||||
|
run: sudo apt-get remove -y wget curl
|
||||||
|
- name: Assert wget and curl are not available
|
||||||
|
run: |
|
||||||
|
if command -v wget 2>&1 >/dev/null
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
if command -v curl 2>&1 >/dev/null
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Run action
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
continue-on-error: true
|
||||||
|
env:
|
||||||
|
NO_CACHE: true
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output.properties"}'
|
||||||
|
with:
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
- name: Assert failure of previous step
|
||||||
|
if: steps.runTest.outcome == 'success'
|
||||||
|
run: exit 1
|
||||||
|
curlPerformsRedirect:
|
||||||
|
name: >
|
||||||
|
curl performs redirect when scannerBinariesUrl returns 3xx
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Remove wget
|
||||||
|
run: sudo apt-get remove -y wget
|
||||||
|
- name: Assert wget is not available
|
||||||
|
run: |
|
||||||
|
if command -v wget 2>&1 >/dev/null
|
||||||
|
then
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
- name: Start nginx via Docker Compose
|
||||||
|
run: docker compose up -d --wait
|
||||||
|
working-directory: .github/qa-nginx-redirecting
|
||||||
|
- name: Run action with scannerBinariesUrl
|
||||||
|
id: runTest
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
scannerBinariesUrl: http://localhost:8080/clientRedirectToSonarBinaries
|
||||||
|
env:
|
||||||
|
NO_CACHE: true
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
SONAR_SCANNER_JSON_PARAMS: '{"sonar.scanner.internal.dumpToFile": "./output1.properties"}'
|
||||||
|
- name: Assert Sonar Scanner CLI was downloaded
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists "$RUNNER_TEMP/sonarscanner/sonar-scanner-cli-6.2.1.4610-linux-x64.zip"
|
||||||
|
useSslCertificate:
|
||||||
|
name: >
|
||||||
|
'SONAR_ROOT_CERT' is converted to truststore
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
os: [ ubuntu-latest, windows-latest, macos-latest ]
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Run action with SSL certificate
|
||||||
|
uses: ./
|
||||||
|
with:
|
||||||
|
args: -Dsonar.scanner.internal.dumpToFile=./output.properties
|
||||||
|
env:
|
||||||
|
SONAR_ROOT_CERT: |
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
Fct6d1S08JAosVnZcP2P7Yz+TbmDRtsqCgk=
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
SONAR_HOST_URL: http://not_actually_used
|
||||||
|
- name: Assert
|
||||||
|
run: |
|
||||||
|
./test/assertFileExists ~/.sonar/ssl/truststore.p12
|
||||||
|
analysisWithSslCertificate:
|
||||||
|
name: >
|
||||||
|
Analysis takes into account 'SONAR_ROOT_CERT'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
token: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
- name: Generate server certificate
|
||||||
|
run: |
|
||||||
|
openssl req \
|
||||||
|
-newkey rsa:4096 \
|
||||||
|
-x509 \
|
||||||
|
-sha256 \
|
||||||
|
-addext "subjectAltName = DNS:localhost" \
|
||||||
|
-days 3650 \
|
||||||
|
-nodes \
|
||||||
|
-out server.crt \
|
||||||
|
-subj "/C=CH/ST=Geneva/L=Geneva/O=Server/OU=Dept" \
|
||||||
|
-keyout server.key
|
||||||
|
working-directory: .github/qa-sq-behind-ngix
|
||||||
|
- name: Start nginx and SonarQube via Docker Compose
|
||||||
|
run: docker compose up -d --wait
|
||||||
|
working-directory: .github/qa-sq-behind-ngix
|
||||||
|
- name: Read correct server certificate
|
||||||
|
run: |
|
||||||
|
# read server.crt from .github/qa-sq-behind-ngix/ and store into the SONAR_ROOT_CERT_VALID
|
||||||
|
# environment variable, to be able to read it in the next step
|
||||||
|
{
|
||||||
|
echo 'SONAR_ROOT_CERT_VALID<<=========='
|
||||||
|
cat .github/qa-sq-behind-ngix/server.crt
|
||||||
|
echo ==========
|
||||||
|
} >> $GITHUB_ENV
|
||||||
|
- name: Run action with the correct SSL certificate
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
SONAR_ROOT_CERT: ${{ env.SONAR_ROOT_CERT_VALID }}
|
||||||
|
SONAR_HOST_URL: https://localhost:4443
|
||||||
|
with:
|
||||||
|
args: -Dsonar.login=admin -Dsonar.password=admin
|
||||||
|
projectBaseDir: ./test/example-project
|
||||||
|
- name: Clear imported SSL certificates
|
||||||
|
run: |
|
||||||
|
rm -f ~/.sonar/ssl/truststore.p12
|
||||||
|
- name: Run action with an invalid SSL certificate
|
||||||
|
id: invalid_ssl_certificate
|
||||||
|
continue-on-error: true
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
SONAR_ROOT_CERT: |
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
INVALID
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
SONAR_HOST_URL: https://localhost:4443
|
||||||
|
with:
|
||||||
|
args: -Dsonar.login=admin -Dsonar.password=admin
|
||||||
|
projectBaseDir: ./test/example-project
|
||||||
|
- name: Assert failure of previous step
|
||||||
|
if: steps.invalid_ssl_certificate.outcome == 'success'
|
||||||
|
run: exit 1
|
||||||
|
- name: Clear imported SSL certificates
|
||||||
|
run: |
|
||||||
|
rm -f ~/.sonar/ssl/truststore.p12
|
||||||
|
- name: Run action with the wrong SSL certificate
|
||||||
|
id: wrong_ssl_certificate
|
||||||
|
continue-on-error: true
|
||||||
|
uses: ./
|
||||||
|
env:
|
||||||
|
SONAR_ROOT_CERT: |
|
||||||
|
-----BEGIN CERTIFICATE-----
|
||||||
|
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
|
||||||
|
-----END CERTIFICATE-----
|
||||||
|
SONAR_HOST_URL: https://localhost:4443
|
||||||
|
with:
|
||||||
|
args: -Dsonar.login=admin -Dsonar.password=admin
|
||||||
|
projectBaseDir: ./test/example-project
|
||||||
|
- name: Assert failure of previous step
|
||||||
|
if: steps.wrong_ssl_certificate.outcome == 'success'
|
||||||
|
run: exit 1
|
||||||
4
.github/workflows/update-tags.yml
vendored
4
.github/workflows/update-tags.yml
vendored
@@ -13,10 +13,10 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@v4
|
||||||
|
|
||||||
- name: Parse semver
|
- name: Parse semver
|
||||||
uses: madhead/semver-utils@v2
|
uses: madhead/semver-utils@v4
|
||||||
id: version
|
id: version
|
||||||
with:
|
with:
|
||||||
version: ${{ github.ref_name }}
|
version: ${{ github.ref_name }}
|
||||||
|
|||||||
17
Dockerfile
17
Dockerfile
@@ -1,17 +0,0 @@
|
|||||||
FROM sonarsource/sonar-scanner-cli:4.8
|
|
||||||
|
|
||||||
LABEL version="1.2.0" \
|
|
||||||
repository="https://github.com/sonarsource/sonarqube-scan-action" \
|
|
||||||
homepage="https://github.com/sonarsource/sonarqube-scan-action" \
|
|
||||||
maintainer="SonarSource" \
|
|
||||||
com.github.actions.name="SonarQube Scan" \
|
|
||||||
com.github.actions.description="Scan your code with SonarQube to detect Bugs, Vulnerabilities and Code Smells in up to 27 programming languages!" \
|
|
||||||
com.github.actions.icon="check" \
|
|
||||||
com.github.actions.color="green"
|
|
||||||
|
|
||||||
|
|
||||||
COPY entrypoint.sh /entrypoint.sh
|
|
||||||
RUN chmod +x /entrypoint.sh
|
|
||||||
COPY cleanup.sh /cleanup.sh
|
|
||||||
RUN chmod +x /cleanup.sh
|
|
||||||
ENTRYPOINT ["/entrypoint.sh"]
|
|
||||||
165
README.md
165
README.md
@@ -1,30 +1,44 @@
|
|||||||
# Scan your code with SonarQube [](https://github.com/SonarSource/sonarqube-scan-action/actions/workflows/qa.yml)
|
# Scan your code with SonarQube [](https://github.com/SonarSource/sonarqube-scan-action/actions/workflows/qa.yml)
|
||||||
|
|
||||||
Using this GitHub Action, scan your code with [SonarQube](https://www.sonarqube.org/) to detects Bugs, Vulnerabilities and Code Smells in up to 27 programming languages!
|
This SonarSource project, available as a GitHub Action, scans your projects with SonarQube [Server](https://www.sonarsource.com/products/sonarqube/) or [Cloud](https://www.sonarsource.com/products/sonarcloud/).
|
||||||
|
|
||||||
<img src="./images/SonarQube-72px.png">
|

|
||||||
|

|
||||||
|
|
||||||
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](https://www.sonarsource.com/products/sonarqube/) and [Cloud](https://www.sonarsource.com/products/sonarcloud/) (formerly SonarQube and 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
|
## Requirements
|
||||||
|
|
||||||
To run an analysis on your code, you first need to set up your project on SonarQube. Your SonarQube instance must be accessible from GitHub, and you will need an access token to run the analysis (more information below under **Environment variables**).
|
### Server
|
||||||
|
|
||||||
Read more information on how to analyze your code [here](https://docs.sonarqube.org/latest/analysis/github-integration/).
|
To run an analysis on your code, you first need to set up your project on SonarQube Server. Your SonarQube Server instance must be accessible from GitHub, and you will need an access token to run the analysis (more information below under **Environment variables**).
|
||||||
|
|
||||||
|
Read more information on how to analyze your code [here](https://docs.sonarsource.com/sonarqube-server/latest/devops-platform-integration/github-integration/introduction/).
|
||||||
|
|
||||||
|
### Cloud
|
||||||
|
|
||||||
|
* 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
|
## Usage
|
||||||
|
|
||||||
Project metadata, including the location to the sources to be analyzed, must be declared in the file `sonar-project.properties` in the base directory:
|
Project metadata, including the location of the sources to be analyzed, must be declared in the file `sonar-project.properties` in the base directory:
|
||||||
|
|
||||||
|
### Server
|
||||||
|
|
||||||
```properties
|
```properties
|
||||||
sonar.projectKey=<replace with the key generated when setting up the project on SonarQube>
|
sonar.projectKey=<replace with the key generated when setting up the project on SonarQube Server>
|
||||||
|
|
||||||
# relative paths to source directories. More details and properties are described
|
# relative paths to source directories. More details and properties are described
|
||||||
# in https://docs.sonarqube.org/latest/project-administration/narrowing-the-focus/
|
# at https://docs.sonarsource.com/sonarqube-server/latest/project-administration/analysis-scope/
|
||||||
sonar.sources=.
|
sonar.sources=.
|
||||||
```
|
```
|
||||||
|
|
||||||
The workflow YAML file will usually look something like this:
|
The workflow, usually declared under `.github/workflows`, looks like:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
on:
|
on:
|
||||||
@@ -43,84 +57,147 @@ jobs:
|
|||||||
sonarqube:
|
sonarqube:
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: actions/checkout@v2
|
- uses: actions/checkout@v4
|
||||||
with:
|
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
|
fetch-depth: 0
|
||||||
- name: SonarQube Scan
|
- name: SonarQube Scan
|
||||||
uses: sonarsource/sonarqube-scan-action@master
|
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v4.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||||
env:
|
env:
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
|
SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}
|
||||||
```
|
```
|
||||||
|
|
||||||
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:
|
### Cloud
|
||||||
|
|
||||||
|
```properties
|
||||||
|
sonar.organization=<replace with your SonarQube Cloud organization key>
|
||||||
|
sonar.projectKey=<replace with the key generated when setting up the project on SonarQube Cloud>
|
||||||
|
|
||||||
|
# relative paths to source directories. More details and properties are described
|
||||||
|
# at https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/analysis-scope/
|
||||||
|
sonar.sources=.
|
||||||
|
```
|
||||||
|
|
||||||
|
The workflow, usually declared under `.github/workflows`, looks like:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
|
on:
|
||||||
|
# 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:
|
||||||
|
sonarqube:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v4
|
||||||
|
with:
|
||||||
|
# Disabling shallow clones is recommended for improving the relevancy of reporting
|
||||||
|
fetch-depth: 0
|
||||||
- name: SonarQube Scan
|
- name: SonarQube Scan
|
||||||
uses: sonarsource/sonarqube-scan-action@master
|
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v4.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||||
env:
|
env:
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
|
|
||||||
LC_ALL: "ru_RU.UTF-8"
|
|
||||||
```
|
```
|
||||||
|
|
||||||
If your SonarQube server uses a self-signed certificate, you can pass a root certificate (in PEM format) to the java certificate store:
|
## Action parameters
|
||||||
|
|
||||||
```yaml
|
|
||||||
- name: SonarQube Scan
|
|
||||||
uses: sonarsource/sonarqube-scan-action@master
|
|
||||||
env:
|
|
||||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
|
||||||
SONAR_HOST_URL: ${{ secrets.SONAR_HOST_URL }}
|
|
||||||
SONAR_ROOT_CERT: ${{ secrets.SONAR_ROOT_CERT }}
|
|
||||||
```
|
|
||||||
|
|
||||||
You can change the analysis base directory by using the optional input `projectBaseDir` like this:
|
You can change the analysis base directory by using the optional input `projectBaseDir` like this:
|
||||||
|
|
||||||
```yaml
|
```yaml
|
||||||
- name: SonarQube Scan
|
- uses: sonarsource/sonarqube-scan-action@<action version>
|
||||||
uses: sonarsource/sonarqube-scan-action@master
|
|
||||||
with:
|
with:
|
||||||
projectBaseDir: app/src
|
projectBaseDir: app/src
|
||||||
```
|
```
|
||||||
|
|
||||||
|
In case you need to specify the version of the Sonar Scanner, you can use the `scannerVersion` option:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: sonarsource/sonarqube-scan-action@<action version>
|
||||||
|
with:
|
||||||
|
scannerVersion: 6.2.0.4584
|
||||||
|
```
|
||||||
|
|
||||||
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:
|
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
|
```yaml
|
||||||
- name: SonarQube Scan
|
- uses: sonarsource/sonarqube-scan-action@<action version>
|
||||||
uses: sonarsource/sonarqube-scan-action@master
|
|
||||||
with:
|
with:
|
||||||
projectBaseDir: app/src
|
projectBaseDir: app/src
|
||||||
args: >
|
args: >
|
||||||
|
-Dsonar.organization=my-organization # For SonarQube Cloud only
|
||||||
|
-Dsonar.projectKey=my-projectkey
|
||||||
-Dsonar.python.coverage.reportPaths=coverage.xml
|
-Dsonar.python.coverage.reportPaths=coverage.xml
|
||||||
|
-Dsonar.sources=lib/
|
||||||
-Dsonar.tests=tests/
|
-Dsonar.tests=tests/
|
||||||
|
-Dsonar.test.exclusions=tests/**
|
||||||
-Dsonar.verbose=true
|
-Dsonar.verbose=true
|
||||||
```
|
```
|
||||||
|
|
||||||
More information about possible analysis parameters can be found in [the documentation](https://redirect.sonarsource.com/doc/analysis-parameters.html).
|
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/sonarqube-scan-action@<action version>
|
||||||
|
with:
|
||||||
|
scannerBinariesUrl: https://my.custom.binaries.url.com/Distribution/sonar-scanner-cli/
|
||||||
|
```
|
||||||
|
|
||||||
|
More information about possible analysis parameters can be found:
|
||||||
|
* in the [Analysis parameters page](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/analysis-parameters/) of the SonarQube Server documentation
|
||||||
|
* in the [Analysis parameters page](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/analysis-parameters/) of the SonarQube Cloud documentation
|
||||||
|
|
||||||
### Environment variables
|
### 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. You can read more about security tokens in the documentation of SonarQube [Server](https://docs.sonarsource.com/sonarqube-server/latest/user-guide/managing-tokens/) and [Cloud](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).
|
||||||
- `SONAR_HOST_URL` – **Required** this tells the scanner where SonarQube is hosted. 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).
|
- *`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 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_HOST_URL` – this tells the scanner where SonarQube Server is hosted. You can set the `SONAR_HOST_URL` environment variable in the "Variables" settings page of your repository, or you can add them at the level of your GitHub organization (recommended). Not needed for SonarQube Cloud.
|
||||||
|
- `SONAR_ROOT_CERT` – Holds an additional certificate (in PEM format) that is used to validate the certificate of SonarQube Server or of a secured proxy to SonarQube (Server or 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).
|
||||||
|
|
||||||
|
Here is an example of how you can pass a certificate (in PEM format) to the Scanner truststore:
|
||||||
|
|
||||||
|
```yaml
|
||||||
|
- uses: sonarsource/sonarqube-scan-action@<action version>
|
||||||
|
env:
|
||||||
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
|
SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }}
|
||||||
|
SONAR_ROOT_CERT: ${{ secrets.SONAR_ROOT_CERT }}
|
||||||
|
```
|
||||||
|
|
||||||
|
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/sonarqube-scan-action@<action version>
|
||||||
|
env:
|
||||||
|
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||||
|
SONAR_HOST_URL: ${{ vars.SONAR_HOST_URL }} # or https://sonarcloud.io
|
||||||
|
LC_ALL: "ru_RU.UTF-8"
|
||||||
|
```
|
||||||
|
|
||||||
## Alternatives for Java, .NET, and C/C++ projects
|
## Alternatives for Java, .NET, and C/C++ projects
|
||||||
|
|
||||||
This GitHub Action will not work for all technologies. If you are in one of the following situations, you should use the following alternatives:
|
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. Read the documentation about our [Scanner for Maven](https://redirect.sonarsource.com/doc/install-configure-scanner-maven.html).
|
* Your code is built with Maven. Read the documentation about our SonarScanner for Maven in SonarQube [Server](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner-for-maven/) and [Cloud](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 [Scanner for Gradle](https://redirect.sonarsource.com/doc/gradle.html).
|
* Your code is built with Gradle. Read the documentation about our SonarScanner for Gradle in SonarQube [Server](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/sonarscanner-for-gradle/) and [Cloud](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 [Scanner for .NET](https://redirect.sonarsource.com/doc/install-configure-scanner-msbuild.html).
|
* You want to analyze a .NET solution. Read the documentation about our SonarScanner for .NET in SonarQube [Server](https://docs.sonarsource.com/sonarqube-server/latest/analyzing-source-code/scanners/dotnet/introduction/) and [Cloud](https://docs.sonarsource.com/sonarqube-cloud/advanced-setup/ci-based-analysis/sonarscanner-for-dotnet/introduction/).
|
||||||
* You want to analyze C/C++ code. Read the documentation on [analyzing C/C++ code](https://docs.sonarqube.org/latest/analysis/languages/cfamily/).
|
* 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 Server Scan for C and C++](https://github.com/marketplace/actions/sonarqube-scan-for-c-and-c) GitHub Action, for projects on SonarQube Server
|
||||||
|
* the [SonarQube Cloud Scan for C and C++](https://github.com/marketplace/actions/sonarcloud-scan-for-c-and-c) GitHub Action, for projects on SonarQube Cloud - look at [our sample C and C++ project](https://github.com/sonarsource-cfamily-examples?q=gh-actions-sc&type=all&language=&sort=).
|
||||||
|
|
||||||
## Have question or feedback?
|
## 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/tags/c/help/sq/github-actions).
|
To provide feedback (requesting a feature or reporting a bug) please post on the SonarSource Community Forum page for SonarQube [Server](https://community.sonarsource.com/tags/c/help/sq/github-actions) or [Cloud](https://community.sonarsource.com/tags/c/help/sc/9/github-actions).
|
||||||
|
|
||||||
## License
|
## 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.
|
||||||
|
|
||||||
Container images built with this project include third party materials.
|
|
||||||
|
|||||||
13
SECURITY.md
Normal file
13
SECURITY.md
Normal file
@@ -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).
|
||||||
53
action.yml
53
action.yml
@@ -1,19 +1,54 @@
|
|||||||
name: Official SonarQube Scan
|
name: Official SonarQube (Server, Cloud) Scan
|
||||||
description: >
|
description: >
|
||||||
Scan your code with SonarQube to detect Bugs, Vulnerabilities and Code Smells in up to 27 programming languages!
|
Scan your code with SonarQube Server and 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 SonarQube and SonarCloud)
|
||||||
branding:
|
branding:
|
||||||
icon: check
|
icon: check
|
||||||
color: green
|
color: green
|
||||||
runs:
|
|
||||||
using: docker
|
|
||||||
image: Dockerfile
|
|
||||||
entrypoint: "/entrypoint.sh"
|
|
||||||
post-entrypoint: "/cleanup.sh"
|
|
||||||
inputs:
|
inputs:
|
||||||
args:
|
args:
|
||||||
description: Additional arguments to the sonar-scanner
|
description: Additional arguments to the Sonar Scanner CLI
|
||||||
required: false
|
required: false
|
||||||
projectBaseDir:
|
projectBaseDir:
|
||||||
description: Set the sonar.projectBaseDir analysis property
|
description: Set the sonar.projectBaseDir analysis property
|
||||||
required: false
|
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: Sanity checks
|
||||||
|
run: ${GITHUB_ACTION_PATH}/sanity-checks.sh
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_PROJECTBASEDIR: ${{ inputs.projectBaseDir }}
|
||||||
|
- name: Load Sonar Scanner CLI from cache
|
||||||
|
id: sonar-scanner-cli
|
||||||
|
uses: actions/cache@v4.0.2
|
||||||
|
with:
|
||||||
|
path: ${{ runner.temp }}/sonar-scanner-cli-${{ inputs.scannerVersion }}-${{ runner.os }}-${{ runner.arch }}
|
||||||
|
key: sonar-scanner-cli-${{ inputs.scannerVersion }}-${{ runner.os }}-${{ runner.arch }}
|
||||||
|
- name: Install Sonar Scanner CLI
|
||||||
|
if: ${{ env.NO_CACHE == 'true' || steps.sonar-scanner-cli.outputs.cache-hit != 'true' }}
|
||||||
|
run: ${GITHUB_ACTION_PATH}/install-sonar-scanner-cli.sh
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_SCANNERVERSION: ${{ inputs.scannerVersion }}
|
||||||
|
INPUT_SCANNERBINARIESURL: ${{ inputs.scannerBinariesUrl }}
|
||||||
|
- name: Add SonarScanner CLI to the PATH
|
||||||
|
run: echo "${RUNNER_TEMP}/sonar-scanner-cli-${{ inputs.scannerVersion }}-${{ runner.os }}-${{ runner.arch }}/bin" >> $GITHUB_PATH
|
||||||
|
shell: bash
|
||||||
|
- name: Run SonarScanner
|
||||||
|
run: ${GITHUB_ACTION_PATH}/run-sonar-scanner.sh ${{ inputs.args }}
|
||||||
|
shell: bash
|
||||||
|
env:
|
||||||
|
INPUT_PROJECTBASEDIR: ${{ inputs.projectBaseDir }}
|
||||||
|
SONAR_SCANNER_JRE: ${{ runner.temp }}/sonar-scanner-cli-${{ inputs.scannerVersion }}-${{ runner.os }}-${{ runner.arch }}/jre
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
_tmp_file=$(ls "${INPUT_PROJECTBASEDIR}/" | head -1)
|
|
||||||
PERM=$(stat -c "%u:%g" "${INPUT_PROJECTBASEDIR}/$_tmp_file")
|
|
||||||
|
|
||||||
chown -R $PERM "${INPUT_PROJECTBASEDIR}/"
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
set -e
|
|
||||||
|
|
||||||
if [[ -z "${SONAR_TOKEN}" ]]; then
|
|
||||||
echo "============================ WARNING ============================"
|
|
||||||
echo "Running this GitHub Action without SONAR_TOKEN is not recommended"
|
|
||||||
echo "============================ WARNING ============================"
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -z "${SONAR_HOST_URL}" ]]; then
|
|
||||||
echo "This GitHub Action requires the SONAR_HOST_URL env variable."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -n "${SONAR_ROOT_CERT}" ]]; then
|
|
||||||
echo "Adding custom root certificate to java certificate store"
|
|
||||||
rm -f /tmp/tmpcert.pem
|
|
||||||
echo "${SONAR_ROOT_CERT}" > /tmp/tmpcert.pem
|
|
||||||
keytool -keystore /etc/ssl/certs/java/cacerts -storepass changeit -noprompt -trustcacerts -importcert -alias sonarqube -file /tmp/tmpcert.pem
|
|
||||||
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
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [[ -f "${INPUT_PROJECTBASEDIR%/}build.gradle" ]]; then
|
|
||||||
echo "Gradle project detected. You should use the SonarQube plugin for Gradle during build rather than using this GitHub Action."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
unset JAVA_HOME
|
|
||||||
|
|
||||||
sonar-scanner -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} ${INPUT_ARGS}
|
|
||||||
|
|
||||||
BIN
images/SQ_Logo_Server_Cloud_Dark_Backgrounds.png
Normal file
BIN
images/SQ_Logo_Server_Cloud_Dark_Backgrounds.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 24 KiB |
BIN
images/SQ_Logo_Server_Cloud_Light_Backgrounds.png
Normal file
BIN
images/SQ_Logo_Server_Cloud_Light_Backgrounds.png
Normal file
Binary file not shown.
|
After Width: | Height: | Size: 25 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 9.7 KiB |
52
install-sonar-scanner-cli.sh
Executable file
52
install-sonar-scanner-cli.sh
Executable file
@@ -0,0 +1,52 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eou pipefail
|
||||||
|
|
||||||
|
# See https://docs.github.com/en/actions/writing-workflows/choosing-what-your-workflow-does/store-information-in-variables#default-environment-variables
|
||||||
|
#
|
||||||
|
# Script-specific variables required:
|
||||||
|
# - INPUT_SCANNERVERSION: e.g. 6.2.1.4610
|
||||||
|
# - INPUT_SCANNERBINARIESURL: e.g. https://github.com/me/my-repo/raw/refs/heads/main/binaries
|
||||||
|
|
||||||
|
if [[ "$RUNNER_OS" == "Linux" && "$RUNNER_ARCH" == "X64" ]]; then
|
||||||
|
FLAVOR="linux-x64"
|
||||||
|
elif [[ "$RUNNER_OS" == "Linux" && "$RUNNER_ARCH" == "ARM64" ]]; then
|
||||||
|
FLAVOR="linux-aarch64"
|
||||||
|
elif [[ "$RUNNER_OS" == "Windows" && "$RUNNER_ARCH" == "X64" ]]; then
|
||||||
|
FLAVOR="windows-x64"
|
||||||
|
elif [[ "$RUNNER_OS" == "macOS" && "$RUNNER_ARCH" == "X64" ]]; then
|
||||||
|
FLAVOR="macosx-x64"
|
||||||
|
elif [[ "$RUNNER_OS" == "macOS" && "$RUNNER_ARCH" == "ARM64" ]]; then
|
||||||
|
FLAVOR="macosx-aarch64"
|
||||||
|
else
|
||||||
|
echo "::error title=SonarScanner::$RUNNER_OS $RUNNER_ARCH not supported"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
set -x
|
||||||
|
|
||||||
|
mkdir -p $RUNNER_TEMP/sonarscanner
|
||||||
|
cd $RUNNER_TEMP/sonarscanner
|
||||||
|
|
||||||
|
SCANNER_FILE_NAME="sonar-scanner-cli-$INPUT_SCANNERVERSION-$FLAVOR.zip"
|
||||||
|
SCANNER_URI="${INPUT_SCANNERBINARIESURL%/}/$SCANNER_FILE_NAME"
|
||||||
|
|
||||||
|
if command -v wget &> /dev/null; then
|
||||||
|
wget --no-verbose --user-agent=sonarqube-scan-action "$SCANNER_URI"
|
||||||
|
elif command -v curl &> /dev/null; then
|
||||||
|
curl --fail --silent --show-error --user-agent sonarqube-scan-action \
|
||||||
|
--location --output "$SCANNER_FILE_NAME" "$SCANNER_URI"
|
||||||
|
elif [ "$RUNNER_OS" == "Windows" ] && [ -t "C:\\msys64\\usr\\bin\\wget.exe" ]; then
|
||||||
|
"C:\\msys64\\usr\\bin\\wget.exe" --no-verbose --user-agent=sonarqube-scan-action "$SCANNER_URI"
|
||||||
|
elif [ "$RUNNER_OS" == "Windows" ] && [ -t "C:\\msys64\\usr\\bin\\curl.exe" ]; then
|
||||||
|
"C:\\msys64\\usr\\bin\\curl.exe" --fail --silent --show-error --user-agent sonarqube-scan-action \
|
||||||
|
--location --output "$SCANNER_FILE_NAME" "$SCANNER_URI"
|
||||||
|
else
|
||||||
|
echo "::error title=SonarScanner::Neither wget nor curl found on the machine"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
|
|
||||||
|
unzip -q $SCANNER_FILE_NAME
|
||||||
|
|
||||||
|
# Folder name should correspond to the directory cached by the actions/cache
|
||||||
|
mv sonar-scanner-$INPUT_SCANNERVERSION-$FLAVOR $RUNNER_TEMP/sonar-scanner-cli-$INPUT_SCANNERVERSION-$RUNNER_OS-$RUNNER_ARCH
|
||||||
41
run-sonar-scanner.sh
Executable file
41
run-sonar-scanner.sh
Executable file
@@ -0,0 +1,41 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eo pipefail
|
||||||
|
|
||||||
|
if [[ "$RUNNER_OS" == "Windows" ]]; then
|
||||||
|
SCANNER_BIN="sonar-scanner.bat"
|
||||||
|
else
|
||||||
|
SCANNER_BIN="sonar-scanner"
|
||||||
|
fi
|
||||||
|
|
||||||
|
scanner_args=()
|
||||||
|
if [[ ${SONARCLOUD_URL} ]]; then
|
||||||
|
scanner_args+=("-Dsonar.scanner.sonarcloudUrl=${SONARCLOUD_URL}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ "$RUNNER_DEBUG" == '1' ]]; then
|
||||||
|
scanner_args+=('--debug')
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${INPUT_PROJECTBASEDIR}" ]]; then
|
||||||
|
scanner_args+=("-Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR}")
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -n "${SONAR_ROOT_CERT}" ]]; then
|
||||||
|
echo "Adding SSL certificate to the Scanner truststore"
|
||||||
|
rm -f $RUNNER_TEMP/tmpcert.pem
|
||||||
|
echo "${SONAR_ROOT_CERT}" > $RUNNER_TEMP/tmpcert.pem
|
||||||
|
# Use keytool for now, as SonarQube 10.6 and below doesn't support openssl generated keystores
|
||||||
|
# keytool require a password > 6 characters, so we wan't use the default password 'sonar'
|
||||||
|
store_pass=changeit
|
||||||
|
mkdir -p ~/.sonar/ssl
|
||||||
|
$SONAR_SCANNER_JRE/bin/java sun.security.tools.keytool.Main -storetype PKCS12 -keystore ~/.sonar/ssl/truststore.p12 -storepass $store_pass -noprompt -trustcacerts -importcert -alias sonar -file $RUNNER_TEMP/tmpcert.pem
|
||||||
|
scanner_args+=("-Dsonar.scanner.truststorePassword=$store_pass")
|
||||||
|
fi
|
||||||
|
|
||||||
|
scanner_args+=("$@")
|
||||||
|
|
||||||
|
set -ux
|
||||||
|
|
||||||
|
$SCANNER_BIN "${scanner_args[@]}"
|
||||||
|
|
||||||
18
sanity-checks.sh
Executable file
18
sanity-checks.sh
Executable file
@@ -0,0 +1,18 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
set -eo pipefail
|
||||||
|
|
||||||
|
if [[ -z "${SONAR_TOKEN}" ]]; then
|
||||||
|
echo "::warning title=SonarScanner::Running this GitHub Action without SONAR_TOKEN is not recommended"
|
||||||
|
fi
|
||||||
|
|
||||||
|
if [[ -f "${INPUT_PROJECTBASEDIR%/}/pom.xml" ]]; then
|
||||||
|
echo "::warning title=SonarScanner::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 title=SonarScanner::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
|
||||||
|
|
||||||
10
test/assertFileContains
Executable file
10
test/assertFileContains
Executable file
@@ -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
|
||||||
8
test/assertFileDoesntExist
Executable file
8
test/assertFileDoesntExist
Executable file
@@ -0,0 +1,8 @@
|
|||||||
|
#!/bin/bash
|
||||||
|
|
||||||
|
error() { echo -e "\\e[31m✗ $*\\e[0m"; }
|
||||||
|
|
||||||
|
if [ -f $1 ]; then
|
||||||
|
error "File '$1' found"
|
||||||
|
exit 1
|
||||||
|
fi
|
||||||
8
test/assertFileExists
Executable file
8
test/assertFileExists
Executable file
@@ -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
|
||||||
0
test/gradle-project-kotlin/build.gradle.kts
Normal file
0
test/gradle-project-kotlin/build.gradle.kts
Normal file
112
test/run-qa.sh
112
test/run-qa.sh
@@ -1,112 +0,0 @@
|
|||||||
#!/bin/bash
|
|
||||||
|
|
||||||
# Helper functions for coloring output.
|
|
||||||
info() { echo -e "\\e[36m$*\\e[0m"; }
|
|
||||||
error() { echo -e "\\e[31m✗ $*\\e[0m"; }
|
|
||||||
success() { echo -e "\\e[32m✔ $*\\e[0m"; }
|
|
||||||
|
|
||||||
# Helper function to check if SonarQube is up and running.
|
|
||||||
check_sq_is_up() {
|
|
||||||
local statusCall="$(curl --silent --user admin:admin http://127.0.0.1:9000/api/system/status)"
|
|
||||||
local status="$(jq -r '.status' <<< "$statusCall")"
|
|
||||||
if [[ ! $? -eq 0 ]]; then
|
|
||||||
error "Failed to check if SonarQube is up and running."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
echo $status;
|
|
||||||
}
|
|
||||||
|
|
||||||
_current_perm=$(stat -c "%u:%g" $(pwd))
|
|
||||||
|
|
||||||
info "Build scanner action..."
|
|
||||||
docker build --no-cache -t sonarsource/sonarqube-scan-action .
|
|
||||||
if [[ ! $? -eq 0 ]]; then
|
|
||||||
error "Failed to build the scanner action."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
success "Scanner action built."
|
|
||||||
|
|
||||||
info "Find the network SonarQube is running on..."
|
|
||||||
network=$(docker network ls -f 'name=github_network' --format "{{.Name}}")
|
|
||||||
if [[ $network != "github_network_"* ]]; then
|
|
||||||
error "Failed to find the local Docker network."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
success "Found the network ($network)."
|
|
||||||
|
|
||||||
info "Wait until SonarQube is up..."
|
|
||||||
sleep 10
|
|
||||||
isUp=$(check_sq_is_up)
|
|
||||||
until [[ "$isUp" == "UP" ]]; do
|
|
||||||
sleep 1
|
|
||||||
isUp=$(check_sq_is_up)
|
|
||||||
done
|
|
||||||
success "SonarQube is up and running."
|
|
||||||
|
|
||||||
info "Generate a new token..."
|
|
||||||
tokenCall=$(curl --silent --user admin:admin -d "name=token" http://127.0.0.1:9000/api/user_tokens/generate)
|
|
||||||
token="$(jq -r '.token' <<< "$tokenCall")"
|
|
||||||
if [[ -z "$token" ]]; then
|
|
||||||
error "Failed to generate a new token."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
success "New token generated."
|
|
||||||
|
|
||||||
info "Test fail-fast if SONAR_TOKEN is omitted..."
|
|
||||||
docker run -v `pwd`:/github/workspace/ --workdir /github/workspace --network $network sonarsource/sonarqube-scan-action
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
error "Should have failed fast."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
success "Correctly failed fast."
|
|
||||||
|
|
||||||
info "Test fail-fast if SONAR_HOST_URL is omitted..."
|
|
||||||
docker run -v `pwd`:/github/workspace/ --workdir /github/workspace --network $network --env SONAR_TOKEN=$token sonarsource/sonarqube-scan-action
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
error "Should have failed fast."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
success "Correctly failed fast."
|
|
||||||
|
|
||||||
info "Test fail-fast on Gradle project..."
|
|
||||||
pushd test/gradle-project/
|
|
||||||
docker run -v `pwd`:/github/workspace/ --workdir /github/workspace --network $network --env SONAR_TOKEN=$token --env SONAR_HOST_URL='http://sonarqube:9000' sonarsource/sonarqube-scan-action
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
error "Should have failed fast."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
popd
|
|
||||||
success "Correctly failed fast."
|
|
||||||
|
|
||||||
info "Test fail-fast on Maven project..."
|
|
||||||
pushd test/maven-project/
|
|
||||||
docker run -v `pwd`:/github/workspace/ --workdir /github/workspace --network $network --env SONAR_TOKEN=$token --env SONAR_HOST_URL='http://sonarqube:9000' sonarsource/sonarqube-scan-action
|
|
||||||
if [[ $? -eq 0 ]]; then
|
|
||||||
error "Should have failed fast."
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
popd
|
|
||||||
success "Correctly failed fast."
|
|
||||||
|
|
||||||
info "Analyze project..."
|
|
||||||
cd test/example-project/
|
|
||||||
docker run -v `pwd`:/github/workspace/ --workdir /github/workspace --network $network --env INPUT_PROJECTBASEDIR=/github/workspace --env SONAR_TOKEN=$token --env SONAR_HOST_URL='http://sonarqube:9000' sonarsource/sonarqube-scan-action
|
|
||||||
docker run -v `pwd`:/github/workspace/ --workdir /github/workspace --network $network --env INPUT_PROJECTBASEDIR=/github/workspace --entrypoint /cleanup.sh sonarsource/sonarqube-scan-action
|
|
||||||
if [[ ! $? -eq 0 ]]; then
|
|
||||||
error "Couldn't run the analysis."
|
|
||||||
exit 1
|
|
||||||
elif [[ ! -f ".scannerwork/report-task.txt" ]]; then
|
|
||||||
error "Couldn't find the report task file. Analysis failed."
|
|
||||||
exit 1
|
|
||||||
elif [ ! "$(stat -c "%u:%g" ".scannerwork/report-task.txt")" == "$_current_perm" ]; then
|
|
||||||
error "File permissions differ from desired once"
|
|
||||||
error "desired: $_current_perm"
|
|
||||||
error "actual: $(stat -c "%u:%g" ".scannerwork/report-task.txt")"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
success "Analysis successful."
|
|
||||||
|
|
||||||
echo "" # new line
|
|
||||||
echo "============================"
|
|
||||||
echo "" # new line
|
|
||||||
success "QA successful!"
|
|
||||||
Reference in New Issue
Block a user