This is an automated email from the ASF dual-hosted git repository.

shuber pushed a commit to branch master
in repository https://gitbox.apache.org/repos/asf/unomi.git


The following commit(s) were added to refs/heads/master by this push:
     new 205f5815d UNOMI-887: Introduce consolidated build.sh; remove legacy 
build scripts (#737)
205f5815d is described below

commit 205f5815d1f46b533c678c799db9bf5c64f9964a
Author: Serge Huber <[email protected]>
AuthorDate: Fri Nov 28 09:04:37 2025 +0100

    UNOMI-887: Introduce consolidated build.sh; remove legacy build scripts 
(#737)
    
    * UNOMI-887: Introduce consolidated build.sh; remove legacy build scripts
    Add build.sh: unified build/deploy/run script with robust error handling, 
colorized/structured output, and preflight checks (tools, system resources, 
Maven settings, ports).
    Support rich CLI options: tests/integration, OpenSearch, 
debug/ports/suspend, offline/cache control, migration-test skip, single-test, 
deploy to Karaf.
    Replace legacy scripts: remove buildAndRun.sh, buildAndRunNoTests.sh, 
compileDeploy.sh, generate-package.sh.
    Improve DX: clearer failures, consistent workflows across environments, 
NO_COLOR adherence, macOS/Linux friendly (incl. Apple Silicon hints).
    Notes: deployment expects UNOMI_VERSION for KAR/package paths; optional Geo 
databases copied when present.
    No code changes to modules; build behavior is unchanged unless new flags 
are used.
    
    * Address PR review comments for build.sh script
    
    - Fix color readability in build.sh examples section: replace GRAY with NC
      (no color) for better terminal readability. Use NC once at the start
      instead of wrapping each line with color codes.
    
    - Add comprehensive documentation for build.sh script in Building section:
      * Add brief mention at the start of Building section with cross-reference
      * Add new "Using the build.sh script" subsection with:
        - Overview of script features and benefits
        - Step-by-step usage instructions
        - Complete set of examples matching build.sh --help output
        - All examples use plain commands without prompt markers
    
    - Minor formatting: align help output option descriptions for consistency
    
    The documentation examples now exactly match those displayed by build.sh 
--help,
    ensuring consistency between the script and its documentation.
---
 build.sh                                           | 1120 ++++++++++++++++++++
 buildAndRun.sh                                     |   38 -
 buildAndRunNoTests.sh                              |   46 -
 compileDeploy.sh                                   |   37 -
 generate-package.sh                                |   22 -
 .../src/main/asciidoc/building-and-deploying.adoc  |   95 ++
 6 files changed, 1215 insertions(+), 143 deletions(-)

diff --git a/build.sh b/build.sh
new file mode 100755
index 000000000..19dd5d0f6
--- /dev/null
+++ b/build.sh
@@ -0,0 +1,1120 @@
+#!/bin/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.
+#
+################################################################################
+
+set -e  # Exit on error
+trap 'handle_error $? $LINENO $BASH_LINENO "$BASH_COMMAND" $(printf "::%s" 
${FUNCNAME[@]:-})' ERR
+
+# Error handling function
+handle_error() {
+    local exit_code=$1
+    local line_no=$2
+    local bash_lineno=$3
+    local last_command=$4
+    local func_trace=$5
+
+    cat << "EOF"
+     _____ ____  ____   ___  ____
+    | ____|  _ \|  _ \ / _ \|  _ \
+    |  _| | |_) | |_) | | | | |_) |
+    | |___|  _ <|  _ <| |_| |  _ <
+    |_____|_| \_\_| \_\\___/|_| \_\
+
+EOF
+    echo "Error occurred in:"
+    echo "  Command: $last_command"
+    echo "  Line: $line_no"
+    echo "  Exit code: $exit_code"
+    if [ ! -z "$func_trace" ]; then
+        echo "  Function trace: $func_trace"
+    fi
+    exit $exit_code
+}
+
+# Function to detect color support
+setup_colors() {
+    # Only use colors if connected to a terminal
+    if [ -t 1 ]; then
+        # Check if NO_COLOR is set (https://no-color.org/)
+        if [ -z "${NO_COLOR+x}" ]; then
+            # Check if terminal supports colors
+            if [ -n "$TERM" ] && [ "$TERM" != "dumb" ]; then
+                # Check if tput is available
+                if command -v tput > /dev/null && tput setaf 1 >&/dev/null; 
then
+                    RED='\033[0;31m'
+                    GREEN='\033[0;32m'
+                    YELLOW='\033[1;33m'
+                    BLUE='\033[0;34m'
+                    MAGENTA='\033[0;35m'
+                    CYAN='\033[0;36m'
+                    GRAY='\033[0;90m'
+                    BOLD='\033[1m'
+                    NC='\033[0m' # No Color
+
+                    # Unicode symbols (only if terminal likely supports UTF-8)
+                    if [ "$TERM" != "linux" ] && [ -n "$LANG" ] && [ "$LANG" 
!= "C" ]; then
+                        CHECK_MARK="✔"
+                        CROSS_MARK="✘"
+                        ARROW="➜"
+                        WARNING="⚠"
+                        INFO="ℹ"
+                    else
+                        CHECK_MARK="(+)"
+                        CROSS_MARK="(x)"
+                        ARROW="(>)"
+                        WARNING="(!)"
+                        INFO="(i)"
+                    fi
+
+                    HAS_COLORS=1
+                fi
+            fi
+        fi
+    fi
+
+    # If colors are not supported or disabled, use plain text without escape 
sequences
+    if [ -z "${HAS_COLORS+x}" ]; then
+        RED=''
+        GREEN=''
+        YELLOW=''
+        BLUE=''
+        MAGENTA=''
+        CYAN=''
+        GRAY=''
+        BOLD=''
+        NC=''
+
+        # Use ASCII alternatives without escape sequences
+        CHECK_MARK="(+)"
+        CROSS_MARK="(x)"
+        ARROW="(>)"
+        WARNING="(!)"
+        INFO="(i)"
+
+        HAS_COLORS=0
+    fi
+}
+
+# Initialize colors early
+setup_colors
+
+# Function to print section headers
+print_section() {
+    local text="$1"
+    local text_length=${#text}
+    local total_width=80  # Standard terminal width
+    local padding_length=$(( (total_width - text_length - 4) / 2 ))  # -4 for 
the borders and spaces
+    local left_padding=""
+    local right_padding=""
+
+    # Create padding strings of spaces for the text line
+    for ((i=0; i<padding_length; i++)); do
+        left_padding+=" "
+        right_padding+=" "
+    done
+
+    # Adjust right padding for odd lengths
+    if [ $(( (total_width - text_length) % 2 )) -eq 1 ]; then
+        right_padding+=" "
+    fi
+
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        echo -e 
"\n${BLUE}╔════════════════════════════════════════════════════════════════════════════╗${NC}"
+        echo -e 
"${BLUE}║${NC}${left_padding}${BOLD}${text}${NC}${right_padding}${BLUE}║${NC}"
+        echo -e 
"${BLUE}╚════════════════════════════════════════════════════════════════════════════╝${NC}"
+    else
+        echo -e 
"\n+------------------------------------------------------------------------------+"
+        echo -e "| ${left_padding}${text}${right_padding} |"
+        echo 
"+------------------------------------------------------------------------------+"
+    fi
+}
+
+# Function to print status messages
+print_status() {
+    local status=$1
+    local message=$2
+    
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        case $status in
+            "success")
+                echo -e " ${GREEN}${CHECK_MARK}${NC} ${GREEN}${message}${NC}"
+                ;;
+            "error")
+                echo -e " ${RED}${CROSS_MARK}${NC} ${RED}${message}${NC}"
+                ;;
+            "warning")
+                echo -e " ${YELLOW}${WARNING}${NC} ${YELLOW}${message}${NC}"
+                ;;
+            "info")
+                echo -e " ${CYAN}${INFO}${NC} ${CYAN}${message}${NC}"
+                ;;
+            *)
+                echo -e " ${BLUE}${ARROW}${NC} ${message}"
+                ;;
+        esac
+    else
+        # No colors - use plain text without escape sequences
+        local symbol
+        case $status in
+            "success")
+                symbol="${CHECK_MARK}"
+                ;;
+            "error")
+                symbol="${CROSS_MARK}"
+                ;;
+            "warning")
+                symbol="${WARNING}"
+                ;;
+            "info")
+                symbol="${INFO}"
+                ;;
+            *)
+                symbol="${ARROW}"
+                ;;
+        esac
+        echo " ${symbol} ${message}"
+    fi
+}
+
+# Enhanced progress tracking
+print_progress() {
+    local current=$1
+    local total=$2
+    local message=$3
+    local percentage=$((current * 100 / total))
+
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        local filled=$((percentage / 2))
+        local empty=$((50 - filled))
+
+        local progress="["
+        for ((i=0; i<filled; i++)); do progress+="█"; done
+        for ((i=0; i<empty; i++)); do progress+="░"; done
+        progress+="]"
+
+        echo -e "\r${CYAN}${progress}${NC} ${percentage}% 
${GRAY}${message}${NC}"
+    else
+        local filled=$((percentage / 4))
+        local empty=$((25 - filled))
+
+        local progress="["
+        for ((i=0; i<filled; i++)); do progress+="#"; done
+        for ((i=0; i<empty; i++)); do progress+="-"; done
+        progress+="]"
+
+        echo -e "\r${progress} ${percentage}% ${message}"
+    fi
+}
+
+# Function to prompt for continuation
+prompt_continue() {
+    local prompt_text="$1"
+    if [ -z "$prompt_text" ]; then
+        prompt_text="Continue?"
+    fi
+    
+    read -p "$prompt_text (y/N) " -n 1 -r
+    echo
+    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+        exit 1
+    fi
+}
+
+# Add the new section header
+print_section "Apache Unomi Build Script"
+
+# Default values
+SKIP_TESTS=false
+RUN_INTEGRATION_TESTS=false
+DEPLOY=false
+DEBUG=false
+USE_MAVEN_CACHE=true
+PURGE_MAVEN_CACHE=false
+MAVEN_DEBUG=false
+MAVEN_OFFLINE=false
+KARAF_DEBUG_PORT=5005
+KARAF_DEBUG_SUSPEND=n
+USE_OPENSEARCH=false
+NO_KARAF=false
+AUTO_START=""
+SINGLE_TEST=""
+IT_DEBUG=false
+IT_DEBUG_PORT=5006
+IT_DEBUG_SUSPEND=false
+SKIP_MIGRATION_TESTS=false
+
+# Enhanced usage function with color support
+usage() {
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        echo -e "${CYAN}"
+        cat << "EOF"
+     _    _ _____ _      ____
+    | |  | |  ___| |    |  _ \
+    | |__| | |__ | |    | |_) |
+    |  __  |  __|| |    |  __/
+    | |  | | |___| |____| |
+    |_|  |_\_____|______|_|
+EOF
+        echo -e "${NC}"
+
+        echo -e "${BOLD}Usage:${NC} $0 [options]"
+        echo
+        echo -e "${BOLD}Options:${NC}"
+        echo -e "  ${CYAN}-h, --help${NC}                 Show this help 
message"
+        echo -e "  ${CYAN}-s, --skip-tests${NC}           Skip all tests"
+        echo -e "  ${CYAN}-i, --integration-tests${NC}    Run integration 
tests"
+        echo -e "  ${CYAN}-d, --deploy${NC}               Deploy after build"
+        echo -e "  ${CYAN}-X, --maven-debug${NC}          Enable Maven debug 
output"
+        echo -e "  ${CYAN}-o, --offline${NC}              Run Maven in offline 
mode"
+        echo -e "  ${CYAN}--debug${NC}                    Run Karaf in debug 
mode"
+        echo -e "  ${CYAN}--debug-port PORT${NC}          Set debug port 
(default: 5005)"
+        echo -e "  ${CYAN}--debug-suspend${NC}            Suspend JVM until 
debugger connects"
+        echo -e "  ${CYAN}--no-maven-cache${NC}           Disable Maven build 
cache"
+        echo -e "  ${CYAN}--purge-maven-cache${NC}        Purge local Maven 
cache before building"
+        echo -e "  ${CYAN}--karaf-home PATH${NC}          Set Karaf home 
directory for deployment"
+        echo -e "  ${CYAN}--use-opensearch${NC}           Use OpenSearch 
instead of ElasticSearch"
+        echo -e "  ${CYAN}--no-karaf${NC}                 Build without 
starting Karaf"
+        echo -e "  ${CYAN}--auto-start ENGINE${NC}        Auto-start with 
specified engine"
+        echo -e "  ${CYAN}--single-test TEST${NC}         Run a single 
integration test"
+        echo -e "  ${CYAN}--it-debug${NC}                 Enable integration 
test debug mode"
+        echo -e "  ${CYAN}--it-debug-port PORT${NC}       Set integration test 
debug port"
+        echo -e "  ${CYAN}--it-debug-suspend${NC}         Suspend integration 
test until debugger connects"
+        echo -e "  ${CYAN}--skip-migration-tests${NC}     Skip 
migration-related tests"
+    else
+        cat << "EOF"
+     _    _ _____ _      ____
+    | |  | |  ___| |    |  _ \
+    | |__| | |__ | |    | |_) |
+    |  __  |  __|| |    |  __/
+    | |  | | |___| |____| |
+    |_|  |_\_____|______|_|
+EOF
+        echo
+        echo "Usage: $0 [options]"
+        echo
+        echo "Options:"
+        echo "  -h, --help                 Show this help message"
+        echo "  -s, --skip-tests           Skip all tests"
+        echo "  -i, --integration-tests    Run integration tests"
+        echo "  -d, --deploy               Deploy after build"
+        echo "  -X, --maven-debug         Enable Maven debug output"
+        echo "  -o, --offline             Run Maven in offline mode"
+        echo "  --debug                    Run Karaf in debug mode"
+        echo "  --debug-port PORT          Set debug port (default: 5005)"
+        echo "  --debug-suspend           Suspend JVM until debugger connects"
+        echo "  --no-maven-cache           Disable Maven build cache"
+        echo "  --purge-maven-cache        Purge local Maven cache before 
building"
+        echo "  --karaf-home PATH          Set Karaf home directory for 
deployment"
+        echo "  --use-opensearch          Use OpenSearch instead of 
ElasticSearch"
+        echo "  --no-karaf               Build without starting Karaf"
+        echo "  --auto-start ENGINE      Auto-start with specified engine"
+        echo "  --single-test TEST         Run a single integration test"
+        echo "  --it-debug                Enable integration test debug mode"
+        echo "  --it-debug-port PORT      Set integration test debug port"
+        echo "  --it-debug-suspend        Suspend integration test until 
debugger connects"
+        echo "  --skip-migration-tests    Skip migration-related tests"
+    fi
+
+    echo
+    echo "Examples:"
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        # Reset to default terminal color for examples (better readability)
+        echo -e "${NC}"
+        echo "  # Build with integration tests using OpenSearch"
+        echo "  $0 --integration-tests --use-opensearch"
+        echo
+        echo "  # Build in debug mode"
+        echo "  $0 --debug --debug-port 5006 --debug-suspend"
+        echo
+        echo "  # Deploy to specific Karaf instance"
+        echo "  $0 --deploy --karaf-home ~/apache-karaf"
+        echo
+        echo "  # Build without Karaf and auto-start OpenSearch"
+        echo "  $0 --no-karaf --auto-start opensearch"
+        echo
+        echo "  # Run a single integration test"
+        echo "  $0 --integration-tests --single-test 
org.apache.unomi.itests.graphql.GraphQLEventIT"
+        echo
+        echo "  # Debug a single integration test"
+        echo "  $0 --integration-tests --single-test 
org.apache.unomi.itests.graphql.GraphQLEventIT --it-debug --it-debug-suspend"
+        echo
+        echo "  # Run without colored output"
+        echo "  NO_COLOR=1 $0"
+        echo "  # or"
+        echo "  export NO_COLOR=1"
+        echo "  $0"
+    else
+        echo "  # Build with integration tests using OpenSearch"
+        echo "  $0 --integration-tests --use-opensearch"
+        echo
+        echo "  # Build in debug mode"
+        echo "  $0 --debug --debug-port 5006 --debug-suspend"
+        echo
+        echo "  # Deploy to specific Karaf instance"
+        echo "  $0 --deploy --karaf-home ~/apache-karaf"
+        echo
+        echo "  # Build without Karaf and auto-start OpenSearch"
+        echo "  $0 --no-karaf --auto-start opensearch"
+        echo
+        echo "  # Run a single integration test"
+        echo "  $0 --integration-tests --single-test 
org.apache.unomi.itests.graphql.GraphQLEventIT"
+        echo
+        echo "  # Debug a single integration test"
+        echo "  $0 --integration-tests --single-test 
org.apache.unomi.itests.graphql.GraphQLEventIT --it-debug --it-debug-suspend"
+        echo
+        echo "  # Run without colored output"
+        echo "  NO_COLOR=1 $0"
+        echo "  # or"
+        echo "  export NO_COLOR=1"
+        echo "  $0"
+    fi
+    exit 1
+}
+
+# Parse command line arguments
+while [ "$1" != "" ]; do
+    case $1 in
+        -h | --help)
+            usage
+            ;;
+        -X | --maven-debug)
+            MAVEN_DEBUG=true
+            ;;
+        -o | --offline)
+            MAVEN_OFFLINE=true
+            ;;
+        -s | --skip-tests)
+            SKIP_TESTS=true
+            ;;
+        -i | --integration-tests)
+            RUN_INTEGRATION_TESTS=true
+            ;;
+        -d | --deploy)
+            DEPLOY=true
+            ;;
+        --debug)
+            DEBUG=true
+            ;;
+        --debug-port)
+            shift
+            KARAF_DEBUG_PORT=$1
+            ;;
+        --debug-suspend)
+            KARAF_DEBUG_SUSPEND=y
+            ;;
+        --no-maven-cache)
+            USE_MAVEN_CACHE=false
+            ;;
+        --purge-maven-cache)
+            PURGE_MAVEN_CACHE=true
+            ;;
+        --karaf-home)
+            shift
+            CONTEXT_SERVER_KARAF_HOME=$1
+            ;;
+        --use-opensearch)
+            USE_OPENSEARCH=true
+            ;;
+        --no-karaf)
+            NO_KARAF=true
+            ;;
+        --auto-start)
+            shift
+            if [[ "$1" != "elasticsearch" && "$1" != "opensearch" ]]; then
+                echo "Error: --auto-start must be either 'elasticsearch' or 
'opensearch'"
+                exit 1
+            fi
+            AUTO_START="$1"
+            ;;
+        --single-test)
+            shift
+            SINGLE_TEST="$1"
+            ;;
+        --it-debug)
+            IT_DEBUG=true
+            ;;
+        --it-debug-port)
+            shift
+            IT_DEBUG_PORT=$1
+            ;;
+        --it-debug-suspend)
+            IT_DEBUG_SUSPEND=true
+            ;;
+        --skip-migration-tests)
+            SKIP_MIGRATION_TESTS=true
+            ;;
+        *)
+            echo "Unknown option: $1"
+            usage
+            ;;
+    esac
+    shift
+done
+
+# Set environment
+DIRNAME=`dirname "$0"`
+PROGNAME=`basename "$0"`
+if [ -f "$DIRNAME/setenv.sh" ]; then
+    . "$DIRNAME/setenv.sh"
+fi
+
+# Purge Maven cache if requested
+if [ "$PURGE_MAVEN_CACHE" = true ]; then
+    echo "Purging Maven cache..."
+    rm -rf ~/.m2/build-cache ~/.m2/dependency-cache ~/.m2/dependency-cache_v2
+    echo "Maven cache purged."
+fi
+
+# Function to check if command exists
+command_exists() {
+    command -v "$1" >/dev/null 2>&1
+}
+
+# Comprehensive function to check all requirements
+check_requirements() {
+    print_section "System Requirements Check"
+    local has_warnings=false
+    local has_errors=false
+
+    # 1. Required Tools Check
+    print_status "info" "Checking required tools..."
+    local required_tools=("mvn" "java" "tar" "gzip" "dot")
+    local missing_tools=()
+    
+    echo "Required tools:"
+    for tool in "${required_tools[@]}"; do
+        if command_exists "$tool"; then
+            case "$tool" in
+                java)
+                    java_version=$(java -version 2>&1 | awk -F '"' '/version/ 
{print $2}')
+                    if [[ "$java_version" =~ ^1[1-9]\. || "$java_version" =~ 
^[2-9][0-9]\. ]]; then
+                        print_status "success" "✓ Java ${java_version}"
+                    else
+                        print_status "error" "✗ Java ${java_version} (version 
11 or higher required)"
+                        echo "Please install Java 11 or higher:"
+                        if [[ "$(uname -sm)" == "Darwin arm64" ]]; then
+                            echo "Apple Silicon (M1/M2) detected, recommended 
options:"
+                            echo "  - Download native arm64 build from: 
https://adoptium.net/ (recommended)"
+                            echo "  - Using Homebrew: brew install --cask 
temurin"
+                            echo "  - Azul Zulu: 
https://www.azul.com/downloads/?os=macos&architecture=arm-64-bit";
+                            echo "Note: For best performance, ensure you're 
using an arm64 native JDK"
+                        else
+                            echo "  - Download from: https://adoptium.net/ 
(recommended)"
+                            echo "  - Or use your system's package manager:"
+                            echo "    - macOS: brew install --cask temurin"
+                            echo "    - Ubuntu/Debian: sudo apt install 
openjdk-11-jdk"
+                            echo "    - CentOS/RHEL: sudo yum install 
java-11-openjdk-devel"
+                        fi
+                        echo "  - See BUILDING.md in the project root for more 
details"
+                        has_errors=true
+                    fi
+                    ;;
+                mvn)
+                    if [ "$MAVEN_OFFLINE" = false ]; then
+                        mvn_version=$(mvn --version | head -n 1)
+                        print_status "success" "✓ ${mvn_version}"
+                    else
+                        print_status "success" "✓ Maven (offline mode enabled)"
+                    fi
+                    ;;
+                dot)
+                    dot_version=$(dot -V 2>&1)
+                    print_status "success" "✓ GraphViz: ${dot_version}"
+                    # Set GRAPHVIZ_DOT if not already set
+                    if [ -z "$GRAPHVIZ_DOT" ]; then
+                        export GRAPHVIZ_DOT=$(command -v dot)
+                        MVN_OPTS="$MVN_OPTS -Dgraphviz.dot.path=$GRAPHVIZ_DOT"
+                    fi
+                    ;;
+                *)
+                    print_status "success" "✓ ${tool}"
+                    ;;
+            esac
+        else
+            missing_tools+=("$tool")
+            print_status "error" "✗ ${tool} not found"
+            case "$tool" in
+                java)
+                    echo "Please install Java 11 or higher:"
+                    if [[ "$(uname -sm)" == "Darwin arm64" ]]; then
+                        echo "Apple Silicon (M1/M2) detected, recommended 
options:"
+                        echo "  - Download native arm64 build from: 
https://adoptium.net/ (recommended)"
+                        echo "  - Using Homebrew: brew install --cask temurin"
+                        echo "  - Azul Zulu: 
https://www.azul.com/downloads/?os=macos&architecture=arm-64-bit";
+                        echo "Note: For best performance, ensure you're using 
an arm64 native JDK"
+                    else
+                        echo "  - Download from: https://adoptium.net/ 
(recommended)"
+                        echo "  - Or use your system's package manager:"
+                        echo "    - macOS: brew install --cask temurin"
+                        echo "    - Ubuntu/Debian: sudo apt install 
openjdk-11-jdk"
+                        echo "    - CentOS/RHEL: sudo yum install 
java-11-openjdk-devel"
+                    fi
+                    echo "  - See BUILDING.md in the project root for more 
details"
+                    ;;
+                mvn)
+                    echo "Please install Maven 3.6 or higher:"
+                    echo "  - Download from: 
https://maven.apache.org/download.cgi";
+                    echo "  - Or use your system's package manager:"
+                    echo "    - macOS: brew install maven"
+                    echo "    - Ubuntu/Debian: sudo apt install maven"
+                    echo "    - CentOS/RHEL: sudo yum install maven"
+                    echo "  - See installation guide: 
https://maven.apache.org/install.html";
+                    echo "  - See BUILDING.md in the project root for more 
details"
+                    ;;
+                dot)
+                    echo "Please install GraphViz (required for documentation 
generation):"
+                    echo "  - Project page: https://graphviz.org/download/";
+                    echo "  - Package managers:"
+                    echo "    - macOS: brew install graphviz"
+                    echo "    - Ubuntu/Debian: sudo apt install graphviz"
+                    echo "    - CentOS/RHEL: sudo yum install graphviz"
+                    echo "  - See BUILDING.md in the project root for more 
details"
+                    ;;
+                tar|gzip)
+                    echo "Please install required system utilities:"
+                    echo "  - macOS: These should be pre-installed"
+                    echo "  - Ubuntu/Debian: sudo apt install tar gzip"
+                    echo "  - CentOS/RHEL: sudo yum install tar gzip"
+                    ;;
+            esac
+            has_errors=true
+        fi
+    done
+    echo
+
+    # 3. System Resources Check
+    print_status "info" "Checking system resources..."
+    
+    # Memory check
+    if command_exists free; then
+        available_memory=$(free -m | awk '/^Mem:/{print $2}')
+        if [ "$available_memory" -lt 2048 ]; then
+            print_status "warning" "✗ Memory: ${available_memory}MB available 
(2048MB recommended)"
+            echo "Tips to free up memory:"
+            echo "  - Close unnecessary applications"
+            echo "  - Clear browser cache and tabs"
+            echo "  - Check for memory-intensive processes: top or htop"
+            echo "  - If using a VM, consider increasing its memory allocation"
+            has_warnings=true
+        else
+            print_status "success" "✓ Memory: ${available_memory}MB available"
+        fi
+    else
+        print_status "warning" "? Memory check not available"
+        echo "Note: Memory check is not available on macOS by default"
+        echo "You can install htop for memory monitoring: brew install htop"
+        has_warnings=true
+    fi
+
+    # Disk space check
+    if command_exists df; then
+        available_disk=$(df -m . | awk 'NR==2 {print $4}')
+        if [ "$available_disk" -lt 1024 ]; then
+            print_status "warning" "✗ Disk space: ${available_disk}MB 
available (1024MB recommended)"
+            echo "Tips to free up disk space:"
+            echo "  - Clear Maven cache: rm -rf ~/.m2/repository"
+            echo "  - Clear Docker images/containers if using Docker"
+            echo "  - Use 'du -sh *' to identify large directories"
+            echo "  - Consider running: mvn clean"
+            has_warnings=true
+        else
+            print_status "success" "✓ Disk space: ${available_disk}MB 
available"
+        fi
+    else
+        print_status "warning" "? Disk space check not available"
+        has_warnings=true
+    fi
+    echo
+
+    # 4. Configuration Check
+    print_status "info" "Checking configuration..."
+    
+    # Maven settings check
+    if [ ! -f ~/.m2/settings.xml ]; then
+        print_status "warning" "✗ Maven settings.xml not found"
+        echo "Tips for Maven configuration:"
+        echo "  - Create a minimal settings.xml:"
+        echo "    mkdir -p ~/.m2"
+        echo "    echo 
'<settings><localRepository>\${user.home}/.m2/repository</localRepository></settings>'
 > ~/.m2/settings.xml"
