From 79037c3742c883d69f59c6b6a12d157919674b53 Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Wed, 11 Feb 2026 23:15:28 +0300 Subject: [PATCH 1/3] build in docker --- Dockerfile.jdk11 | 13 ++ Dockerfile.jdk17 | 13 ++ Dockerfile.jdk21 | 5 + Dockerfile.jdk8 | 13 ++ docker-compose.build.yml | 223 ++++++++++++++++++++++++++++ scripts/docker-dist.sh | 308 +++++++++++++++++++++++++++++++++++++++ 6 files changed, 575 insertions(+) create mode 100644 Dockerfile.jdk11 create mode 100644 Dockerfile.jdk17 create mode 100644 Dockerfile.jdk21 create mode 100644 Dockerfile.jdk8 create mode 100644 docker-compose.build.yml create mode 100644 scripts/docker-dist.sh 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..c0f55ea01 --- /dev/null +++ b/docker-compose.build.yml @@ -0,0 +1,223 @@ +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 -x spotlessCheck -x spotlessJavaCheck && + 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'" + depends_on: + - build-jdk8-maven + + 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'" + depends_on: + - build-jdk11-maven + + 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'" + depends_on: + - build-jdk17-maven + + 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'" + depends_on: + - build-jdk21-maven diff --git a/scripts/docker-dist.sh b/scripts/docker-dist.sh new file mode 100644 index 000000000..428afccaf --- /dev/null +++ b/scripts/docker-dist.sh @@ -0,0 +1,308 @@ +#!/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 +JDK_VERSION="${1:-all}" +BUILD_TOOL="${2:-all}" + +# Function to display usage +usage() { + echo "Usage: $0 [JDK_VERSION] [BUILD_TOOL]" + 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 "Examples:" + echo " $0 # Build all projects" + echo " $0 8 gradle # Build only JDK 8 Gradle projects" + echo " $0 11 maven # Build only JDK 11 Maven projects" + echo " $0 17 all # Build all JDK 17 projects (Maven + Gradle)" + echo " $0 all maven # Build all Maven projects" + 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 "" + +# 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 "" + +# 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 + +# Build JDK 8 Maven +if should_build "8" "maven" && service_exists "8" "maven"; then + echo "Step: Building Docker image for JDK 8..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk8-maven + echo "" + echo ">>> Building JDK 8 Maven projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk8-maven + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Build JDK 8 Gradle +if should_build "8" "gradle" && service_exists "8" "gradle"; then + echo "Step: Building Docker image for JDK 8..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk8-gradle + echo "" + echo ">>> Building JDK 8 Gradle projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk8-gradle + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Build JDK 11 Maven +if should_build "11" "maven" && service_exists "11" "maven"; then + echo "Step: Building Docker image for JDK 11..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk11-maven + echo "" + echo ">>> Building JDK 11 Maven projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk11-maven + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Build JDK 11 Gradle +if should_build "11" "gradle" && service_exists "11" "gradle"; then + echo "Step: Building Docker image for JDK 11..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk11-gradle + echo "" + echo ">>> Building JDK 11 Gradle projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk11-gradle + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Build JDK 17 Maven +if should_build "17" "maven" && service_exists "17" "maven"; then + echo "Step: Building Docker image for JDK 17..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk17-maven + echo "" + echo ">>> Building JDK 17 Maven projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk17-maven + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Build JDK 17 Gradle +if should_build "17" "gradle" && service_exists "17" "gradle"; then + echo "Step: Building Docker image for JDK 17..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk17-gradle + echo "" + echo ">>> Building JDK 17 Gradle projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk17-gradle + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Build JDK 21 Maven +if should_build "21" "maven" && service_exists "21" "maven"; then + echo "Step: Building Docker image for JDK 21..." + $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk21-maven + echo "" + echo ">>> Building JDK 21 Maven projects..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk21-maven + BUILDS_RUN=$((BUILDS_RUN + 1)) + echo "" +fi + +# Copy additional files if any build was run +if [ $BUILDS_RUN -gt 0 ]; then + echo ">>> Copying additional files (evomaster-agent, jacoco)..." + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm copy-additional-files + 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 From 0ff12602c0dbf65c809eb5d5bb594a0e980c502c Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Thu, 12 Feb 2026 00:07:09 +0300 Subject: [PATCH 2/3] parallel run --- docker-compose.build.yml | 10 +-- scripts/docker-dist.sh | 174 +++++++++++++++++++++++++-------------- 2 files changed, 112 insertions(+), 72 deletions(-) diff --git a/docker-compose.build.yml b/docker-compose.build.yml index c0f55ea01..04c4775f7 100644 --- a/docker-compose.build.yml +++ b/docker-compose.build.yml @@ -81,12 +81,10 @@ services: - ./jdk_8_gradle:/build/jdk_8_gradle working_dir: /build/jdk_8_gradle command: > - bash -c "gradle build -x test -x spotlessCheck -x spotlessJavaCheck && + 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'" - depends_on: - - build-jdk8-maven build-jdk11-maven: build: @@ -136,8 +134,6 @@ services: 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'" - depends_on: - - build-jdk11-maven build-jdk17-maven: build: @@ -183,8 +179,6 @@ services: 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'" - depends_on: - - build-jdk17-maven build-jdk21-maven: build: @@ -219,5 +213,3 @@ services: cp /jacoco/jacocoagent.jar /dist/ && cp /jacoco/jacococli.jar /dist/ && echo 'Additional files copied'" - depends_on: - - build-jdk21-maven diff --git a/scripts/docker-dist.sh b/scripts/docker-dist.sh index 428afccaf..6590f1680 100644 --- a/scripts/docker-dist.sh +++ b/scripts/docker-dist.sh @@ -10,23 +10,44 @@ SCRIPT_DIR="$( cd "$( dirname "${BASH_SOURCE[0]}" )" && pwd )" PROJ_DIR="$(dirname "$SCRIPT_DIR")" # Parse arguments -JDK_VERSION="${1:-all}" -BUILD_TOOL="${2:-all}" +PARALLEL_MODE=false +JDK_VERSION="" +BUILD_TOOL="" + +# Check for parallel flag +for arg in "$@"; do + if [[ "$arg" == "--parallel" ]] || [[ "$arg" == "-p" ]]; then + PARALLEL_MODE=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]" + 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 "" echo "Examples:" - echo " $0 # Build all projects" - echo " $0 8 gradle # Build only JDK 8 Gradle projects" - echo " $0 11 maven # Build only JDK 11 Maven projects" - echo " $0 17 all # Build all JDK 17 projects (Maven + Gradle)" - echo " $0 all maven # Build all Maven projects" + 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 "" exit 1 } @@ -53,6 +74,7 @@ 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 @@ -174,88 +196,114 @@ echo "========================================" echo "" BUILDS_RUN=0 +SERVICES_TO_BUILD=() -# Build JDK 8 Maven +# Collect services to build if should_build "8" "maven" && service_exists "8" "maven"; then - echo "Step: Building Docker image for JDK 8..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk8-maven - echo "" - echo ">>> Building JDK 8 Maven projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk8-maven - BUILDS_RUN=$((BUILDS_RUN + 1)) - echo "" + SERVICES_TO_BUILD+=("build-jdk8-maven") fi -# Build JDK 8 Gradle if should_build "8" "gradle" && service_exists "8" "gradle"; then - echo "Step: Building Docker image for JDK 8..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk8-gradle - echo "" - echo ">>> Building JDK 8 Gradle projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk8-gradle - BUILDS_RUN=$((BUILDS_RUN + 1)) - echo "" + SERVICES_TO_BUILD+=("build-jdk8-gradle") fi -# Build JDK 11 Maven if should_build "11" "maven" && service_exists "11" "maven"; then - echo "Step: Building Docker image for JDK 11..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk11-maven - echo "" - echo ">>> Building JDK 11 Maven projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk11-maven - BUILDS_RUN=$((BUILDS_RUN + 1)) - echo "" + SERVICES_TO_BUILD+=("build-jdk11-maven") fi -# Build JDK 11 Gradle if should_build "11" "gradle" && service_exists "11" "gradle"; then - echo "Step: Building Docker image for JDK 11..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk11-gradle - echo "" - echo ">>> Building JDK 11 Gradle projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk11-gradle - BUILDS_RUN=$((BUILDS_RUN + 1)) - echo "" + SERVICES_TO_BUILD+=("build-jdk11-gradle") fi -# Build JDK 17 Maven if should_build "17" "maven" && service_exists "17" "maven"; then - echo "Step: Building Docker image for JDK 17..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk17-maven - echo "" - echo ">>> Building JDK 17 Maven projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk17-maven - BUILDS_RUN=$((BUILDS_RUN + 1)) - echo "" + SERVICES_TO_BUILD+=("build-jdk17-maven") fi -# Build JDK 17 Gradle if should_build "17" "gradle" && service_exists "17" "gradle"; then - echo "Step: Building Docker image for JDK 17..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk17-gradle - echo "" - echo ">>> Building JDK 17 Gradle projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk17-gradle - BUILDS_RUN=$((BUILDS_RUN + 1)) - echo "" + SERVICES_TO_BUILD+=("build-jdk17-gradle") fi -# Build JDK 21 Maven if should_build "21" "maven" && service_exists "21" "maven"; then - echo "Step: Building Docker image for JDK 21..." - $DOCKER_COMPOSE -f docker-compose.build.yml build build-jdk21-maven + 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 "" - echo ">>> Building JDK 21 Maven projects..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm build-jdk21-maven - BUILDS_RUN=$((BUILDS_RUN + 1)) + + # 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!" + 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 fi # Copy additional files if any build was run if [ $BUILDS_RUN -gt 0 ]; then echo ">>> Copying additional files (evomaster-agent, jacoco)..." - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm copy-additional-files + $DOCKER_COMPOSE -f docker-compose.build.yml run --rm -T copy-additional-files echo "" fi From bd3553946f730edc7c9360b611c84e8a221236a1 Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Thu, 12 Feb 2026 00:13:01 +0300 Subject: [PATCH 3/3] copy additional files --- scripts/docker-dist.sh | 55 +++++++++++++++++++++++++++++++++++++----- 1 file changed, 49 insertions(+), 6 deletions(-) diff --git a/scripts/docker-dist.sh b/scripts/docker-dist.sh index 6590f1680..be5a8a00e 100644 --- a/scripts/docker-dist.sh +++ b/scripts/docker-dist.sh @@ -11,13 +11,16 @@ PROJ_DIR="$(dirname "$SCRIPT_DIR")" # Parse arguments PARALLEL_MODE=false +COPY_ONLY=false JDK_VERSION="" BUILD_TOOL="" -# Check for parallel flag +# 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" @@ -40,7 +43,8 @@ usage() { 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 " --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" @@ -48,6 +52,7 @@ usage() { 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 } @@ -99,6 +104,41 @@ 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 "========================================" @@ -282,6 +322,7 @@ else echo "" echo "All parallel builds completed successfully!" + echo "" else echo ">>> Running builds in SEQUENTIAL mode..." echo "" @@ -298,12 +339,14 @@ else echo "" done fi -fi -# Copy additional files if any build was run -if [ $BUILDS_RUN -gt 0 ]; then - echo ">>> Copying additional files (evomaster-agent, jacoco)..." + # 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