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}
+
+
+
+