+        echo "  - Or copy the example from: 
https://maven.apache.org/settings.html";
+        echo "  - See also: BUILDING.md in the project root for 
project-specific settings"
+        has_warnings=true
+    else
+        print_status "success" "✓ Maven settings.xml found"
+    fi
+
+    # Debug port check if debug mode is enabled
+    if [ "$DEBUG" = true ]; then
+        if ! [[ "$KARAF_DEBUG_PORT" =~ ^[0-9]+$ ]] || [ "$KARAF_DEBUG_PORT" 
-lt 1024 ] || [ "$KARAF_DEBUG_PORT" -gt 65535 ]; then
+            print_status "error" "✗ Debug port: $KARAF_DEBUG_PORT (invalid)"
+            echo "Please specify a valid port with --debug-port option"
+            echo "Common debug ports: 5005 (default), 8000, 8453"
+            has_errors=true
+        elif command_exists nc && nc -z localhost "$KARAF_DEBUG_PORT" 
2>/dev/null; then
+            print_status "error" "✗ Debug port: $KARAF_DEBUG_PORT (already in 
use)"
+            echo "Tips:"
+            echo "  - Choose a different port with --debug-port option"
+            echo "  - Check what's using the port: lsof -i :$KARAF_DEBUG_PORT"
+            echo "  - Kill the process using the port if necessary"
+            has_errors=true
+        else
+            print_status "success" "✓ Debug port: $KARAF_DEBUG_PORT available"
+        fi
+    fi
+
+    # Karaf home check if deployment is enabled
+    if [ "$DEPLOY" = true ]; then
+        if [ -z "$CONTEXT_SERVER_KARAF_HOME" ]; then
+            print_status "error" "Karaf home directory not set for deployment"
+            has_errors=true
+        elif [ ! -d "$CONTEXT_SERVER_KARAF_HOME" ]; then
+            print_status "error" "Karaf home directory does not exist: 
$CONTEXT_SERVER_KARAF_HOME"
+            has_errors=true
+        elif [ ! -w "$CONTEXT_SERVER_KARAF_HOME" ]; then
+            print_status "error" "Karaf home directory not writable: 
$CONTEXT_SERVER_KARAF_HOME"
+            has_errors=true
+        else
+            print_status "success" "Karaf home directory validated: 
$CONTEXT_SERVER_KARAF_HOME"
+        fi
+    fi
+
+    # 5. Option Validation
+    print_status "info" "Validating options..."
+    
+    if [ "$SKIP_TESTS" = true ] && [ "$RUN_INTEGRATION_TESTS" = true ]; then
+        print_status "error" "Cannot use --skip-tests and --integration-tests 
together"
+        has_errors=true
+    fi
+
+    if [ ! -z "$SINGLE_TEST" ] && [ "$RUN_INTEGRATION_TESTS" = false ]; then
+        print_status "error" "Single test specified (--single-test) but 
integration tests are not enabled. Use --integration-tests to run the test."
+        has_errors=true
+    fi
+
+    if [ "$IT_DEBUG" = true ] && [ "$RUN_INTEGRATION_TESTS" = false ]; then
+        print_status "error" "Integration test debug (--it-debug) enabled but 
integration tests are not enabled. Use --integration-tests to run the test."
+        has_errors=true
+    fi
+
+    if [ "$IT_DEBUG" = true ]; then
+        if ! [[ "$IT_DEBUG_PORT" =~ ^[0-9]+$ ]] || [ "$IT_DEBUG_PORT" -lt 1024 
] || [ "$IT_DEBUG_PORT" -gt 65535 ]; then
+            print_status "error" "✗ Integration test debug port: 
$IT_DEBUG_PORT (invalid)"
+            echo "Please specify a valid port with --it-debug-port option"
+            echo "Common debug ports: 5006 (default), 8000, 8453"
+            has_errors=true
+        elif command_exists nc && nc -z localhost "$IT_DEBUG_PORT" 
2>/dev/null; then
+            print_status "error" "✗ Integration test debug port: 
$IT_DEBUG_PORT (already in use)"
+            echo "Tips:"
+            echo "  - Choose a different port with --it-debug-port option"
+            echo "  - Check what's using the port: lsof -i :$IT_DEBUG_PORT"
+            echo "  - Kill the process using the port if necessary"
+            has_errors=true
+        else
+            print_status "success" "✓ Integration test debug port: 
$IT_DEBUG_PORT available"
+        fi
+    fi
+
+    if [ "$MAVEN_OFFLINE" = true ]; then
+        if [ "$PURGE_MAVEN_CACHE" = true ]; then
+            print_status "error" "Cannot use --purge-maven-cache in offline 
mode"
+            has_errors=true
+        fi
+        if [ "$USE_MAVEN_CACHE" = false ]; then
+            print_status "warning" "Using --no-maven-cache with offline mode 
may cause build failures"
+            has_warnings=true
+        fi
+    fi
+
+    # Final status and prompts
+    echo
+    if [ "$has_errors" = true ]; then
+        print_status "error" "Critical requirements not met. Please fix the 
errors above."
+        echo
+        echo "For more information and help:"
+        echo "  - Read BUILDING.md in the project root directory"
+        echo "  - Visit Apache Unomi website: https://unomi.apache.org/";
+        echo "  - Check the troubleshooting guide: 
https://unomi.apache.org/contribute/building-and-deploying.html";
+        echo "  - Ask for help on the mailing list: [email protected]"
+        echo "  - Report issues: https://issues.apache.org/jira/browse/UNOMI";
+        exit 1
+    fi
+
+    if [ "$has_warnings" = true ]; then
+        print_status "warning" "Some non-critical requirements not met"
+        echo "You can proceed, but you may encounter issues during the build"
+        echo "See warnings above for recommendations"
+        echo "For more information, check BUILDING.md in the project root"
+        prompt_continue "Continue despite warnings?"
+    else
+        print_status "success" "All requirements checked successfully"
+    fi
+}
+
+# Construct Maven command
+MVN_CMD="mvn"
+MVN_OPTS=""
+
+# Add Maven debug option
+if [ "$MAVEN_DEBUG" = true ]; then
+    MVN_OPTS="$MVN_OPTS -X"
+    echo "Maven debug output enabled"
+fi
+
+# Add Maven offline option
+if [ "$MAVEN_OFFLINE" = true ]; then
+    MVN_OPTS="$MVN_OPTS -o"
+    echo "Maven offline mode enabled"
+
+    # Warn if purge cache is enabled with offline mode
+    if [ "$PURGE_MAVEN_CACHE" = true ]; then
+        echo "Warning: Purging Maven cache while in offline mode may cause 
build failures"
+        read -p "Continue anyway? (y/N) " -n 1 -r
+        echo
+        if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+            exit 1
+        fi
+    fi
+fi
+
+# Add Maven cache option
+if [ "$USE_MAVEN_CACHE" = false ]; then
+    MVN_OPTS="$MVN_OPTS -Dmaven.build.cache.enabled=false"
+fi
+
+# Verify Maven settings
+if [ ! -f ~/.m2/settings.xml ]; then
+    echo "Warning: Maven settings.xml not found at ~/.m2/settings.xml"
+    read -p "Continue anyway? (y/N) " -n 1 -r
+    echo
+    if [[ ! $REPLY =~ ^[Yy]$ ]]; then
+        exit 1
+    fi
+fi
+
+# Add profile options
+PROFILES=""
+if [ "$RUN_INTEGRATION_TESTS" = true ]; then
+    if [ "$USE_OPENSEARCH" = true ]; then
+        MVN_OPTS="$MVN_OPTS -Duse.opensearch=true -P opensearch"
+        echo "Running integration tests with OpenSearch"
+    else
+        echo "Running integration tests with ElasticSearch"
+    fi
+    MVN_OPTS="$MVN_OPTS -P integration-tests"
+    
+    # Add single test option if specified
+    if [ ! -z "$SINGLE_TEST" ]; then
+        MVN_OPTS="$MVN_OPTS -Dit.test=$SINGLE_TEST"
+        echo "Running single integration test: $SINGLE_TEST"
+    fi
+    
+    # Add integration test debug options if enabled
+    if [ "$IT_DEBUG" = true ]; then
+        DEBUG_OPTS="port=$IT_DEBUG_PORT"
+        if [ "$IT_DEBUG_SUSPEND" = true ]; then
+            DEBUG_OPTS="$DEBUG_OPTS,hold:true"
+            echo "Integration test debug enabled with suspend (port: 
$IT_DEBUG_PORT)"
+        else
+            DEBUG_OPTS="$DEBUG_OPTS,hold:false"
+            echo "Integration test debug enabled (port: $IT_DEBUG_PORT)"
+        fi
+        MVN_OPTS="$MVN_OPTS -Dit.karaf.debug=$DEBUG_OPTS"
+    fi
+
+    # Add migration test exclusion if specified
+    if [ "$SKIP_MIGRATION_TESTS" = true ]; then
+        MVN_OPTS="$MVN_OPTS -Dit.test.exclude.pattern=**/migration/**/*IT.java"
+        echo "Skipping migration tests"
+    fi
+else
+    if [ "$SKIP_TESTS" = true ]; then
+        PROFILES="$PROFILES,!integration-tests,!run-tests"
+        MVN_OPTS="$MVN_OPTS -DskipTests"
+    fi
+    
+    # Warn if single test was specified but integration tests are not enabled
+    if [ ! -z "$SINGLE_TEST" ]; then
+        print_status "warning" "Single test specified but integration tests 
are not enabled. Use --integration-tests to run the test."
+    fi
+fi
+
+if [ ! -z "$PROFILES" ]; then
+    # Remove leading comma if present
+    PROFILES=${PROFILES#,}
+    MVN_OPTS="$MVN_OPTS -P$PROFILES"
+fi
+
+# Add GraphViz path to Maven options if manually specified
+if [ ! -z "$GRAPHVIZ_DOT" ]; then
+    MVN_OPTS="$MVN_OPTS -Dgraphviz.dot.path=$GRAPHVIZ_DOT"
+fi
+
+# Progress tracking functions
+start_timer() {
+    start_time=$(date +%s)
+}
+
+get_elapsed_time() {
+    local end_time=$(date +%s)
+    local elapsed=$((end_time - start_time))
+    printf "%02d:%02d" $((elapsed/60)) $((elapsed%60))
+}
+
+# Build command
+cat << "EOF"
+     ____  _    _ _____ _      ____
+    |  _ \| |  | |_   _| |    |  _ \
+    | |_) | |  | | | | | |    | | | |
+    |  _ <| |  | | | | | |    | | | |
+    | |_) | |__| |_| |_| |____| |_| |
+    |____/ \____/|_____|______|____/
+
+EOF
+echo "Building..."
+echo "Estimated time: 3-5 minutes for build, 50-60 minutes with integration 
tests"
+start_timer
+
+# Build phases with enhanced output
+total_steps=2
+current_step=0
+
+print_progress $((++current_step)) $total_steps "Cleaning previous build..."
+if [ "$HAS_COLORS" -eq 1 ]; then
+    echo -e "${GRAY}Running: $MVN_CMD clean $MVN_OPTS${NC}"
+else
+    echo "Running: $MVN_CMD clean $MVN_OPTS"
+fi
+$MVN_CMD clean $MVN_OPTS || {
+    print_status "error" "Maven clean failed"
+    exit 1
+}
+
+print_progress $((++current_step)) $total_steps "Compiling and installing 
artifacts..."
+if [ "$HAS_COLORS" -eq 1 ]; then
+    echo -e "${GRAY}Running: $MVN_CMD install $MVN_OPTS${NC}"
+else
+    echo "Running: $MVN_CMD install $MVN_OPTS"
+fi
+$MVN_CMD install $MVN_OPTS || {
+    print_status "error" "Maven install failed"
+    exit 1
+}
+
+print_status "success" "Build completed in $(get_elapsed_time)"
+
+# Deployment section with enhanced output
+if [ "$DEPLOY" = true ]; then
+    # Validate Karaf home directory
+    if [ -z "$CONTEXT_SERVER_KARAF_HOME" ]; then
+        print_status "error" "Karaf home directory not set. Use --karaf-home 
option."
+        exit 1
+    fi
+    if [ ! -d "$CONTEXT_SERVER_KARAF_HOME" ]; then
+        print_status "error" "Karaf home directory does not exist: 
$CONTEXT_SERVER_KARAF_HOME"
+        exit 1
+    fi
+    if [ ! -w "$CONTEXT_SERVER_KARAF_HOME/deploy" ]; then
+        print_status "error" "No write permission to Karaf deploy directory: 
$CONTEXT_SERVER_KARAF_HOME/deploy"
+        exit 1
+    fi
+
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        echo -e "${MAGENTA}"
+        cat << "EOF"
+     ____  _____ ____  _     _____   __
+    |  _ \| ____|  _ \| |   / _ \ \ / /
+    | | | |  _| | |_) | |  | | | \ V /
+    | |_| | |___|  __/| |__| |_| || |
+    |____/|_____|_|   |_____\___/ |_|
+
+EOF
+        echo -e "${NC}"
+    else
+        cat << "EOF"
+     ____  _____ ____  _     _____   __
+    |  _ \| ____|  _ \| |   / _ \ \ / /
+    | | | |  _| | |_) | |  | | | \ V /
+    | |_| | |___|  __/| |__| |_| || |
+    |____/|_____|_|   |_____\___/ |_|
+
+EOF
+    fi
+
+    start_timer
+    total_deploy_steps=3
+    current_step=0
+
+    print_progress $((++current_step)) $total_deploy_steps "Copying KAR 
package..."
+    if [ ! -f "kar/target/unomi-kar-$UNOMI_VERSION.kar" ]; then
+        print_status "error" "KAR file not found: 
kar/target/unomi-kar-$UNOMI_VERSION.kar"
+        exit 1
+    fi
+    cp -v kar/target/unomi-kar-$UNOMI_VERSION.kar 
$CONTEXT_SERVER_KARAF_HOME/deploy/ || {
+        print_status "error" "Failed to copy KAR file to deploy directory"
+        exit 1
+    }
+    print_status "success" "KAR package copied successfully"
+
+    print_progress $((++current_step)) $total_deploy_steps "Purging Karaf 
Maven repository..."
+    if [ -d "$CONTEXT_SERVER_KARAF_HOME/data/maven/repository" ]; then
+        rm -rf "$CONTEXT_SERVER_KARAF_HOME/data/maven/repository/"* || {
+            print_status "error" "Failed to purge Karaf Maven repository"
+            exit 1
+        }
+        print_status "success" "Karaf Maven repository purged"
+    else
+        print_status "info" "Karaf Maven repository not found, skipping purge"
+    fi
+
+    print_progress $((++current_step)) $total_deploy_steps "Purging Karaf 
temporary files..."
+    if [ -d "$CONTEXT_SERVER_KARAF_HOME/data/tmp" ]; then
+        rm -rf "$CONTEXT_SERVER_KARAF_HOME/data/tmp/"* || {
+            print_status "error" "Failed to purge Karaf temporary directory"
+            exit 1
+        }
+        print_status "success" "Karaf temporary files purged"
+    else
+        print_status "info" "Karaf temporary directory not found, skipping 
purge"
+    fi
+
+    print_status "success" "Deployment completed in $(get_elapsed_time)"
+fi
+
+# Karaf startup section
+if [ "$NO_KARAF" = false ]; then
+    if [ "$HAS_COLORS" -eq 1 ]; then
+        echo -e "${GREEN}"
+        cat << "EOF"
+     _  __    _    ____      _    _____
+    | |/ /   / \  |  _ \    / \  |  ___|
+    | ' /   / _ \ | |_) |  / _ \ | |_
+    | . \  / ___ \|  _ <  / ___ \|  _|
+    |_|\_\/_/   \_\_| \_\/_/   \_\_|
+EOF
+        echo -e "${NC}"
+    else
+        cat << "EOF"
+     _  __    _    ____      _    _____
+    | |/ /   / \  |  _ \    / \  |  ___|
+    | ' /   / _ \ | |_) |  / _ \ | |_
+    | . \  / ___ \|  _ <  / ___ \|  _|
+    |_|\_\/_/   \_\_| \_\/_/   \_\_|
+EOF
+    fi
+
+    total_karaf_steps=4  # Increased for additional checks
+    current_step=0
+
+    # Check Karaf environment
+    print_progress $((++current_step)) $total_karaf_steps "Checking Karaf 
environment..."
+    if [ ! -d "package/target" ]; then
+        print_status "error" "Build directory not found. Did the build 
complete successfully?"
+        exit 1
+    fi
+
+    pushd package/target || {
+        print_status "error" "Failed to change directory to package/target"
+        exit 1
+    }
+
+    # Verify Unomi version is set
+    if [ -z "$UNOMI_VERSION" ]; then
+        print_status "error" "UNOMI_VERSION is not set"
+        exit 1
+    fi
+
+    print_progress $((++current_step)) $total_karaf_steps "Uncompressing Unomi 
package..."
+    if [ ! -f "unomi-$UNOMI_VERSION.tar.gz" ]; then
+        print_status "error" "Unomi package not found: 
unomi-$UNOMI_VERSION.tar.gz"
+        exit 1
+    fi
+    tar zxvf unomi-$UNOMI_VERSION.tar.gz
+
+    print_progress $((++current_step)) $total_karaf_steps "Installing optional 
databases..."
+    if [ -f "../../GeoLite2-City.mmdb" ]; then
+        print_status "info" "Installing GeoLite2 City database..."
+        cp -v ../../GeoLite2-City.mmdb unomi-$UNOMI_VERSION/etc || {
+            print_status "error" "Failed to copy GeoLite2 database"
+            exit 1
+        }
+    else
+        print_status "info" "GeoLite2 City database not found (optional)"
+    fi
+
+    if [ -f "../../allCountries.zip" ]; then
+        print_status "info" "Installing Geonames countries database..."
+        cp -v ../../allCountries.zip unomi-$UNOMI_VERSION/etc || {
+            print_status "error" "Failed to copy Geonames database"
+            exit 1
+        }
+    else
+        print_status "info" "Geonames countries database not found (optional)"
+    fi
+
+    cd unomi-$UNOMI_VERSION/bin || {
+        print_status "error" "Failed to change directory to Karaf bin 
directory"
+        exit 1
+    }
+
+    print_progress $((++current_step)) $total_karaf_steps "Starting Karaf..."
+    if [ "$DEBUG" = true ]; then
+        print_status "info" "Debug mode enabled (port: $KARAF_DEBUG_PORT, 
suspend: $KARAF_DEBUG_SUSPEND)"
+        if command -v nc >/dev/null 2>&1; then
+            if nc -z localhost "$KARAF_DEBUG_PORT" 2>/dev/null; then
+                print_status "error" "Port $KARAF_DEBUG_PORT is already in use"
+                exit 1
+            fi
+        fi
+        export KARAF_DEBUG=true
+        export 
JAVA_DEBUG_OPTS="-agentlib:jdwp=transport=dt_socket,server=y,suspend=$KARAF_DEBUG_SUSPEND,address=$KARAF_DEBUG_PORT"
+    fi
+
+    if [ ! -x "./karaf" ]; then
+        print_status "error" "Karaf executable not found or not executable"
+        exit 1
+    fi
+
+    if [ ! -z "$AUTO_START" ]; then
+        print_status "info" "Configuring auto-start for $AUTO_START"
+        export KARAF_OPTS="-Dunomi.autoStart=$AUTO_START"
+    else
+        print_status "info" "Use [unomi:start] to start Unomi after Karaf 
initialization"
+    fi
+
+    ./karaf || {
+        print_status "error" "Karaf failed to start"
+        exit 1
+    }
+    popd || true
+else
+    print_status "info" "Skipping Karaf startup (--no-karaf specified)"
+    if [ ! -z "$AUTO_START" ]; then
+        print_status "info" "Note: auto-start ($AUTO_START) will be applied 
when Karaf is started manually"
+    fi
+fi
+
+cat << "EOF"
+     ____   ___  _   _ _____ _
+    |  _ \ / _ \| \ | | ____| |
+    | | | | | | |  \| |  _| | |
+    | |_| | |_| | |\  | |___|_|
+    |____/ \___/|_| \_|_____(_)
+
+EOF
+echo "Operation completed successfully."
diff --git a/buildAndRun.sh b/buildAndRun.sh
deleted file mode 100755
index df085ae5c..000000000
--- a/buildAndRun.sh
+++ /dev/null
@@ -1,38 +0,0 @@
-#!/bin/sh
-################################################################################
-#
-#    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.
-#
-################################################################################
-echo Building...
-DIRNAME=`dirname "$0"`
-PROGNAME=`basename "$0"`
-if [ -f "$DIRNAME/setenv.sh" ]; then
-  . "$DIRNAME/setenv.sh"
-fi
-mvn clean install -P integration-tests,rat
-if [ $? -ne 0 ]
-then
-    exit 1;
-fi
-pushd package/target
-echo Uncompressing Unomi package...
-tar zxvf unomi-$UNOMI_VERSION.tar.gz
-cd unomi-$UNOMI_VERSION/bin
-echo Apache Unomi features installed, use [unomi:start] to start it.
-./karaf debug
-popd
-
diff --git a/buildAndRunNoTests.sh b/buildAndRunNoTests.sh
deleted file mode 100755
index e3b2ecea8..000000000
--- a/buildAndRunNoTests.sh
+++ /dev/null
@@ -1,46 +0,0 @@
-#!/bin/sh
-################################################################################
-#
-#    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.
-#
-################################################################################
-echo Building...
-DIRNAME=`dirname "$0"`
-PROGNAME=`basename "$0"`
-if [ -f "$DIRNAME/setenv.sh" ]; then
-  . "$DIRNAME/setenv.sh"
-fi
-mvn clean install -P \!integration-tests,rat,\!run-tests -DskipTests
-if [ $? -ne 0 ]
-then
-    exit 1;
-fi
-pushd package/target
-echo Uncompressing Unomi package...
-tar zxvf unomi-$UNOMI_VERSION.tar.gz
-if [ -f "../../GeoLite2-City.mmdb" ]; then
-  echo Installing GeoLite2 City database...
-  cp ../../GeoLite2-City.mmdb unomi-$UNOMI_VERSION/etc
-fi
-if [ -f "../../allCountries.zip" ]; then
-  echo Installing Geonames countries database...
-  cp ../../allCountries.zip unomi-$UNOMI_VERSION/etc
-fi
-cd unomi-$UNOMI_VERSION/bin
-echo echo Apache Unomi features installed, use [unomi:start] to start it.
-./karaf debug
-popd
-
diff --git a/compileDeploy.sh b/compileDeploy.sh
deleted file mode 100755
index f1a511093..000000000
--- a/compileDeploy.sh
+++ /dev/null
@@ -1,37 +0,0 @@
-#!/bin/sh
-################################################################################
-#
-#    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.
-#
-################################################################################
-echo Setting up environment...
-DIRNAME=`dirname "$0"`
-PROGNAME=`basename "$0"`
-if [ -f "$DIRNAME/setenv.sh" ]; then
-  . "$DIRNAME/setenv.sh"
-fi
-if [ "x$CONTEXT_SERVER_KARAF_HOME" = "x" ]; then
-    
CONTEXT_SERVER_KARAF_HOME=~/java/deployments/context-server/apache-karaf-$KARAF_VERSION
-    export CONTEXT_SERVER_KARAF_HOME
-fi
-echo Compiling...
-mvn clean install
-echo Deploying KAR package to $CONTEXT_SERVER_KARAF_HOME/deploy...
-cp kar/target/unomi-kar-$UNOMI_VERSION.kar $CONTEXT_SERVER_KARAF_HOME/deploy/
-echo Purging Karaf local Maven repository, exploded KAR directory and 
temporary directory... 
-rm -rf $CONTEXT_SERVER_KARAF_HOME/data/maven/repository/*
-rm -rf $CONTEXT_SERVER_KARAF_HOME/data/tmp/*
-echo Compilation and deployment completed successfully.
diff --git a/generate-package.sh b/generate-package.sh
deleted file mode 100755
index 73084b931..000000000
--- a/generate-package.sh
+++ /dev/null
@@ -1,22 +0,0 @@
-#!/bin/sh
-################################################################################
-#
-#    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.
-#
-################################################################################
-echo Building...
-mvn clean install -P !integration-tests,rat
-echo Package building completed.
diff --git a/manual/src/main/asciidoc/building-and-deploying.adoc 
b/manual/src/main/asciidoc/building-and-deploying.adoc
index c91c86052..12dfd9104 100644
--- a/manual/src/main/asciidoc/building-and-deploying.adoc
+++ b/manual/src/main/asciidoc/building-and-deploying.adoc
@@ -14,6 +14,11 @@
 
 === Building
 
+Apache Unomi 3.x provides a convenient `build.sh` script that simplifies the 
build process with
+enhanced error handling, preflight validation, and deployment options. See the
+<<Using the build.sh script>> section below for details. Alternatively, you 
can build using Maven
+directly as described in this section.
+
 ==== Initial Setup
 
 . Install J2SE 17 SDK (or later), which can be downloaded from
@@ -64,6 +69,96 @@ TIP: On a non-English Windows env, the Asciidoctor Maven 
Plugin may fail to
 +
 . The distributions will be available under "package/target" directory.
 
+==== Using the build.sh script
+
+Apache Unomi 3.x provides a unified `build.sh` script that simplifies the 
build, deployment, and execution process.
+This script replaces multiple legacy build scripts and provides enhanced error 
handling, colorized output, and
+comprehensive environment validation.
+
+The `build.sh` script offers the following features:
+
+* **Preflight validation**: Automatically checks for required tools (Java, 
Maven, GraphViz), system resources
+  (memory, disk space), Maven settings, and port availability
+* **Flexible build options**: Support for skipping tests, running integration 
tests, using OpenSearch, debug modes,
+  and more
+* **Deployment helpers**: Automatically copies KAR packages to Karaf deploy 
directory and purges caches
+* **Enhanced output**: Colorized, structured output with progress indicators 
(respects `NO_COLOR` environment variable)
+
+To use the script:
+
+. Get the code: `git clone https://github.com/apache/unomi.git`
+. Change to the top level directory of Apache Unomi source distribution.
+. Make the script executable (if needed): `chmod +x build.sh`
+. Run the script with your desired options:
++
+[source]
+----
+./build.sh --help
+----
++
+This will display all available options and usage examples.
+
+Common usage examples:
+
+* Build with integration tests using OpenSearch:
++
+[source]
+----
+./build.sh --integration-tests --use-opensearch
+----
++
+* Build in debug mode:
++
+[source]
+----
+./build.sh --debug --debug-port 5006 --debug-suspend
+----
++
+* Deploy to specific Karaf instance:
++
+[source]
+----
+./build.sh --deploy --karaf-home ~/apache-karaf
+----
++
+* Build without Karaf and auto-start OpenSearch:
++
+[source]
+----
+./build.sh --no-karaf --auto-start opensearch
+----
++
+* Run a single integration test:
++
+[source]
+----
+./build.sh --integration-tests --single-test 
org.apache.unomi.itests.graphql.GraphQLEventIT
+----
++
+* Debug a single integration test:
++
+[source]
+----
+./build.sh --integration-tests --single-test 
org.apache.unomi.itests.graphql.GraphQLEventIT --it-debug --it-debug-suspend
+----
++
+* Run without colored output:
++
+[source]
+----
+NO_COLOR=1 ./build.sh
+----
++
+or
++
+[source]
+----
+export NO_COLOR=1
+./build.sh
+----
++
+For a complete list of options and examples, run `./build.sh --help`.
+
 ==== Installing an ElasticSearch server
 
 Starting with version 1.2, Apache Unomi no longer embeds an ElasticSearch 
server as this is no longer supported by

Reply via email to