HBASE-27685 Enable code coverage reporting to SonarQube in HBase (#5076)
(cherry picked from commit 72d5a46899
)
This commit is contained in:
parent
ab8aa62030
commit
37a8e5b1c2
|
@ -0,0 +1,49 @@
|
|||
<!--
|
||||
Licensed to the Apache Software Foundation (ASF) under one
|
||||
or more contributor license agreements. See the NOTICE file
|
||||
distributed with this work for additional information
|
||||
regarding copyright ownership. The ASF licenses this file
|
||||
to you under the Apache License, Version 2.0 (the
|
||||
"License"); you may not use this file except in compliance
|
||||
with the License. You may obtain a copy of the License at
|
||||
|
||||
http://www.apache.org/licenses/LICENSE-2.0
|
||||
|
||||
Unless required by applicable law or agreed to in writing, software
|
||||
distributed under the License is distributed on an "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
See the License for the specific language governing permissions and
|
||||
limitations under the License.
|
||||
-->
|
||||
|
||||
# Code analysis
|
||||
|
||||
The `run-coverage.sh` script runs maven with the **jacoco** profile
|
||||
which generates the test coverage data for the java classes.
|
||||
If the required parameters are given it also runs the sonar code analysis
|
||||
and uploads the results to the given SonarQube Server.
|
||||
|
||||
## Running code analysis
|
||||
|
||||
After running the script the reports generated by the JaCoCo
|
||||
code coverage library can be found under the `/target/site/jacoco/` folder of
|
||||
the related modules.
|
||||
|
||||
Here is how you can generate the code coverage report:
|
||||
|
||||
```sh dev/code-coverage/run-coverage.sh```
|
||||
|
||||
## Publishing coverage results to SonarQube
|
||||
|
||||
The required parameters for publishing the results to SonarQube are:
|
||||
|
||||
- host URL,
|
||||
- login credentials,
|
||||
- project key
|
||||
|
||||
The project name is an optional parameter.
|
||||
|
||||
Here is an example command for running and publishing the coverage data:
|
||||
|
||||
`./dev/code-coverage/run-coverage.sh -l ProjectCredentials
|
||||
-u https://exampleserver.com -k Project_Key -n Project_Name`
|
|
@ -0,0 +1,78 @@
|
|||
#!/usr/bin/env bash
|
||||
#
|
||||
# Licensed to the Apache Software Foundation (ASF) under one or more
|
||||
# contributor license agreements. See the NOTICE file distributed with
|
||||
# this work for additional information regarding copyright ownership.
|
||||
# The ASF licenses this file to You under the Apache License, Version 2.0
|
||||
# (the "License"); you may not use this file except in compliance with
|
||||
# the License. You may obtain a copy of the License at
|
||||
#
|
||||
# http://www.apache.org/licenses/LICENSE-2.0
|
||||
#
|
||||
# Unless required by applicable law or agreed to in writing, software
|
||||
# distributed under the License is distributed on an "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
# See the License for the specific language governing permissions and
|
||||
# limitations under the License.
|
||||
#
|
||||
|
||||
usage() {
|
||||
echo
|
||||
echo "Options:"
|
||||
echo " -h Display help"
|
||||
echo " -u SonarQube Host URL"
|
||||
echo " -l SonarQube Login Credentials"
|
||||
echo " -k SonarQube Project Key"
|
||||
echo " -n SonarQube Project Name"
|
||||
echo
|
||||
echo "Important:"
|
||||
echo " The required parameters for publishing the coverage results to SonarQube are:"
|
||||
echo " - Host URL"
|
||||
echo " - Login Credentials"
|
||||
echo " - Project Key"
|
||||
echo
|
||||
}
|
||||
|
||||
execute() {
|
||||
SCRIPT_DIR="$(cd -- "$(dirname -- "${BASH_SOURCE[0]}")" &>/dev/null && pwd)"
|
||||
MAIN_POM="${SCRIPT_DIR}/../../pom.xml"
|
||||
|
||||
echo "Running unit and integration tests with runAllTests profile"
|
||||
|
||||
mvn -B -e -f "${MAIN_POM}" clean test -PrunAllTests -Pjacoco -Pbuild-with-jdk11 -fn
|
||||
|
||||
echo "Starting verifying phase"
|
||||
|
||||
mvn -B -e -f "${MAIN_POM}" verify -DskipTests -DskipITs -Pjacoco -Pbuild-with-jdk11 -fn
|
||||
|
||||
echo "Starting sonar scanner analysis"
|
||||
|
||||
# If the required parameters are given, the code coverage results are uploaded to the SonarQube Server
|
||||
if [ -n "$SONAR_LOGIN" ] && [ -n "$SONAR_PROJECT_KEY" ] && [ -n "$SONAR_URL" ]; then
|
||||
mvn -B -e -f "${MAIN_POM}" sonar:sonar -Dsonar.host.url="$SONAR_URL" \
|
||||
-Dsonar.login="$SONAR_LOGIN" -Dsonar.projectKey="$SONAR_PROJECT_KEY" \
|
||||
-Dsonar.projectName="$SONAR_PROJECT_NAME" -Pjacoco
|
||||
fi
|
||||
|
||||
echo "Build finished"
|
||||
}
|
||||
|
||||
while getopts ":u:l:k:n:h" option; do
|
||||
case $option in
|
||||
u) SONAR_URL=${OPTARG:-} ;;
|
||||
l) SONAR_LOGIN=${OPTARG:-} ;;
|
||||
k) SONAR_PROJECT_KEY=${OPTARG:-} ;;
|
||||
n) SONAR_PROJECT_NAME=${OPTARG:-} ;;
|
||||
h) # Display usage
|
||||
usage
|
||||
exit
|
||||
;;
|
||||
\?) # Invalid option
|
||||
echo "Error: Invalid option"
|
||||
exit
|
||||
;;
|
||||
esac
|
||||
done
|
||||
|
||||
# Start code analysis
|
||||
execute
|
|
@ -304,7 +304,7 @@
|
|||
<forkedProcessTimeoutInSeconds>1800</forkedProcessTimeoutInSeconds>
|
||||
<argLine>-enableassertions -Xmx${failsafe.Xmx}
|
||||
-Djava.security.egd=file:/dev/./urandom -XX:+CMSClassUnloadingEnabled
|
||||
-verbose:gc -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal</argLine>
|
||||
-verbose:gc -XX:+PrintCommandLineFlags -XX:+PrintFlagsFinal @{jacocoArgLine}</argLine>
|
||||
</configuration>
|
||||
</plugin>
|
||||
<plugin>
|
||||
|
|
33
pom.xml
33
pom.xml
|
@ -647,6 +647,10 @@
|
|||
<xz.version>1.9</xz.version>
|
||||
<zstd-jni.version>1.5.0-4</zstd-jni.version>
|
||||
<hbase-thirdparty.version>4.1.4</hbase-thirdparty.version>
|
||||
<!-- Coverage properties -->
|
||||
<jacoco.version>0.8.8</jacoco.version>
|
||||
<jacocoArgLine/>
|
||||
<sonar-maven-plugin.version>3.9.1.2184</sonar-maven-plugin.version>
|
||||
<!-- Intraproject jar naming properties -->
|
||||
<!-- TODO this is pretty ugly, but works for the moment.
|
||||
Modules are pretty heavy-weight things, so doing this work isn't too bad. -->
|
||||
|
@ -704,8 +708,7 @@
|
|||
-Dorg.apache.hbase.thirdparty.io.netty.leakDetection.level=advanced
|
||||
-Dio.opentelemetry.context.enableStrictContext=true</hbase-surefire.cygwin-argLine>
|
||||
<!-- Surefire argLine defaults to Linux, cygwin argLine is used in the os.windows profile -->
|
||||
<argLine>${hbase-surefire.argLine}</argLine>
|
||||
<jacoco.version>0.7.5.201505241946</jacoco.version>
|
||||
<argLine>${hbase-surefire.argLine} @{jacocoArgLine}</argLine>
|
||||
<extra.enforcer.version>1.5.1</extra.enforcer.version>
|
||||
<enforcer.version>3.0.0</enforcer.version>
|
||||
<restrict-imports.enforcer.version>0.14.0</restrict-imports.enforcer.version>
|
||||
|
@ -2892,7 +2895,8 @@
|
|||
--add-opens java.base/jdk.internal.util.random=ALL-UNNAMED
|
||||
--add-exports java.base/jdk.internal.misc=ALL-UNNAMED
|
||||
--add-exports java.security.jgss/sun.security.krb5=ALL-UNNAMED
|
||||
${hbase-surefire.argLine}</argLine>
|
||||
${hbase-surefire.argLine}
|
||||
@{jacocoArgLine}</argLine>
|
||||
<!--
|
||||
Value to use for surefire when running jdk11.
|
||||
TODO: replicate logic for windows
|
||||
|
@ -3000,6 +3004,12 @@
|
|||
<activation>
|
||||
<activeByDefault>false</activeByDefault>
|
||||
</activation>
|
||||
<properties>
|
||||
<sonar.exclusions>**/generated/**/*</sonar.exclusions>
|
||||
<sonar.coverage.exclusions>**/generated/**/*,hbase-it/**,**/hbase-logging/**/*,**/hbase-testing-util/**/*,
|
||||
**/hbase-protocol-shaded/**/*,**/hbase-external-blockcache/**/*,**/hbase-examples/**/*,
|
||||
**/hbase-archetypes/**/*</sonar.coverage.exclusions>
|
||||
</properties>
|
||||
<build>
|
||||
<plugins>
|
||||
<plugin>
|
||||
|
@ -3007,11 +3017,8 @@
|
|||
<artifactId>jacoco-maven-plugin</artifactId>
|
||||
<version>${jacoco.version}</version>
|
||||
<configuration>
|
||||
<systemPropertyVariables>
|
||||
<jacoco-agent.destfile>target/jacoco.exec</jacoco-agent.destfile>
|
||||
</systemPropertyVariables>
|
||||
<excludes>
|
||||
<exclude>**/generated/**/*.class</exclude>
|
||||
<exclude>**/generated/**/*</exclude>
|
||||
</excludes>
|
||||
</configuration>
|
||||
<executions>
|
||||
|
@ -3020,6 +3027,11 @@
|
|||
<goals>
|
||||
<goal>prepare-agent</goal>
|
||||
</goals>
|
||||
<phase>initialize</phase>
|
||||
<configuration>
|
||||
<propertyName>jacocoArgLine</propertyName>
|
||||
<append>true</append>
|
||||
</configuration>
|
||||
</execution>
|
||||
<execution>
|
||||
<id>report</id>
|
||||
|
@ -3030,6 +3042,11 @@
|
|||
</execution>
|
||||
</executions>
|
||||
</plugin>
|
||||
<plugin>
|
||||
<groupId>org.sonarsource.scanner.maven</groupId>
|
||||
<artifactId>sonar-maven-plugin</artifactId>
|
||||
<version>${sonar-maven-plugin.version}</version>
|
||||
</plugin>
|
||||
</plugins>
|
||||
</build>
|
||||
</profile>
|
||||
|
@ -3065,7 +3082,7 @@
|
|||
</activation>
|
||||
<properties>
|
||||
<build.platform>cygwin</build.platform>
|
||||
<argLine>${hbase-surefire.cygwin-argLine}</argLine>
|
||||
<argLine>${hbase-surefire.cygwin-argLine} @{jacocoArgLine}</argLine>
|
||||
</properties>
|
||||
</profile>
|
||||
<!-- this profile should match the name of the release profile in the root asf pom -->
|
||||
|
|
Loading…
Reference in New Issue