diff --git a/dev-support/code-coverage/README.md b/dev-support/code-coverage/README.md new file mode 100644 index 0000000000..8dad70e5b1 --- /dev/null +++ b/dev-support/code-coverage/README.md @@ -0,0 +1,47 @@ + + +# Code analysis + +The `run-coverage.sh` script runs maven with the coverage profile which generates the test coverage +data for java classes. +If the required parameters are given it also runs the sonar analysis and uploads the results to the +given SonarQube Server. + +## Running code analysis + +After running the script the code coverage results generated by the JaCoCo library can be found +under the `/target/jacoco-coverage/` folder of every module. + +Here is how you can generate the code coverage reports: + +```sh dev-support/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: + +```sh dev-support/code-coverage/run-coverage.sh -l LoginCredentials -u https://exampleserver.com -k Key -n Name``` diff --git a/dev-support/code-coverage/run-coverage.sh b/dev-support/code-coverage/run-coverage.sh new file mode 100755 index 0000000000..e2bf5a32f4 --- /dev/null +++ b/dev-support/code-coverage/run-coverage.sh @@ -0,0 +1,77 @@ +#!/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:" + 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" + + # Check the syntax for the thread variable + if [[ "$THREAD_COUNT" =~ ^[0-9]+([.][0-9]+)?$ ]] || [[ "$THREAD_COUNT" =~ ^[0-9]+([.][0-9]+)+[C]?$ ]]; then + THREADS="${THREAD_COUNT}" + else + THREADS=1 + fi + + mvn -B -e -f "$MAIN_POM" clean verify -Pcoverage -fn -T "$THREADS" + + # 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 -Pcoverage sonar:sonar -fn -T "$THREADS" -Dsonar.host.url="$SONAR_URL" -Dsonar.login="$SONAR_LOGIN" \ + -Dsonar.projectKey="$SONAR_PROJECT_KEY" -Dsonar.projectName="$SONAR_PROJECT_NAME" + fi +} + +while getopts ":u:l:k:n:t:h" option; do + case $option in + u) SONAR_URL=${OPTARG:-} ;; + l) SONAR_LOGIN=${OPTARG:-} ;; + k) SONAR_PROJECT_KEY=${OPTARG:-} ;; + n) SONAR_PROJECT_NAME=${OPTARG:-} ;; + t) THREAD_COUNT=${OPTARG:-} ;; + h) # Display usage + usage + exit + ;; + \?) # Invalid option + echo "Error: Invalid option" + exit + ;; + esac +done + +# Start code analysis +execute diff --git a/pom.xml b/pom.xml index 5d176b7b0d..d14cb81f33 100644 --- a/pom.xml +++ b/pom.xml @@ -115,6 +115,10 @@ + + + 0.8.8 + 3.9.1.2184 @@ -1128,5 +1132,55 @@ + + coverage + + false + + + **/curator-examples/**/* + + ${project.build.directory}/jacoco-coverage/jacoco.xml + + + + + + org.jacoco + jacoco-maven-plugin + ${jacoco.version} + + + prepare-agent + initialize + + prepare-agent + + + ${project.build.directory}/jacoco-coverage/jacoco.exec + + + + report + + report + + + ${project.build.directory}/jacoco-coverage/jacoco.exec + + ${project.build.directory}/jacoco-coverage + + + + + + + org.sonarsource.scanner.maven + sonar-maven-plugin + ${sonar.version} + + + +