diff --git a/Dockerfile.jdk11 b/Dockerfile.jdk11 new file mode 100644 index 000000000..998873b22 --- /dev/null +++ b/Dockerfile.jdk11 @@ -0,0 +1,13 @@ +FROM maven:3.9-eclipse-temurin-11 + +RUN apt-get update && \ + apt-get install -y wget unzip && \ + wget https://services.gradle.org/distributions/gradle-6.9.4-bin.zip && \ + unzip gradle-6.9.4-bin.zip -d /opt && \ + rm gradle-6.9.4-bin.zip && \ + ln -s /opt/gradle-6.9.4/bin/gradle /usr/bin/gradle && \ + apt-get clean + +WORKDIR /build + +CMD ["/bin/bash"] diff --git a/Dockerfile.jdk17 b/Dockerfile.jdk17 new file mode 100644 index 000000000..777c4239e --- /dev/null +++ b/Dockerfile.jdk17 @@ -0,0 +1,13 @@ +FROM maven:3.9-eclipse-temurin-17 + +RUN apt-get update && \ + apt-get install -y wget unzip && \ + wget https://services.gradle.org/distributions/gradle-8.5-bin.zip && \ + unzip gradle-8.5-bin.zip -d /opt && \ + rm gradle-8.5-bin.zip && \ + ln -s /opt/gradle-8.5/bin/gradle /usr/bin/gradle && \ + apt-get clean + +WORKDIR /build + +CMD ["/bin/bash"] diff --git a/Dockerfile.jdk21 b/Dockerfile.jdk21 new file mode 100644 index 000000000..79d3c2664 --- /dev/null +++ b/Dockerfile.jdk21 @@ -0,0 +1,5 @@ +FROM maven:3.9-eclipse-temurin-21 + +WORKDIR /build + +CMD ["/bin/bash"] diff --git a/Dockerfile.jdk8 b/Dockerfile.jdk8 new file mode 100644 index 000000000..dd85c7089 --- /dev/null +++ b/Dockerfile.jdk8 @@ -0,0 +1,13 @@ +FROM maven:3.9-eclipse-temurin-8 + +RUN apt-get update && \ + apt-get install -y wget unzip && \ + wget https://services.gradle.org/distributions/gradle-6.9.4-bin.zip && \ + unzip gradle-6.9.4-bin.zip -d /opt && \ + rm gradle-6.9.4-bin.zip && \ + ln -s /opt/gradle-6.9.4/bin/gradle /usr/bin/gradle && \ + apt-get clean + +WORKDIR /build + +CMD ["/bin/bash"] diff --git a/docker-compose.build.yml b/docker-compose.build.yml new file mode 100644 index 000000000..04c4775f7 --- /dev/null +++ b/docker-compose.build.yml @@ -0,0 +1,215 @@ +version: '3.8' + +services: + build-jdk8-maven: + build: + context: . + dockerfile: Dockerfile.jdk8 + image: emb-build-jdk8 + volumes: + - ${HOME}/.m2:/root/.m2 + - ./dist:/dist + - ./jdk_8_maven:/build/jdk_8_maven + working_dir: /build/jdk_8_maven + command: > + bash -c "mvn clean install -DskipTests && + cp cs/rest/original/blogapi/target/blogapi-sut.jar /dist/ && + cp em/external/rest/blogapi/target/blogapi-evomaster-runner.jar /dist/ && + cp cs/rest/original/user-management/target/user-management-sut.jar /dist/ && + cp em/external/rest/user-management/target/user-management-evomaster-runner.jar /dist/ && + cp cs/rest/original/features-service/target/features-service-sut.jar /dist/ && + cp em/external/rest/features-service/target/features-service-evomaster-runner.jar /dist/ && + cp cs/rest/original/scout-api/api/target/scout-api-sut.jar /dist/ && + cp em/external/rest/scout-api/target/scout-api-evomaster-runner.jar /dist/ && + cp cs/rest/original/proxyprint/target/proxyprint-sut.jar /dist/ && + cp em/external/rest/proxyprint/target/proxyprint-evomaster-runner.jar /dist/ && + cp cs/rest/original/catwatch/catwatch-backend/target/catwatch-sut.jar /dist/ && + cp em/external/rest/catwatch/target/catwatch-evomaster-runner.jar /dist/ && + cp cs/rest/artificial/ncs/target/rest-ncs-sut.jar /dist/ && + cp em/external/rest/ncs/target/rest-ncs-evomaster-runner.jar /dist/ && + cp cs/rest/original/youtube-mock/target/youtube-mock-sut.jar /dist/ && + cp em/external/rest/youtube-mock/target/youtube-mock-evomaster-runner.jar /dist/ && + cp cs/rest/artificial/scs/target/rest-scs-sut.jar /dist/ && + cp em/external/rest/scs/target/rest-scs-evomaster-runner.jar /dist/ && + cp cs/rest/artificial/news/target/rest-news-sut.jar /dist/ && + cp em/external/rest/news/target/rest-news-evomaster-runner.jar /dist/ && + cp cs/rest-gui/ocvn/web/target/ocvn-sut.jar /dist/ && + cp em/external/rest/ocvn/target/ocvn-evomaster-runner.jar /dist/ && + cp cs/rest/original/languagetool/languagetool-server/target/languagetool-sut.jar /dist/ && + cp em/external/rest/languagetool/target/languagetool-evomaster-runner.jar /dist/ && + cp cs/rest/original/restcountries/target/restcountries-sut.jar /dist/ && + cp em/external/rest/restcountries/target/restcountries-evomaster-runner.jar /dist/ && + cp cs/rest/original/session-service/target/session-service-sut.jar /dist/ && + cp em/external/rest/session-service/target/session-service-evomaster-runner.jar /dist/ && + cp cs/rest-gui/gestaohospital/target/gestaohospital-sut.jar /dist/ && + cp em/external/rest/gestaohospital/target/gestaohospital-evomaster-runner.jar /dist/ && + cp cs/rest-gui/genome-nexus/web/target/genome-nexus-sut.jar /dist/ && + cp em/external/rest/genome-nexus/target/genome-nexus-evomaster-runner.jar /dist/ && + cp cs/rest/original/spring-batch-rest/example/api/target/spring-batch-rest-sut.jar /dist/ && + cp em/external/rest/spring-batch-rest/target/spring-batch-rest-evomaster-runner.jar /dist/ && + cp cs/rest/original/spring-actuator-demo/target/spring-actuator-demo-sut.jar /dist/ && + cp em/external/rest/spring-actuator-demo/target/spring-actuator-demo-evomaster-runner.jar /dist/ && + cp cs/rest/original/swagger-petstore/target/swagger-petstore-sut.jar /dist/ && + cp em/external/rest/swagger-petstore/target/swagger-petstore-evomaster-runner.jar /dist/ && + cp cs/rest/original/spring-ecommerce/target/spring-ecommerce-sut.jar /dist/ && + cp em/external/rest/spring-ecommerce/target/spring-ecommerce-evomaster-runner.jar /dist/ && + cp cs/graphql/petclinic-graphql/target/petclinic-graphql-sut.jar /dist/ && + cp em/external/graphql/petclinic-graphql/target/petclinic-graphql-evomaster-runner.jar /dist/ && + cp cs/graphql/graphql-ncs/target/graphql-ncs-sut.jar /dist/ && + cp em/external/graphql/graphql-ncs/target/graphql-ncs-evomaster-runner.jar /dist/ && + cp cs/graphql/graphql-scs/target/graphql-scs-sut.jar /dist/ && + cp em/external/graphql/graphql-scs/target/graphql-scs-evomaster-runner.jar /dist/ && + cp cs/rpc/thrift/artificial/thrift-ncs/target/rpc-thrift-ncs-sut.jar /dist/ && + cp em/external/thrift/ncs/target/rpc-thrift-ncs-evomaster-runner.jar /dist/ && + cp cs/rpc/thrift/artificial/thrift-scs/target/rpc-thrift-scs-sut.jar /dist/ && + cp em/external/thrift/scs/target/rpc-thrift-scs-evomaster-runner.jar /dist/ && + cp cs/rpc/grpc/artificial/grpc-ncs/target/rpc-grpc-ncs-sut.jar /dist/ && + cp em/external/grpc/ncs/target/rpc-grpc-ncs-evomaster-runner.jar /dist/ && + cp cs/rpc/grpc/artificial/grpc-scs/target/rpc-grpc-scs-sut.jar /dist/ && + cp em/external/grpc/scs/target/rpc-grpc-scs-evomaster-runner.jar /dist/ && + echo 'JDK 8 Maven build completed'" + + build-jdk8-gradle: + build: + context: . + dockerfile: Dockerfile.jdk8 + image: emb-build-jdk8 + volumes: + - ${HOME}/.m2:/root/.m2 + - ${HOME}/.gradle:/root/.gradle + - ./dist:/dist + - ./jdk_8_gradle:/build/jdk_8_gradle + working_dir: /build/jdk_8_gradle + command: > + bash -c "gradle build -x test && + cp cs/rest/erc20-rest-service/build/libs/erc20-rest-service-sut.jar /dist/ && + cp em/external/rest/erc20-rest-service/build/libs/erc20-rest-service-evomaster-runner.jar /dist/ && + echo 'JDK 8 Gradle build completed'" + + build-jdk11-maven: + build: + context: . + dockerfile: Dockerfile.jdk11 + image: emb-build-jdk11 + volumes: + - ${HOME}/.m2:/root/.m2 + - ./dist:/dist + - ./jdk_11_maven:/build/jdk_11_maven + working_dir: /build/jdk_11_maven + command: > + bash -c "mvn clean install -DskipTests && + cp cs/rest/tracking-system/target/tracking-system-sut.jar /dist/ && + cp em/external/rest/tracking-system/target/tracking-system-evomaster-runner.jar /dist/ && + cp cs/rest/cwa-verification-server/target/cwa-verification-sut.jar /dist/ && + cp em/external/rest/cwa-verification/target/cwa-verification-evomaster-runner.jar /dist/ && + cp cs/graphql/timbuctoo/timbuctoo-instancev4/target/timbuctoo-sut.jar /dist/ && + cp em/external/graphql/timbuctoo/target/timbuctoo-evomaster-runner.jar /dist/ && + cp cs/rest-gui/market/market-rest/target/market-sut.jar /dist/ && + cp em/external/rest/market/target/market-evomaster-runner.jar /dist/ && + cp cs/rest/pay-publicapi/target/pay-publicapi-sut.jar /dist/ && + cp em/external/rest/pay-publicapi/target/pay-publicapi-evomaster-runner.jar /dist/ && + cp cs/rest/http-patch-spring/target/http-patch-spring-sut.jar /dist/ && + cp em/external/rest/http-patch-spring/target/http-patch-spring-evomaster-runner.jar /dist/ && + cp cs/rest-gui/quartz-manager/quartz-manager-parent/quartz-manager-web-showcase/target/quartz-manager-sut.jar /dist/ && + cp em/external/rest/quartz-manager/target/quartz-manager-evomaster-runner.jar /dist/ && + echo 'JDK 11 Maven build completed'" + depends_on: + - build-jdk8-gradle + + build-jdk11-gradle: + build: + context: . + dockerfile: Dockerfile.jdk11 + image: emb-build-jdk11 + volumes: + - ${HOME}/.m2:/root/.m2 + - ${HOME}/.gradle:/root/.gradle + - ./dist:/dist + - ./jdk_11_gradle:/build/jdk_11_gradle + working_dir: /build/jdk_11_gradle + command: > + bash -c "gradle build -x test -x spotlessCheck -x spotlessJavaCheck && + cp cs/graphql/patio-api/build/libs/patio-api-sut.jar /dist/ && + cp em/external/graphql/patio-api/build/libs/patio-api-evomaster-runner.jar /dist/ && + cp cs/rest/reservations-api/build/libs/reservations-api-sut.jar /dist/ && + cp em/external/rest/reservations-api/build/libs/reservations-api-evomaster-runner.jar /dist/ && + echo 'JDK 11 Gradle build completed'" + + build-jdk17-maven: + build: + context: . + dockerfile: Dockerfile.jdk17 + image: emb-build-jdk17 + volumes: + - ${HOME}/.m2:/root/.m2 + - ./dist:/dist + - ./jdk_17_maven:/build/jdk_17_maven + working_dir: /build/jdk_17_maven + command: > + bash -c "mvn clean install -DskipTests && + cp cs/web/spring-petclinic/target/spring-petclinic-sut.jar /dist/ && + cp em/external/web/spring-petclinic/target/spring-petclinic-evomaster-runner.jar /dist/ && + cp cs/grpc/signal-registration/target/signal-registration-sut.jar /dist/ && + cp em/external/grpc/signal-registration/target/signal-registration-evomaster-runner.jar /dist/ && + cp cs/rest/familie-ba-sak/target/familie-ba-sak-sut.jar /dist/ && + cp em/external/rest/familie-ba-sak/target/familie-ba-sak-evomaster-runner.jar /dist/ && + cp cs/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-sut.jar /dist/ && + cp em/external/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-evomaster-runner.jar /dist/ && + cp cs/rest/ohsome-api/target/ohsome-api-sut.jar /dist/ && + cp em/external/rest/ohsome-api/target/ohsome-api-evomaster-runner.jar /dist/ && + cp cs/rest/spring-rest-example/target/spring-rest-example-sut.jar /dist/ && + cp em/external/rest/spring-rest-example/target/spring-rest-example-evomaster-runner.jar /dist/ && + echo 'JDK 17 Maven build completed'" + depends_on: + - build-jdk11-gradle + + build-jdk17-gradle: + build: + context: . + dockerfile: Dockerfile.jdk17 + image: emb-build-jdk17 + volumes: + - ${HOME}/.m2:/root/.m2 + - ${HOME}/.gradle:/root/.gradle + - ./dist:/dist + - ./jdk_17_gradle:/build/jdk_17_gradle + working_dir: /build/jdk_17_gradle + command: > + bash -c "gradle build -x test -x spotlessCheck -x spotlessJavaCheck && + cp cs/rest/bibliothek/build/libs/bibliothek-sut.jar /dist/ && + cp em/external/rest/bibliothek/build/libs/bibliothek-evomaster-runner.jar /dist/ && + echo 'JDK 17 Gradle build completed'" + + build-jdk21-maven: + build: + context: . + dockerfile: Dockerfile.jdk21 + image: emb-build-jdk21 + volumes: + - ${HOME}/.m2:/root/.m2 + - ./dist:/dist + - ./jdk_21_maven:/build/jdk_21_maven + working_dir: /build/jdk_21_maven + command: > + bash -c "mvn clean install -DskipTests && + cp cs/rest/person-controller/target/person-controller-sut.jar /dist/ && + cp em/external/rest/person-controller/target/person-controller-evomaster-runner.jar /dist/ && + cp cs/rest-gui/webgoat/target/webgoat-sut.jar /dist/ && + cp em/external/rest-gui/webgoat/target/webgoat-evomaster-runner.jar /dist/ && + cp cs/rest-gui/microcks/webapp/target/microcks-sut.jar /dist/ && + cp em/external/rest-gui/microcks/target/microcks-evomaster-runner.jar /dist/ && + echo 'JDK 21 Maven build completed'" + depends_on: + - build-jdk17-gradle + + copy-additional-files: + image: alpine:latest + volumes: + - ${HOME}/.m2:/root/.m2 + - ./dist:/dist + - ./jacoco:/jacoco + command: > + sh -c "cp /root/.m2/repository/org/evomaster/evomaster-client-java-instrumentation/5.0.3-SNAPSHOT/evomaster-client-java-instrumentation-5.0.3-SNAPSHOT.jar /dist/evomaster-agent.jar && + cp /jacoco/jacocoagent.jar /dist/ && + cp /jacoco/jacococli.jar /dist/ && + echo 'Additional files copied'" diff --git a/scripts/docker-dist.sh b/scripts/docker-dist.sh new file mode 100644 index 000000000..be5a8a00e --- /dev/null +++ b/scripts/docker-dist.sh @@ -0,0 +1,399 @@ +#!/bin/bash + +# Docker-based build script for EMB project +# This script builds all jdk_* projects using Docker containers +# and copies the results to the dist folder + +set -e # Exit on error + +SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" +PROJ_DIR="$(dirname "$SCRIPT_DIR")" + +# Parse arguments +PARALLEL_MODE=false +COPY_ONLY=false +JDK_VERSION="" +BUILD_TOOL="" + +# Check for flags +for arg in "$@"; do + if [[ "$arg" == "--parallel" ]] || [[ "$arg" == "-p" ]]; then + PARALLEL_MODE=true + elif [[ "$arg" == "--copy-files" ]] || [[ "$arg" == "-c" ]]; then + COPY_ONLY=true + else + if [ -z "$JDK_VERSION" ]; then + JDK_VERSION="$arg" + elif [ -z "$BUILD_TOOL" ]; then + BUILD_TOOL="$arg" + fi + fi +done + +# Set defaults +JDK_VERSION="${JDK_VERSION:-all}" +BUILD_TOOL="${BUILD_TOOL:-all}" + +# Function to display usage +usage() { + echo "Usage: $0 [JDK_VERSION] [BUILD_TOOL] [OPTIONS]" + echo "" + echo "Arguments:" + echo " JDK_VERSION : 8, 11, 17, 21, or 'all' (default: all)" + echo " BUILD_TOOL : maven, gradle, or 'all' (default: all)" + echo "" + echo "Options:" + echo " --parallel, -p : Run builds in parallel (faster but uses more resources)" + echo " --copy-files, -c : Only copy additional files (evomaster-agent, jacoco)" + echo "" + echo "Examples:" + echo " $0 # Build all projects sequentially" + echo " $0 --parallel # Build all projects in parallel" + echo " $0 8 gradle # Build only JDK 8 Gradle projects" + echo " $0 11 maven -p # Build JDK 11 Maven in parallel mode" + echo " $0 all all --parallel # Build everything in parallel" + echo " $0 --copy-files # Only copy evomaster-agent and jacoco files" + echo "" + exit 1 +} + +# Validate JDK version +if [[ ! "$JDK_VERSION" =~ ^(8|11|17|21|all)$ ]]; then + echo "ERROR: Invalid JDK version '$JDK_VERSION'" + echo "Valid options: 8, 11, 17, 21, all" + echo "" + usage +fi + +# Validate build tool +if [[ ! "$BUILD_TOOL" =~ ^(maven|gradle|all)$ ]]; then + echo "ERROR: Invalid build tool '$BUILD_TOOL'" + echo "Valid options: maven, gradle, all" + echo "" + usage +fi + +echo "========================================" +echo "EMB Docker Build Script" +echo "========================================" +echo "Project directory: $PROJ_DIR" +echo "JDK Version: $JDK_VERSION" +echo "Build Tool: $BUILD_TOOL" +echo "Mode: $([ "$PARALLEL_MODE" = true ] && echo "PARALLEL ⚡" || echo "Sequential")" +echo "" + +# Check if Docker is installed +if ! command -v docker &> /dev/null; then + echo "ERROR: Docker is not installed or not in PATH" + exit 1 +fi + +# Check if Docker Compose is installed +if ! command -v docker-compose &> /dev/null && ! docker compose version &> /dev/null; then + echo "ERROR: Docker Compose is not installed" + exit 1 +fi + +# Determine docker compose command +if docker compose version &> /dev/null 2>&1; then + DOCKER_COMPOSE="docker compose" +else + DOCKER_COMPOSE="docker-compose" +fi + +echo "Using: $DOCKER_COMPOSE" +echo "" + +# If only copying files, do that and exit +if [ "$COPY_ONLY" = true ]; then + echo "========================================" + echo "Copy Additional Files Only Mode" + echo "========================================" + echo "" + + mkdir -p "$PROJ_DIR/dist" + + echo "Copying additional files (evomaster-agent, jacoco)..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm -T copy-additional-files + + echo "" + echo "========================================" + echo "Files copied successfully!" + echo "========================================" + + if [ -f "$PROJ_DIR/dist/evomaster-agent.jar" ]; then + echo "evomaster-agent.jar" + ls -lh "$PROJ_DIR/dist/evomaster-agent.jar" + fi + + if [ -f "$PROJ_DIR/dist/jacocoagent.jar" ]; then + echo "jacocoagent.jar" + ls -lh "$PROJ_DIR/dist/jacocoagent.jar" + fi + + if [ -f "$PROJ_DIR/dist/jacococli.jar" ]; then + echo "jacococli.jar" + ls -lh "$PROJ_DIR/dist/jacococli.jar" + fi + + exit 0 +fi + +# Clean dist folder only if building all projects +if [ "$JDK_VERSION" == "all" ] && [ "$BUILD_TOOL" == "all" ]; then + echo "========================================" + echo "WARNING: Full build mode detected!" + echo "========================================" + echo "This will DELETE the entire dist/ folder and rebuild all projects." + echo "" + + if [ -d "$PROJ_DIR/dist" ]; then + echo "Current dist folder contents:" + JAR_COUNT_BEFORE=$(find "$PROJ_DIR/dist" -name "*.jar" 2>/dev/null | wc -l) + echo " - $JAR_COUNT_BEFORE JAR files found" + echo " - Location: $PROJ_DIR/dist" + else + echo "Dist folder does not exist yet." + fi + + echo "" + read -p "Do you want to continue and DELETE dist folder? (y/N): " -n 1 -r + echo "" + + if [[ ! $REPLY =~ ^[Yy]$ ]]; then + echo "" + echo "Build cancelled by user." + echo "Tip: Use './scripts/docker-dist.sh ' for incremental builds" + echo " Example: ./scripts/docker-dist.sh 8 gradle" + exit 0 + fi + + echo "" + echo "Cleaning dist folder (building all projects)..." + if [ -d "$PROJ_DIR/dist" ]; then + rm -rf "$PROJ_DIR/dist" + fi + mkdir -p "$PROJ_DIR/dist" + echo "Dist folder cleaned" +else + echo "Incremental build mode - preserving existing dist folder..." + mkdir -p "$PROJ_DIR/dist" + echo "Building into existing dist folder (will overwrite duplicates)" +fi +echo "" + +# Check if .m2 directory exists +M2_DIR="${HOME}/.m2" +if [ ! -d "$M2_DIR" ]; then + echo "WARNING: Maven repository not found at $M2_DIR" + echo "Creating directory..." + mkdir -p "$M2_DIR" +fi + +# Check if .gradle directory exists +GRADLE_DIR="${HOME}/.gradle" +if [ ! -d "$GRADLE_DIR" ]; then + echo "WARNING: Gradle cache not found at $GRADLE_DIR" + echo "Creating directory..." + mkdir -p "$GRADLE_DIR" +fi + +cd "$PROJ_DIR" + +# Function to check if we should build a specific combination +should_build() { + local jdk=$1 + local tool=$2 + + # Check JDK version + if [ "$JDK_VERSION" != "all" ] && [ "$JDK_VERSION" != "$jdk" ]; then + return 1 + fi + + # Check build tool + if [ "$BUILD_TOOL" != "all" ] && [ "$BUILD_TOOL" != "$tool" ]; then + return 1 + fi + + return 0 +} + +# Function to check if a service exists in jdk folders +service_exists() { + local jdk=$1 + local tool=$2 + local dir="jdk_${jdk}_${tool}" + + if [ -d "$PROJ_DIR/$dir" ]; then + return 0 + fi + return 1 +} + +echo "========================================" +echo "Building Docker images and running builds..." +echo "========================================" +echo "" + +BUILDS_RUN=0 +SERVICES_TO_BUILD=() + +# Collect services to build +if should_build "8" "maven" && service_exists "8" "maven"; then + SERVICES_TO_BUILD+=("build-jdk8-maven") +fi + +if should_build "8" "gradle" && service_exists "8" "gradle"; then + SERVICES_TO_BUILD+=("build-jdk8-gradle") +fi + +if should_build "11" "maven" && service_exists "11" "maven"; then + SERVICES_TO_BUILD+=("build-jdk11-maven") +fi + +if should_build "11" "gradle" && service_exists "11" "gradle"; then + SERVICES_TO_BUILD+=("build-jdk11-gradle") +fi + +if should_build "17" "maven" && service_exists "17" "maven"; then + SERVICES_TO_BUILD+=("build-jdk17-maven") +fi + +if should_build "17" "gradle" && service_exists "17" "gradle"; then + SERVICES_TO_BUILD+=("build-jdk17-gradle") +fi + +if should_build "21" "maven" && service_exists "21" "maven"; then + SERVICES_TO_BUILD+=("build-jdk21-maven") +fi + +BUILDS_RUN=${#SERVICES_TO_BUILD[@]} + +if [ $BUILDS_RUN -eq 0 ]; then + echo "No services to build!" +else + echo "Services to build: ${SERVICES_TO_BUILD[@]}" + echo "" + + # Build Docker images first + echo "Step 1: Building Docker images..." + UNIQUE_IMAGES=($(printf '%s\n' "${SERVICES_TO_BUILD[@]}" | sed 's/-maven$//' | sed 's/-gradle$//' | sort -u)) + for service in "${SERVICES_TO_BUILD[@]}"; do + $DOCKER_COMPOSE -f docker-compose.build.yml build "$service" & + done + wait + echo "All Docker images built!" + echo "" + + # Run builds + echo "Step 2: Running builds..." + if [ "$PARALLEL_MODE" = true ]; then + echo ">>> Running builds in PARALLEL mode..." + echo ">>> WARNING: This will use significant CPU and RAM!" + echo "" + + # Start all builds in background + PIDS=() + for service in "${SERVICES_TO_BUILD[@]}"; do + echo "Starting: $service" + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm -T "$service" & + PIDS+=($!) + done + + echo "" + echo "Waiting for all builds to complete..." + + # Wait for all background processes + FAILED=0 + for i in "${!PIDS[@]}"; do + wait "${PIDS[$i]}" + EXIT_CODE=$? + if [ $EXIT_CODE -ne 0 ]; then + echo "ERROR: ${SERVICES_TO_BUILD[$i]} failed with exit code $EXIT_CODE" + FAILED=$((FAILED + 1)) + fi + done + + if [ $FAILED -gt 0 ]; then + echo "" + echo "ERROR: $FAILED build(s) failed!" + exit 1 + fi + + echo "" + echo "All parallel builds completed successfully!" + echo "" + else + echo ">>> Running builds in SEQUENTIAL mode..." + echo "" + + # Run builds one by one + for service in "${SERVICES_TO_BUILD[@]}"; do + echo ">>> Building: $service" + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm -T "$service" + if [ $? -ne 0 ]; then + echo "" + echo "ERROR: $service build failed!" + exit 1 + fi + echo "" + done + fi + + # Copy additional files after all builds + echo "========================================" + echo "Copying Additional Files" + echo "========================================" + echo ">>> Copying evomaster-agent and jacoco files to dist..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm -T copy-additional-files + echo "Additional files copied!" + echo "" +fi + +echo "========================================" +echo "Cleaning up Docker containers..." +echo "========================================" +$DOCKER_COMPOSE -f docker-compose.build.yml down + +echo "" +echo "========================================" +echo "Build Summary" +echo "========================================" +echo "Builds executed: $BUILDS_RUN" +echo "Checking dist folder contents..." +echo "" + +JAR_COUNT=$(find "$PROJ_DIR/dist" -name "*.jar" 2>/dev/null | wc -l) +echo "Total JAR files created: $JAR_COUNT" +echo "" + +if [ $JAR_COUNT -gt 0 ]; then + echo "Files in dist:" + ls -lh "$PROJ_DIR/dist" + echo "" + echo "========================================" + echo "SUCCESS - Builds completed!" + echo "========================================" + echo "Output location: $PROJ_DIR/dist" + echo "JDK Version: $JDK_VERSION" + echo "Build Tool: $BUILD_TOOL" +elif [ $BUILDS_RUN -eq 0 ]; then + echo "========================================" + echo "No matching builds found!" + echo "========================================" + echo "JDK Version: $JDK_VERSION" + echo "Build Tool: $BUILD_TOOL" + echo "" + echo "Available combinations:" + for dir in "$PROJ_DIR"/jdk_*; do + if [ -d "$dir" ]; then + dirname=$(basename "$dir") + echo " - $dirname" + fi + done +else + echo "========================================" + echo "WARNING - No JAR files found in dist!" + echo "========================================" + exit 1 +fi