Compare commits
52 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
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 | ||
|
|
a6ba0aafc2 | ||
|
|
1db0a52e3c | ||
|
|
50d5d98163 | ||
|
|
26fe7d6b0e | ||
|
|
fd8151470c | ||
|
|
bdba66714e | ||
|
|
72def085d4 | ||
|
|
7295e71c95 | ||
|
|
b755ad2c7e | ||
|
|
7153604e5b | ||
|
|
1f3c95ed10 | ||
|
|
495aa71ae8 | ||
|
|
a81ac001b5 | ||
|
|
9b49068b67 |
4
.cirrus.star
Normal file
4
.cirrus.star
Normal file
@@ -0,0 +1,4 @@
|
||||
load("github.com/SonarSource/cirrus-modules@v3", "load_features")
|
||||
|
||||
def main(ctx):
|
||||
return load_features(ctx)
|
||||
37
.cirrus.yml
Normal file
37
.cirrus.yml
Normal file
@@ -0,0 +1,37 @@
|
||||
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}
|
||||
|
||||
# Mend scan global configuration
|
||||
MEND_API_KEY: VAULT[development/kv/data/mend data.apikey]
|
||||
|
||||
# Staging image configuration
|
||||
STAGING_IMAGE_NAME: sonarsource/sonarqube-scan-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
|
||||
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_BRANCH == "master" || $CIRRUS_BRANCH =~ "branch-.*")
|
||||
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
|
||||
|
||||
|
||||
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
|
||||
1
.github/CODEOWNERS
vendored
Normal file
1
.github/CODEOWNERS
vendored
Normal file
@@ -0,0 +1 @@
|
||||
.github/CODEOWNERS @sonarsource/analysis-experience-squad
|
||||
12
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
12
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@@ -0,0 +1,12 @@
|
||||
Please be aware that we are not actively looking for feature contributions. The truth is that it's extremely difficult for someone outside SonarSource to comply with our roadmap and expectations. Therefore, we typically only accept minor cosmetic changes and typo fixes. If you would like to see a new feature, please create a new thread in the forum ["Suggest new features"](https://community.sonarsource.com/c/suggestions/features).
|
||||
|
||||
With that in mind, if you would like to submit a code contribution, make sure that you adhere to the following guidelines and all tests are passing:
|
||||
|
||||
- [ ] Please explain your motives to contribute this change: what problem you are trying to fix, what improvement you are trying to make
|
||||
- [ ] Make sure any code you changed is covered by tests
|
||||
- [ ] If there is a [JIRA](http://jira.sonarsource.com/browse/SONAR) ticket available, please make your commits and pull request start with the ticket ID (SONAR-XXXX)
|
||||
|
||||
We will try to give you feedback on your contribution as quickly as possible.
|
||||
|
||||
Thank You!
|
||||
The SonarSource Team
|
||||
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 "
|
||||
252
.github/workflows/qa.yml
vendored
252
.github/workflows/qa.yml
vendored
@@ -1,18 +1,258 @@
|
||||
name: QA
|
||||
|
||||
on: push
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- master
|
||||
pull_request:
|
||||
types: [opened, synchronize, reopened]
|
||||
|
||||
jobs:
|
||||
run_qa:
|
||||
noInputsTest:
|
||||
name: >
|
||||
No inputs
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- run: ./test/run-qa.sh
|
||||
timeout-minutes: 5
|
||||
- name: Run action with args
|
||||
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
|
||||
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
|
||||
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
|
||||
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:
|
||||
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"
|
||||
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
|
||||
- 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
|
||||
- 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
|
||||
- name: Assert
|
||||
run: |
|
||||
./test/assertFileExists ./output.properties
|
||||
runAnalysisTest:
|
||||
runs-on: ubuntu-latest
|
||||
services:
|
||||
sonarqube:
|
||||
image: sonarqube:8.9-community
|
||||
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: Run action on sample project
|
||||
id: runTest
|
||||
uses: ./
|
||||
env:
|
||||
SONAR_HOST_URL: http://sonarqube: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
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Run action with debug mode
|
||||
uses: ./
|
||||
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 }}-sonar
|
||||
- name: Run action on sample project
|
||||
id: runTest
|
||||
uses: ./
|
||||
env:
|
||||
SONAR_HOST_URL: http://sonarqube: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
|
||||
useSslCertificate:
|
||||
name: >
|
||||
'SONAR_ROOT_CERT' is converted to truststore
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v4
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
- name: Run action with SSL certificate
|
||||
uses: ./
|
||||
env:
|
||||
SONAR_ROOT_CERT: |
|
||||
-----BEGIN CERTIFICATE-----
|
||||
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
|
||||
Fct6d1S08JAosVnZcP2P7Yz+TbmDRtsqCgk=
|
||||
-----END CERTIFICATE-----
|
||||
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.scanner.truststorePassword=changeit"
|
||||
|
||||
32
.github/workflows/update-tags.yml
vendored
Normal file
32
.github/workflows/update-tags.yml
vendored
Normal file
@@ -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@v4
|
||||
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
|
||||
15
Dockerfile
15
Dockerfile
@@ -1,6 +1,6 @@
|
||||
FROM sonarsource/sonar-scanner-cli:4.6
|
||||
FROM sonarsource/sonar-scanner-cli:11.1
|
||||
|
||||
LABEL version="1.0.0" \
|
||||
LABEL version="3.1.0" \
|
||||
repository="https://github.com/sonarsource/sonarqube-scan-action" \
|
||||
homepage="https://github.com/sonarsource/sonarqube-scan-action" \
|
||||
maintainer="SonarSource" \
|
||||
@@ -9,12 +9,13 @@ LABEL version="1.0.0" \
|
||||
com.github.actions.icon="check" \
|
||||
com.github.actions.color="green"
|
||||
|
||||
# Set up local envs in order to allow for special chars (non-asci) in filenames.
|
||||
ENV LC_ALL="C.UTF-8"
|
||||
|
||||
# https://help.github.com/en/actions/creating-actions/dockerfile-support-for-github-actions#user
|
||||
USER root
|
||||
# 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
|
||||
|
||||
COPY entrypoint.sh /entrypoint.sh
|
||||
RUN chmod +x /entrypoint.sh
|
||||
COPY cleanup.sh /cleanup.sh
|
||||
RUN chmod +x /cleanup.sh
|
||||
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
||||
73
README.md
73
README.md
@@ -1,10 +1,13 @@
|
||||
# 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, 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).
|
||||
|
||||
<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](https://www.sonarsource.com/products/sonarqube/) 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.
|
||||
SonarQube supports the most popular programming languages, including Java, JavaScript, TypeScript, C#, Python, C, C++, and [many more](https://www.sonarsource.com/knowledge/languages/).
|
||||
|
||||
## Requirements
|
||||
|
||||
@@ -14,13 +17,13 @@ Read more information on how to analyze your code [here](https://docs.sonarqube.
|
||||
|
||||
## 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:
|
||||
|
||||
```properties
|
||||
sonar.projectKey=<replace with the key generated when setting up the project on SonarQube>
|
||||
|
||||
# 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.sonarqube.org/latest/project-administration/narrowing-the-focus/
|
||||
sonar.sources=.
|
||||
```
|
||||
|
||||
@@ -28,11 +31,13 @@ The workflow YAML file will usually look something like this:
|
||||
|
||||
```yaml
|
||||
on:
|
||||
# Trigger analysis when pushing in master or pull requests, and when creating
|
||||
# a pull request.
|
||||
# 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]
|
||||
|
||||
@@ -41,22 +46,44 @@ jobs:
|
||||
sonarqube:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v2
|
||||
- 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: SonarQube Scan
|
||||
uses: sonarsource/sonarqube-scan-action@master
|
||||
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||
env:
|
||||
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:
|
||||
|
||||
```yaml
|
||||
- name: SonarQube Scan
|
||||
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
SONAR_HOST_URL: ${{ vars.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:
|
||||
|
||||
```yaml
|
||||
- name: SonarQube Scan
|
||||
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||
env:
|
||||
SONAR_TOKEN: ${{ secrets.SONAR_TOKEN }}
|
||||
SONAR_HOST_URL: ${{ vars.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:
|
||||
|
||||
```yaml
|
||||
- name: SonarQube Scan
|
||||
uses: sonarsource/sonarqube-scan-action@master
|
||||
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||
with:
|
||||
projectBaseDir: app/src
|
||||
```
|
||||
@@ -65,7 +92,7 @@ In case you need to add additional analysis parameters, and you do not wish to s
|
||||
|
||||
```yaml
|
||||
- name: SonarQube Scan
|
||||
uses: sonarsource/sonarqube-scan-action@master
|
||||
uses: sonarsource/sonarqube-scan-action@<action version> # Ex: v2.1.0, See the latest version at https://github.com/marketplace/actions/official-sonarqube-scan
|
||||
with:
|
||||
projectBaseDir: app/src
|
||||
args: >
|
||||
@@ -79,7 +106,8 @@ More information about possible analysis parameters can be found in [the documen
|
||||
### 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_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).
|
||||
- `SONAR_HOST_URL` – **Required** this tells the scanner where SonarQube 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).
|
||||
- `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).
|
||||
|
||||
## Alternatives for Java, .NET, and C/C++ projects
|
||||
|
||||
@@ -88,9 +116,22 @@ This GitHub Action will not work for all technologies. If you are in one of the
|
||||
* 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 Gradle. Read the documentation about our [Scanner for Gradle](https://redirect.sonarsource.com/doc/gradle.html).
|
||||
* 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 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 C and C++](https://github.com/SonarSource/sonarqube-github-c-cpp) GitHub Action.
|
||||
|
||||
## Have question or feedback?
|
||||
## Error cleaning up workspace
|
||||
|
||||
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 `sonarqube-scan-action`) 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, `sonarqube-scan-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 {} +"
|
||||
```
|
||||
You can find more info [here](https://github.com/actions/runner/issues/434).
|
||||
|
||||
## 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).
|
||||
|
||||
@@ -98,4 +139,4 @@ To provide feedback (requesting a feature or reporting a bug) please post on the
|
||||
|
||||
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).
|
||||
@@ -7,6 +7,8 @@ branding:
|
||||
runs:
|
||||
using: docker
|
||||
image: Dockerfile
|
||||
entrypoint: "/entrypoint.sh"
|
||||
post-entrypoint: "/cleanup.sh"
|
||||
inputs:
|
||||
args:
|
||||
description: Additional arguments to the sonar-scanner
|
||||
|
||||
13
cleanup.sh
Executable file
13
cleanup.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
|
||||
# Reset all files permissions to the default Runner user and group to allow the follow up steps (mainly cache) to access all files.
|
||||
|
||||
# Assume that the first (non-hidden) file in the project directory is one from the project, and not one written by the scanner
|
||||
_tmp_file=$(ls "${INPUT_PROJECTBASEDIR%/}/" | head -1)
|
||||
echo "Reading permissions from $_tmp_file"
|
||||
PERM=$(stat -c "%u:%g" "${INPUT_PROJECTBASEDIR%/}/$_tmp_file")
|
||||
|
||||
echo "Applying permissions $PERM to all files in the project base directory"
|
||||
chown -R "$PERM" "${INPUT_PROJECTBASEDIR%/}/"
|
||||
26
contributing.md
Normal file
26
contributing.md
Normal file
@@ -0,0 +1,26 @@
|
||||
Contributing
|
||||
============
|
||||
|
||||
If you would like to see a new feature, please create a new thread in the forum ["Suggest new features"](https://community.sonarsource.com/c/suggestions/features).
|
||||
|
||||
Please be aware that we are not actively looking for feature contributions. The truth is that it's extremely difficult for someone outside SonarSource to comply with our roadmap and expectations. Therefore, we typically only accept minor cosmetic changes and typo fixes.
|
||||
|
||||
## Submitting a pull request
|
||||
|
||||
With that in mind, if you would like to submit a code contribution, please create a pull request for this repository. Please explain your motives to contribute this change: what problem you are trying to fix, what improvement you are trying to make.
|
||||
|
||||
Make sure that you follow our [code style](https://github.com/SonarSource/sonar-developer-toolset#code-style) and all tests are passing (Travis build is executed for each pull request).
|
||||
|
||||
## Next steps
|
||||
|
||||
One of the members of our team will carefully review your pull request. You might be asked at this point for clarifications or your pull request might be rejected if we decide that it doesn't fit our roadmap and vision for the product.
|
||||
If your contribution looks promising then either we will decide:
|
||||
|
||||
- it is good to go and merge your pull request to the master branch
|
||||
|
||||
or
|
||||
|
||||
- that we need to think over your change and modify it to adhere to our roadmap and internal standards. We will close your pull request at this point, but we might come back to your changes later in the future when we decide it is the right time to work on it.
|
||||
|
||||
Thank You!
|
||||
The SonarSource Team
|
||||
@@ -1,27 +1,47 @@
|
||||
#!/bin/bash
|
||||
|
||||
set -e
|
||||
set -eo pipefail
|
||||
|
||||
echo "::warning title=Docker removed in the next major version::Users on the master branch of this GitHub action will be upgraded automatically on December 9th to its next major version, which replaces Docker with a composite action, executing in the runner environment. Self-hosted runners analyzing JS/TS code against SonarQube 10.2 and below will need to have Node JS installed."
|
||||
|
||||
declare -a args=()
|
||||
|
||||
if [[ -z "${SONAR_TOKEN}" ]]; then
|
||||
echo "This GitHub Action requires the SONAR_TOKEN env variable."
|
||||
exit 1
|
||||
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
|
||||
if [[ -n "${SONAR_ROOT_CERT}" ]]; then
|
||||
echo "Adding custom root certificate to the scanner truststore"
|
||||
rm -f /tmp/tmpcert.pem
|
||||
echo "${SONAR_ROOT_CERT}" > /tmp/tmpcert.pem
|
||||
# we can't use the default "sonar" password as keytool requires a password with at least 6 characters
|
||||
args+=("-Dsonar.scanner.truststorePassword=changeit")
|
||||
mkdir -p $SONAR_USER_HOME/ssl
|
||||
keytool -storetype PKCS12 -keystore $SONAR_USER_HOME/ssl/truststore.p12 -storepass changeit -noprompt -trustcacerts -importcert -alias sonarqube -file /tmp/tmpcert.pem
|
||||
# for older SQ versions < 10.6
|
||||
export SONAR_SCANNER_OPTS="${SONAR_SCANNER_OPTS:-} -Djavax.net.ssl.trustStore=$SONAR_USER_HOME/ssl/truststore.p12 -Djavax.net.ssl.trustStorePassword=changeit"
|
||||
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
|
||||
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" ]]; then
|
||||
echo "Gradle project detected. You should use the SonarQube plugin for Gradle during build rather than using this GitHub Action."
|
||||
exit 1
|
||||
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 [[ "$RUNNER_DEBUG" == '1' ]]; then
|
||||
args+=("--debug")
|
||||
fi
|
||||
|
||||
unset JAVA_HOME
|
||||
|
||||
sonar-scanner -Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR} ${INPUT_ARGS}
|
||||
args+=("-Dsonar.projectBaseDir=${INPUT_PROJECTBASEDIR}")
|
||||
|
||||
sonar-scanner "${args[@]}" ${INPUT_ARGS}
|
||||
|
||||
|
||||
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/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
104
test/run-qa.sh
104
test/run-qa.sh
@@ -1,104 +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;
|
||||
}
|
||||
|
||||
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 SONAR_TOKEN=$token --env SONAR_HOST_URL='http://sonarqube:9000' 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
|
||||
fi
|
||||
success "Analysis successful."
|
||||
|
||||
echo "" # new line
|
||||
echo "============================"
|
||||
echo "" # new line
|
||||
success "QA successful!"
|
||||
Reference in New Issue
Block a user