From 79037c3742c883d69f59c6b6a12d157919674b53 Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Wed, 11 Feb 2026 23:15:28 +0300 Subject: [PATCH 1/8] 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/8] 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/8] 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 From 044da64160cbe0a89c466cdf827cc0464f688afc Mon Sep 17 00:00:00 2001 From: Omur Date: Thu, 5 Mar 2026 15:00:44 +0300 Subject: [PATCH 4/8] docker fixes --- scripts/build/.env | 10 ++++++ .../build/Dockerfile.jdk11 | 0 .../build/Dockerfile.jdk17 | 0 .../build/Dockerfile.jdk21 | 0 .../build/Dockerfile.jdk8 | 0 .../build/docker-compose.build.yml | 34 +++++++++---------- scripts/{docker-dist.sh => dist-docker.sh} | 16 ++++----- scripts/version.py | 7 +++- 8 files changed, 41 insertions(+), 26 deletions(-) create mode 100644 scripts/build/.env rename Dockerfile.jdk11 => scripts/build/Dockerfile.jdk11 (100%) rename Dockerfile.jdk17 => scripts/build/Dockerfile.jdk17 (100%) rename Dockerfile.jdk21 => scripts/build/Dockerfile.jdk21 (100%) rename Dockerfile.jdk8 => scripts/build/Dockerfile.jdk8 (100%) rename docker-compose.build.yml => scripts/build/docker-compose.build.yml (93%) rename scripts/{docker-dist.sh => dist-docker.sh} (94%) diff --git a/scripts/build/.env b/scripts/build/.env new file mode 100644 index 000000000..8637b2d39 --- /dev/null +++ b/scripts/build/.env @@ -0,0 +1,10 @@ +EVOMASTER_VERSION=5.0.3-SNAPSHOT +DIST_FOLDER=../../dist +JACOCO_FOLDER=../../jacoco +JDK_8_MVN_FOLDER=../../jdk_8_maven +JDK_8_GRADLE_FOLDER=../../jdk_8_gradle +JDK_11_MVN_FOLDER=../../jdk_11_maven +JDK_11_GRADLE_FOLDER=../../jdk_11_gradle +JDK_17_MVN_FOLDER=../../jdk_17_maven +JDK_17_GRADLE_FOLDER=../../jdk_17_gradle +JDK_21_MVN_FOLDER=../../jdk_21_maven diff --git a/Dockerfile.jdk11 b/scripts/build/Dockerfile.jdk11 similarity index 100% rename from Dockerfile.jdk11 rename to scripts/build/Dockerfile.jdk11 diff --git a/Dockerfile.jdk17 b/scripts/build/Dockerfile.jdk17 similarity index 100% rename from Dockerfile.jdk17 rename to scripts/build/Dockerfile.jdk17 diff --git a/Dockerfile.jdk21 b/scripts/build/Dockerfile.jdk21 similarity index 100% rename from Dockerfile.jdk21 rename to scripts/build/Dockerfile.jdk21 diff --git a/Dockerfile.jdk8 b/scripts/build/Dockerfile.jdk8 similarity index 100% rename from Dockerfile.jdk8 rename to scripts/build/Dockerfile.jdk8 diff --git a/docker-compose.build.yml b/scripts/build/docker-compose.build.yml similarity index 93% rename from docker-compose.build.yml rename to scripts/build/docker-compose.build.yml index 04c4775f7..d5ebde813 100644 --- a/docker-compose.build.yml +++ b/scripts/build/docker-compose.build.yml @@ -8,8 +8,8 @@ services: image: emb-build-jdk8 volumes: - ${HOME}/.m2:/root/.m2 - - ./dist:/dist - - ./jdk_8_maven:/build/jdk_8_maven + - ${DIST_FOLDER}:/dist + - ${JDK_8_MVN_FOLDER}:/build/jdk_8_maven working_dir: /build/jdk_8_maven command: > bash -c "mvn clean install -DskipTests && @@ -77,8 +77,8 @@ services: volumes: - ${HOME}/.m2:/root/.m2 - ${HOME}/.gradle:/root/.gradle - - ./dist:/dist - - ./jdk_8_gradle:/build/jdk_8_gradle + - ${DIST_FOLDER}:/dist + - ${JDK_8_GRADLE_FOLDER}:/build/jdk_8_gradle working_dir: /build/jdk_8_gradle command: > bash -c "gradle build -x test && @@ -93,8 +93,8 @@ services: image: emb-build-jdk11 volumes: - ${HOME}/.m2:/root/.m2 - - ./dist:/dist - - ./jdk_11_maven:/build/jdk_11_maven + - ${DIST_FOLDER}:/dist + - ${JDK_11_MVN_FOLDER}:/build/jdk_11_maven working_dir: /build/jdk_11_maven command: > bash -c "mvn clean install -DskipTests && @@ -124,8 +124,8 @@ services: volumes: - ${HOME}/.m2:/root/.m2 - ${HOME}/.gradle:/root/.gradle - - ./dist:/dist - - ./jdk_11_gradle:/build/jdk_11_gradle + - ${DIST_FOLDER}:/dist + - ${JDK_11_GRADLE_FOLDER}:/build/jdk_11_gradle working_dir: /build/jdk_11_gradle command: > bash -c "gradle build -x test -x spotlessCheck -x spotlessJavaCheck && @@ -142,8 +142,8 @@ services: image: emb-build-jdk17 volumes: - ${HOME}/.m2:/root/.m2 - - ./dist:/dist - - ./jdk_17_maven:/build/jdk_17_maven + - ${DIST_FOLDER}:/dist + - ${JDK_17_MVN_FOLDER}:/build/jdk_17_maven working_dir: /build/jdk_17_maven command: > bash -c "mvn clean install -DskipTests && @@ -171,8 +171,8 @@ services: volumes: - ${HOME}/.m2:/root/.m2 - ${HOME}/.gradle:/root/.gradle - - ./dist:/dist - - ./jdk_17_gradle:/build/jdk_17_gradle + - ${DIST_FOLDER}:/dist + - ${JDK_17_GRADLE_FOLDER}:/build/jdk_17_gradle working_dir: /build/jdk_17_gradle command: > bash -c "gradle build -x test -x spotlessCheck -x spotlessJavaCheck && @@ -187,8 +187,8 @@ services: image: emb-build-jdk21 volumes: - ${HOME}/.m2:/root/.m2 - - ./dist:/dist - - ./jdk_21_maven:/build/jdk_21_maven + - ${DIST_FOLDER}:/dist + - ${JDK_21_MVN_FOLDER}:/build/jdk_21_maven working_dir: /build/jdk_21_maven command: > bash -c "mvn clean install -DskipTests && @@ -206,10 +206,10 @@ services: image: alpine:latest volumes: - ${HOME}/.m2:/root/.m2 - - ./dist:/dist - - ./jacoco:/jacoco + - ${DIST_FOLDER}:/dist + - ${JACOCO_FOLDER}:/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 && + sh -c "cp /root/.m2/repository/org/evomaster/evomaster-client-java-instrumentation/${EVOMASTER_VERSION}/evomaster-client-java-instrumentation-${EVOMASTER_VERSION}.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/dist-docker.sh similarity index 94% rename from scripts/docker-dist.sh rename to scripts/dist-docker.sh index be5a8a00e..5288be944 100644 --- a/scripts/docker-dist.sh +++ b/scripts/dist-docker.sh @@ -114,7 +114,7 @@ if [ "$COPY_ONLY" = true ]; then 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 + $DOCKER_COMPOSE -f ./scripts/build/docker-compose.build.yml run --rm -T copy-additional-files echo "" echo "========================================" @@ -163,8 +163,8 @@ if [ "$JDK_VERSION" == "all" ] && [ "$BUILD_TOOL" == "all" ]; then 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" + echo "Tip: Use './scripts/dist-docker.sh ' for incremental builds" + echo " Example: ./scripts/dist-docker.sh 8 gradle" exit 0 fi @@ -279,7 +279,7 @@ else 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" & + $DOCKER_COMPOSE -f ./scripts/build/docker-compose.build.yml build "$service" & done wait echo "All Docker images built!" @@ -296,7 +296,7 @@ else PIDS=() for service in "${SERVICES_TO_BUILD[@]}"; do echo "Starting: $service" - $DOCKER_COMPOSE -f docker-compose.build.yml run --rm -T "$service" & + $DOCKER_COMPOSE -f ./scripts/build/docker-compose.build.yml run --rm -T "$service" & PIDS+=($!) done @@ -330,7 +330,7 @@ else # 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" + $DOCKER_COMPOSE -f ./scripts/build/docker-compose.build.yml run --rm -T "$service" if [ $? -ne 0 ]; then echo "" echo "ERROR: $service build failed!" @@ -345,7 +345,7 @@ else 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 + $DOCKER_COMPOSE -f ./scripts/build/docker-compose.build.yml run --rm -T copy-additional-files echo "Additional files copied!" echo "" fi @@ -353,7 +353,7 @@ fi echo "========================================" echo "Cleaning up Docker containers..." echo "========================================" -$DOCKER_COMPOSE -f docker-compose.build.yml down +$DOCKER_COMPOSE -f ./scripts/build/docker-compose.build.yml down echo "" echo "========================================" diff --git a/scripts/version.py b/scripts/version.py index 5792132fc..234526f09 100755 --- a/scripts/version.py +++ b/scripts/version.py @@ -73,6 +73,11 @@ def replaceInDist(): replacement = 'EVOMASTER_VERSION = "'+version+'"\n' replace("scripts/dist.py", regex, replacement) +def replaceInDockerEnv(): + regex = re.compile(r'^EVOMASTER_VERSION\s*=\s*.*$') + replacement = 'EVOMASTER_VERSION='+version+'\n' + replace("scripts/build/.env", regex, replacement) + def replaceInProperty(file): regex = re.compile(r'.*EVOMASTER_VERSION.*=.*') replacement = 'EVOMASTER_VERSION='+version+'\n' @@ -139,8 +144,8 @@ def versionSetMaven(folder, jdk_home): replaceInGradle("jdk_8_gradle/build.gradle") replaceInGradle("jdk_11_gradle/build.gradle") replaceInGradle("jdk_17_gradle/build.gradle") - replaceInDist() + replaceInDockerEnv() if target == "wfd": versionSetMaven("/jdk_8_maven",JAVA_HOME_8) From 1972febd390842ddf06a6b486450a08fbafaa6ff Mon Sep 17 00:00:00 2001 From: Omur Date: Fri, 6 Mar 2026 11:55:38 +0300 Subject: [PATCH 5/8] spotless fix --- scripts/build/docker-compose.build.yml | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml index d5ebde813..e4d5e7bb4 100644 --- a/scripts/build/docker-compose.build.yml +++ b/scripts/build/docker-compose.build.yml @@ -128,7 +128,7 @@ services: - ${JDK_11_GRADLE_FOLDER}:/build/jdk_11_gradle working_dir: /build/jdk_11_gradle command: > - bash -c "gradle build -x test -x spotlessCheck -x spotlessJavaCheck && + bash -c "gradle build -x test && 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/ && From 4737a80ca7b258c0bbe88c43e92cbf431378f62e Mon Sep 17 00:00:00 2001 From: Omur Date: Mon, 9 Mar 2026 17:04:31 +0300 Subject: [PATCH 6/8] dist-docker --- scripts/build/docker-compose.build.yml | 319 ++++++++++++++---------- scripts/dist-docker.py | 326 +++++++++++++++++++++++++ 2 files changed, 519 insertions(+), 126 deletions(-) create mode 100644 scripts/dist-docker.py diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml index e4d5e7bb4..0d7ffb26e 100644 --- a/scripts/build/docker-compose.build.yml +++ b/scripts/build/docker-compose.build.yml @@ -1,5 +1,3 @@ -version: '3.8' - services: build-jdk8-maven: build: @@ -11,63 +9,73 @@ services: - ${DIST_FOLDER}:/dist - ${JDK_8_MVN_FOLDER}:/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'" + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + mvn clean install -DskipTests + else + (cd cs && mvn clean install -DskipTests) + fi + cp cs/rest/original/blogapi/target/blogapi-sut.jar /dist/ + cp cs/rest/original/user-management/target/user-management-sut.jar /dist/ + cp cs/rest/original/features-service/target/features-service-sut.jar /dist/ + cp cs/rest/original/scout-api/api/target/scout-api-sut.jar /dist/ + cp cs/rest/original/proxyprint/target/proxyprint-sut.jar /dist/ + cp cs/rest/original/catwatch/catwatch-backend/target/catwatch-sut.jar /dist/ + cp cs/rest/artificial/ncs/target/rest-ncs-sut.jar /dist/ + cp cs/rest/original/youtube-mock/target/youtube-mock-sut.jar /dist/ + cp cs/rest/artificial/scs/target/rest-scs-sut.jar /dist/ + cp cs/rest/artificial/news/target/rest-news-sut.jar /dist/ + cp cs/rest-gui/ocvn/web/target/ocvn-sut.jar /dist/ + cp cs/rest/original/languagetool/languagetool-server/target/languagetool-sut.jar /dist/ + cp cs/rest/original/restcountries/target/restcountries-sut.jar /dist/ + cp cs/rest/original/session-service/target/session-service-sut.jar /dist/ + cp cs/rest-gui/gestaohospital/target/gestaohospital-sut.jar /dist/ + cp cs/rest-gui/genome-nexus/web/target/genome-nexus-sut.jar /dist/ + cp cs/rest/original/spring-batch-rest/example/api/target/spring-batch-rest-sut.jar /dist/ + cp cs/rest/original/spring-actuator-demo/target/spring-actuator-demo-sut.jar /dist/ + cp cs/rest/original/swagger-petstore/target/swagger-petstore-sut.jar /dist/ + cp cs/rest/original/spring-ecommerce/target/spring-ecommerce-sut.jar /dist/ + cp cs/graphql/petclinic-graphql/target/petclinic-graphql-sut.jar /dist/ + cp cs/graphql/graphql-ncs/target/graphql-ncs-sut.jar /dist/ + cp cs/graphql/graphql-scs/target/graphql-scs-sut.jar /dist/ + cp cs/rpc/thrift/artificial/thrift-ncs/target/rpc-thrift-ncs-sut.jar /dist/ + cp cs/rpc/thrift/artificial/thrift-scs/target/rpc-thrift-scs-sut.jar /dist/ + cp cs/rpc/grpc/artificial/grpc-ncs/target/rpc-grpc-ncs-sut.jar /dist/ + cp cs/rpc/grpc/artificial/grpc-scs/target/rpc-grpc-scs-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/rest/blogapi/target/blogapi-evomaster-runner.jar /dist/ + cp em/external/rest/user-management/target/user-management-evomaster-runner.jar /dist/ + cp em/external/rest/features-service/target/features-service-evomaster-runner.jar /dist/ + cp em/external/rest/scout-api/target/scout-api-evomaster-runner.jar /dist/ + cp em/external/rest/proxyprint/target/proxyprint-evomaster-runner.jar /dist/ + cp em/external/rest/catwatch/target/catwatch-evomaster-runner.jar /dist/ + cp em/external/rest/ncs/target/rest-ncs-evomaster-runner.jar /dist/ + cp em/external/rest/youtube-mock/target/youtube-mock-evomaster-runner.jar /dist/ + cp em/external/rest/scs/target/rest-scs-evomaster-runner.jar /dist/ + cp em/external/rest/news/target/rest-news-evomaster-runner.jar /dist/ + cp em/external/rest/ocvn/target/ocvn-evomaster-runner.jar /dist/ + cp em/external/rest/languagetool/target/languagetool-evomaster-runner.jar /dist/ + cp em/external/rest/restcountries/target/restcountries-evomaster-runner.jar /dist/ + cp em/external/rest/session-service/target/session-service-evomaster-runner.jar /dist/ + cp em/external/rest/gestaohospital/target/gestaohospital-evomaster-runner.jar /dist/ + cp em/external/rest/genome-nexus/target/genome-nexus-evomaster-runner.jar /dist/ + cp em/external/rest/spring-batch-rest/target/spring-batch-rest-evomaster-runner.jar /dist/ + cp em/external/rest/spring-actuator-demo/target/spring-actuator-demo-evomaster-runner.jar /dist/ + cp em/external/rest/swagger-petstore/target/swagger-petstore-evomaster-runner.jar /dist/ + cp em/external/rest/spring-ecommerce/target/spring-ecommerce-evomaster-runner.jar /dist/ + cp em/external/graphql/petclinic-graphql/target/petclinic-graphql-evomaster-runner.jar /dist/ + cp em/external/graphql/graphql-ncs/target/graphql-ncs-evomaster-runner.jar /dist/ + cp em/external/graphql/graphql-scs/target/graphql-scs-evomaster-runner.jar /dist/ + cp em/external/thrift/ncs/target/rpc-thrift-ncs-evomaster-runner.jar /dist/ + cp em/external/thrift/scs/target/rpc-thrift-scs-evomaster-runner.jar /dist/ + cp em/external/grpc/ncs/target/rpc-grpc-ncs-evomaster-runner.jar /dist/ + cp em/external/grpc/scs/target/rpc-grpc-scs-evomaster-runner.jar /dist/ + fi + echo 'JDK 8 Maven build completed' build-jdk8-gradle: build: @@ -76,15 +84,25 @@ services: image: emb-build-jdk8 volumes: - ${HOME}/.m2:/root/.m2 - - ${HOME}/.gradle:/root/.gradle + - gradle-cache-jdk8:/root/.gradle - ${DIST_FOLDER}:/dist - ${JDK_8_GRADLE_FOLDER}:/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'" + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + gradle build -x test + else + (cd cs && gradle build -x test) + fi + cp cs/rest/erc20-rest-service/build/libs/erc20-rest-service-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/rest/erc20-rest-service/build/libs/erc20-rest-service-evomaster-runner.jar /dist/ + fi + echo 'JDK 8 Gradle build completed' build-jdk11-maven: build: @@ -96,25 +114,33 @@ services: - ${DIST_FOLDER}:/dist - ${JDK_11_MVN_FOLDER}:/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 + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + mvn clean install -DskipTests + else + (cd cs && mvn clean install -DskipTests) + fi + cp cs/rest/tracking-system/target/tracking-system-sut.jar /dist/ + cp cs/rest/cwa-verification-server/target/cwa-verification-sut.jar /dist/ + cp cs/graphql/timbuctoo/timbuctoo-instancev4/target/timbuctoo-sut.jar /dist/ + cp cs/rest-gui/market/market-rest/target/market-sut.jar /dist/ + cp cs/rest/pay-publicapi/target/pay-publicapi-sut.jar /dist/ + cp cs/rest/http-patch-spring/target/http-patch-spring-sut.jar /dist/ + cp cs/rest-gui/quartz-manager/quartz-manager-parent/quartz-manager-web-showcase/target/quartz-manager-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/rest/tracking-system/target/tracking-system-evomaster-runner.jar /dist/ + cp em/external/rest/cwa-verification/target/cwa-verification-evomaster-runner.jar /dist/ + cp em/external/graphql/timbuctoo/target/timbuctoo-evomaster-runner.jar /dist/ + cp em/external/rest/market/target/market-evomaster-runner.jar /dist/ + cp em/external/rest/pay-publicapi/target/pay-publicapi-evomaster-runner.jar /dist/ + cp em/external/rest/http-patch-spring/target/http-patch-spring-evomaster-runner.jar /dist/ + cp em/external/rest/quartz-manager/target/quartz-manager-evomaster-runner.jar /dist/ + fi + echo 'JDK 11 Maven build completed' build-jdk11-gradle: build: @@ -123,17 +149,27 @@ services: image: emb-build-jdk11 volumes: - ${HOME}/.m2:/root/.m2 - - ${HOME}/.gradle:/root/.gradle + - gradle-cache-jdk11:/root/.gradle - ${DIST_FOLDER}:/dist - ${JDK_11_GRADLE_FOLDER}:/build/jdk_11_gradle working_dir: /build/jdk_11_gradle - command: > - bash -c "gradle build -x test && - 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'" + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + gradle build -x test + else + (cd cs && gradle build -x test) + fi + cp cs/graphql/patio-api/build/libs/patio-api-sut.jar /dist/ + cp cs/rest/reservations-api/build/libs/reservations-api-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/graphql/patio-api/build/libs/patio-api-evomaster-runner.jar /dist/ + cp em/external/rest/reservations-api/build/libs/reservations-api-evomaster-runner.jar /dist/ + fi + echo 'JDK 11 Gradle build completed' build-jdk17-maven: build: @@ -145,23 +181,31 @@ services: - ${DIST_FOLDER}:/dist - ${JDK_17_MVN_FOLDER}:/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 + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + mvn clean install -DskipTests + else + (cd cs && mvn clean install -DskipTests) + fi + cp cs/web/spring-petclinic/target/spring-petclinic-sut.jar /dist/ + cp cs/grpc/signal-registration/target/signal-registration-sut.jar /dist/ + cp cs/rest/familie-ba-sak/target/familie-ba-sak-sut.jar /dist/ + cp cs/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-sut.jar /dist/ + cp cs/rest/ohsome-api/target/ohsome-api-sut.jar /dist/ + cp cs/rest/spring-rest-example/target/spring-rest-example-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/web/spring-petclinic/target/spring-petclinic-evomaster-runner.jar /dist/ + cp em/external/grpc/signal-registration/target/signal-registration-evomaster-runner.jar /dist/ + cp em/external/rest/familie-ba-sak/target/familie-ba-sak-evomaster-runner.jar /dist/ + cp em/external/rest/tiltaksgjennomforing/target/tiltaksgjennomforing-evomaster-runner.jar /dist/ + cp em/external/rest/ohsome-api/target/ohsome-api-evomaster-runner.jar /dist/ + cp em/external/rest/spring-rest-example/target/spring-rest-example-evomaster-runner.jar /dist/ + fi + echo 'JDK 17 Maven build completed' build-jdk17-gradle: build: @@ -170,15 +214,25 @@ services: image: emb-build-jdk17 volumes: - ${HOME}/.m2:/root/.m2 - - ${HOME}/.gradle:/root/.gradle + - gradle-cache-jdk17:/root/.gradle - ${DIST_FOLDER}:/dist - ${JDK_17_GRADLE_FOLDER}:/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'" + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + gradle build -x test -x spotlessCheck -x spotlessJavaCheck + else + (cd cs && gradle build -x test -x spotlessCheck -x spotlessJavaCheck) + fi + cp cs/rest/bibliothek/build/libs/bibliothek-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/rest/bibliothek/build/libs/bibliothek-evomaster-runner.jar /dist/ + fi + echo 'JDK 17 Gradle build completed' build-jdk21-maven: build: @@ -190,17 +244,25 @@ services: - ${DIST_FOLDER}:/dist - ${JDK_21_MVN_FOLDER}:/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 + command: + - bash + - -c + - | + set -e + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + mvn clean install -DskipTests + else + (cd cs && mvn clean install -DskipTests) + fi + cp cs/rest/person-controller/target/person-controller-sut.jar /dist/ + cp cs/rest-gui/webgoat/target/webgoat-sut.jar /dist/ + cp cs/rest-gui/microcks/webapp/target/microcks-sut.jar /dist/ + if [ "$${BUILD_EVOMASTER:-false}" = "true" ]; then + cp em/external/rest/person-controller/target/person-controller-evomaster-runner.jar /dist/ + cp em/external/rest-gui/webgoat/target/webgoat-evomaster-runner.jar /dist/ + cp em/external/rest-gui/microcks/target/microcks-evomaster-runner.jar /dist/ + fi + echo 'JDK 21 Maven build completed' copy-additional-files: image: alpine:latest @@ -213,3 +275,8 @@ services: cp /jacoco/jacocoagent.jar /dist/ && cp /jacoco/jacococli.jar /dist/ && echo 'Additional files copied'" + +volumes: + gradle-cache-jdk8: + gradle-cache-jdk11: + gradle-cache-jdk17: diff --git a/scripts/dist-docker.py b/scripts/dist-docker.py new file mode 100644 index 000000000..5f759b969 --- /dev/null +++ b/scripts/dist-docker.py @@ -0,0 +1,326 @@ +#!/usr/bin/env python3 +"""Docker-based build script for WFD project. + +Builds all jdk_* projects using Docker containers +and copies the results to the dist folder. +""" + +import argparse +import os +import shutil +import subprocess +import sys +from pathlib import Path + + +SCRIPT_DIR = Path(__file__).resolve().parent +PROJ_DIR = SCRIPT_DIR.parent + +COMPOSE_FILE = "./scripts/build/docker-compose.build.yml" + +JDK_VERSIONS = ["8", "11", "17", "21"] +BUILD_TOOLS = ["maven", "gradle"] + +ALL_SERVICES = [ + ("8", "maven"), + ("8", "gradle"), + ("11", "maven"), + ("11", "gradle"), + ("17", "maven"), + ("17", "gradle"), + ("21", "maven"), +] + + +def detect_compose_cmd(): + try: + subprocess.run( + ["docker", "compose", "version"], + check=True, capture_output=True, + ) + return ["docker", "compose"] + except (subprocess.CalledProcessError, FileNotFoundError): + pass + if shutil.which("docker-compose"): + return ["docker-compose"] + print("ERROR: Docker Compose is not installed") + sys.exit(1) + + +def run(cmd, check=True): + return subprocess.run(cmd, check=check) + + +def run_build(compose, service, *, background=False, evomaster=False): + env_args = ["-e", "BUILD_EVOMASTER=true"] if evomaster else [] + cmd = compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T"] + env_args + [service] + if background: + return subprocess.Popen(cmd, stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL) + return subprocess.run(cmd, check=False) + + +def copy_additional_files(compose): + print("Copying Additional Files") + print(">>> Copying evomaster-agent and jacoco files to dist...") + run(compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T", "copy-additional-files"]) + print("Additional files copied!\n") + + +def show_jar(path): + p = PROJ_DIR / "dist" / path + if p.exists(): + print(f"{p.name} ({p.stat().st_size // 1024} KB)") + + +def count_jars(): + return len(list((PROJ_DIR / "dist").glob("**/*.jar"))) + + +def service_dir_exists(jdk, tool): + return (PROJ_DIR / f"jdk_{jdk}_{tool}").is_dir() + + +def should_build(jdk, tool, jdk_filter, tool_filter): + if jdk_filter != "all" and jdk_filter != jdk: + return False + if tool_filter != "all" and tool_filter != tool: + return False + return True + + +def parse_args(): + parser = argparse.ArgumentParser( + description="WFD Docker Build Script", + formatter_class=argparse.RawTextHelpFormatter, + epilog=( + "Examples:\n" + " dist-docker.py # Build all projects sequentially\n" + " dist-docker.py --parallel # Build all projects in parallel\n" + " dist-docker.py 8 gradle # Build only JDK 8 Gradle projects\n" + " dist-docker.py 11 maven -p # Build JDK 11 Maven in parallel mode\n" + " dist-docker.py --copy-files # Only copy evomaster-agent and jacoco files\n" + " dist-docker.py --interactive # Prompt before deleting dist/ on full build\n" + " dist-docker.py --evomaster # Also build evomaster runners (full build)\n" + " dist-docker.py -E --parallel # Full build in parallel" + ), + ) + parser.add_argument( + "jdk_version", + nargs="?", + default="all", + metavar="JDK_VERSION", + help="8, 11, 17, 21, or 'all' (default: all)", + ) + parser.add_argument( + "build_tool", + nargs="?", + default="all", + metavar="BUILD_TOOL", + help="maven, gradle, or 'all' (default: all)", + ) + parser.add_argument( + "--parallel", "-p", + action="store_true", + help="Run builds in parallel (faster but uses more resources)", + ) + parser.add_argument( + "--copy-files", "-c", + action="store_true", + dest="copy_only", + help="Only copy additional files (evomaster-agent, jacoco)", + ) + parser.add_argument( + "--interactive", "-i", + action="store_true", + help="Prompt for confirmation before destructive operations (e.g. deleting dist/)", + ) + parser.add_argument( + "--evomaster", "-E", + action="store_true", + help="Also build evomaster runner jars (em/) and copy additional files. " + "Default: SUT-only mode (only cs/ is built, no evomaster runners)", + ) + args = parser.parse_args() + + valid_jdks = set(JDK_VERSIONS) | {"all"} + if args.jdk_version not in valid_jdks: + parser.error(f"Invalid JDK version '{args.jdk_version}'. Valid options: {', '.join(sorted(valid_jdks))}") + + valid_tools = set(BUILD_TOOLS) | {"all"} + if args.build_tool not in valid_tools: + parser.error(f"Invalid build tool '{args.build_tool}'. Valid options: {', '.join(sorted(valid_tools))}") + + return args + + +def main(): + args = parse_args() + compose = detect_compose_cmd() + + print("WFD Docker Build Script") + print(f"Project directory: {PROJ_DIR}") + print(f"JDK Version: {args.jdk_version}") + print(f"Build Tool: {args.build_tool}") + print(f"Mode: {'PARALLEL' if args.parallel else 'Sequential'}") + print(f"Build scope: {'Full (SUT + Evomaster runners)' if args.evomaster else 'SUT-only (cs/ only)'}") + print(f"Using: {' '.join(compose)}\n") + + # Check Docker + if not shutil.which("docker"): + print("ERROR: Docker is not installed or not in PATH") + sys.exit(1) + + dist_dir = PROJ_DIR / "dist" + + os.environ.setdefault("HOME", str(Path.home())) + + # --- Copy-only mode --- + if args.copy_only: + print("Copy Additional Files Only Mode") + dist_dir.mkdir(parents=True, exist_ok=True) + os.chdir(PROJ_DIR) + run(compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T", "copy-additional-files"]) + print("Files copied successfully!") + for f in ["evomaster-agent.jar", "jacocoagent.jar", "jacococli.jar"]: + show_jar(f) + return + + # --- Collect services --- + services = [ + f"build-jdk{jdk}-{tool}" + for jdk, tool in ALL_SERVICES + if should_build(jdk, tool, args.jdk_version, args.build_tool) + and service_dir_exists(jdk, tool) + ] + + # --- Full-build warning & dist cleanup --- + if args.jdk_version == "all" and args.build_tool == "all": + print("WARNING: Full build mode detected!") + print("This will DELETE the entire dist/ folder and rebuild all projects.\n") + if dist_dir.exists(): + jar_count = len(list(dist_dir.glob("**/*.jar"))) + print(f"Current dist folder contents:\n - {jar_count} JAR files found\n - Location: {dist_dir}") + else: + print("Dist folder does not exist yet.") + + if args.interactive: + print() + try: + reply = input("Do you want to continue and DELETE dist folder? (y/N): ").strip().lower() + except EOFError: + reply = "" + + if reply not in ("y", "yes"): + print("\nBuild cancelled by user.") + print("Tip: Use 'dist-docker.py ' for incremental builds") + print(" Example: dist-docker.py 8 gradle") + return + + print("\nCleaning dist folder (building all projects)...") + if dist_dir.exists(): + shutil.rmtree(dist_dir) + dist_dir.mkdir(parents=True) + print("Dist folder cleaned") + else: + print("Incremental build mode - preserving existing dist folder...") + dist_dir.mkdir(parents=True, exist_ok=True) + print("Building into existing dist folder (will overwrite duplicates)") + print() + + # --- Ensure Maven / Gradle cache dirs exist --- + home = Path.home() + for cache_name, cache_dir in [(".m2", home / ".m2"), (".gradle", home / ".gradle")]: + if not cache_dir.exists(): + print(f"WARNING: {cache_name} cache not found at {cache_dir}, creating...") + cache_dir.mkdir(parents=True) + + os.chdir(PROJ_DIR) + + if not services: + print("No matching builds found!") + print(f"JDK Version: {args.jdk_version}\nBuild Tool: {args.build_tool}\n") + print("Available combinations:") + for d in sorted(PROJ_DIR.glob("jdk_*")): + if d.is_dir(): + print(f" - {d.name}") + return + + print("Building Docker images and running builds...") + print(f"Services to build: {services}\n") + + # Step 1: Build Docker images in parallel (output suppressed to avoid interleaving) + print("Step 1: Building Docker images...") + procs = [ + subprocess.Popen( + compose + ["-f", COMPOSE_FILE, "build", svc], + stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, + ) + for svc in services + ] + for p in procs: + p.wait() + print("All Docker images built!\n") + + # Step 2: Run builds + print("Step 2: Running builds...") + if args.parallel: + print(">>> Running builds in PARALLEL mode...") + print(">>> WARNING: This will use significant CPU and RAM!\n") + + procs = {svc: run_build(compose, svc, background=True, evomaster=args.evomaster) for svc in services} + print("Waiting for all builds to complete...") + + failed = 0 + for svc, proc in procs.items(): + code = proc.wait() + if code != 0: + print(f"ERROR: {svc} failed with exit code {code}") + failed += 1 + + if failed: + print(f"\nERROR: {failed} build(s) failed!") + sys.exit(1) + + print("\nAll parallel builds completed successfully!\n") + else: + print(">>> Running builds in SEQUENTIAL mode...\n") + for svc in services: + print(f">>> Building: {svc}") + result = run_build(compose, svc, evomaster=args.evomaster) + if result.returncode != 0: + print(f"\nERROR: {svc} build failed!") + sys.exit(1) + print() + + if args.evomaster: + copy_additional_files(compose) + + # Cleanup + print("Cleaning up Docker containers...") + run(compose + ["-f", COMPOSE_FILE, "down"]) + + # Summary + print() + print("Build Summary") + print(f"Builds executed: {len(services)}") + print("Checking dist folder contents...\n") + + jar_count = count_jars() + print(f"Total JAR files created: {jar_count}\n") + + if jar_count > 0: + print("Files in dist:") + for f in sorted(dist_dir.iterdir()): + print(f" {f.name} ({f.stat().st_size // 1024} KB)") + print() + print("SUCCESS - Builds completed!") + print(f"Output location: {dist_dir}") + print(f"JDK Version: {args.jdk_version}") + print(f"Build Tool: {args.build_tool}") + else: + print("WARNING - No JAR files found in dist!") + sys.exit(1) + + +if __name__ == "__main__": + main() From 6d56b8af143d5c775d28fa6c78b755d470b4b9a4 Mon Sep 17 00:00:00 2001 From: Omur Sahin Date: Mon, 9 Mar 2026 21:26:24 +0300 Subject: [PATCH 7/8] build message --- scripts/dist-docker.py | 79 +++++++++++++++++++++++++++++++----------- 1 file changed, 58 insertions(+), 21 deletions(-) diff --git a/scripts/dist-docker.py b/scripts/dist-docker.py index 5f759b969..7d7adaa26 100644 --- a/scripts/dist-docker.py +++ b/scripts/dist-docker.py @@ -10,6 +10,7 @@ import shutil import subprocess import sys +import time from pathlib import Path @@ -47,6 +48,11 @@ def detect_compose_cmd(): sys.exit(1) +def fmt_elapsed(seconds): + m, s = divmod(int(seconds), 60) + return f"{m}m {s}s" if m else f"{s}s" + + def run(cmd, check=True): return subprocess.run(cmd, check=check) @@ -248,49 +254,78 @@ def main(): print("Building Docker images and running builds...") print(f"Services to build: {services}\n") + total = len(services) + build_start = time.time() + # Step 1: Build Docker images in parallel (output suppressed to avoid interleaving) - print("Step 1: Building Docker images...") - procs = [ - subprocess.Popen( + print(f"Step 1: Building {total} Docker image(s)...") + img_start = time.time() + img_pending = {} + for svc in services: + proc = subprocess.Popen( compose + ["-f", COMPOSE_FILE, "build", svc], stdout=subprocess.DEVNULL, stderr=subprocess.DEVNULL, ) - for svc in services - ] - for p in procs: - p.wait() - print("All Docker images built!\n") + img_pending[svc] = (proc, time.time()) + done = 0 + while img_pending: + for svc, (proc, svc_start) in list(img_pending.items()): + if proc.poll() is not None: + done += 1 + print(f" [{done}/{total}] Image ready: {svc} ({fmt_elapsed(time.time() - svc_start)})") + del img_pending[svc] + if img_pending: + time.sleep(2) + print(f"All Docker images built! (took {fmt_elapsed(time.time() - img_start)})\n") # Step 2: Run builds + step2_start = time.time() print("Step 2: Running builds...") if args.parallel: print(">>> Running builds in PARALLEL mode...") - print(">>> WARNING: This will use significant CPU and RAM!\n") + print(f">>> WARNING: This will use significant CPU and RAM!") + print(f">>> Launching {total} build(s)...\n") - procs = {svc: run_build(compose, svc, background=True, evomaster=args.evomaster) for svc in services} - print("Waiting for all builds to complete...") + pending = {} + for svc in services: + proc = run_build(compose, svc, background=True, evomaster=args.evomaster) + pending[svc] = (proc, time.time()) + print(f" [launched] {svc}") + print(f"\nWaiting for all {total} builds to complete...\n") failed = 0 - for svc, proc in procs.items(): - code = proc.wait() - if code != 0: - print(f"ERROR: {svc} failed with exit code {code}") - failed += 1 + done = 0 + while pending: + for svc, (proc, svc_start) in list(pending.items()): + code = proc.poll() + if code is not None: + done += 1 + svc_elapsed = fmt_elapsed(time.time() - svc_start) + if code != 0: + print(f" [{done}/{total}] FAILED: {svc} (exit code {code}, {svc_elapsed})") + failed += 1 + else: + print(f" [{done}/{total}] OK: {svc} ({svc_elapsed})") + del pending[svc] + if pending: + time.sleep(2) if failed: print(f"\nERROR: {failed} build(s) failed!") sys.exit(1) - print("\nAll parallel builds completed successfully!\n") + print(f"\nAll parallel builds completed successfully! (took {fmt_elapsed(time.time() - step2_start)})\n") else: print(">>> Running builds in SEQUENTIAL mode...\n") - for svc in services: - print(f">>> Building: {svc}") + for i, svc in enumerate(services, 1): + print(f">>> [{i}/{total}] Building: {svc}") + svc_start = time.time() result = run_build(compose, svc, evomaster=args.evomaster) + svc_elapsed = fmt_elapsed(time.time() - svc_start) if result.returncode != 0: - print(f"\nERROR: {svc} build failed!") + print(f"\nERROR: {svc} build failed! (after {svc_elapsed})") sys.exit(1) - print() + print(f" Completed in {svc_elapsed}\n") if args.evomaster: copy_additional_files(compose) @@ -300,9 +335,11 @@ def main(): run(compose + ["-f", COMPOSE_FILE, "down"]) # Summary + total_elapsed = fmt_elapsed(time.time() - build_start) print() print("Build Summary") print(f"Builds executed: {len(services)}") + print(f"Total time: {total_elapsed}") print("Checking dist folder contents...\n") jar_count = count_jars() From 09ab9d0e86025c5041cdd355a25927b8b9fc4fb1 Mon Sep 17 00:00:00 2001 From: Omur Date: Wed, 11 Mar 2026 14:39:55 +0300 Subject: [PATCH 8/8] copy jacoco --- scripts/build/docker-compose.build.yml | 17 +- scripts/dist-docker.py | 41 ++- scripts/dist-docker.sh | 399 ------------------------- 3 files changed, 37 insertions(+), 420 deletions(-) delete mode 100644 scripts/dist-docker.sh diff --git a/scripts/build/docker-compose.build.yml b/scripts/build/docker-compose.build.yml index 0d7ffb26e..9fa550f5e 100644 --- a/scripts/build/docker-compose.build.yml +++ b/scripts/build/docker-compose.build.yml @@ -264,17 +264,24 @@ services: fi echo 'JDK 21 Maven build completed' - copy-additional-files: + copy-jacoco: image: alpine:latest volumes: - - ${HOME}/.m2:/root/.m2 - ${DIST_FOLDER}:/dist - ${JACOCO_FOLDER}:/jacoco command: > - sh -c "cp /root/.m2/repository/org/evomaster/evomaster-client-java-instrumentation/${EVOMASTER_VERSION}/evomaster-client-java-instrumentation-${EVOMASTER_VERSION}.jar /dist/evomaster-agent.jar && - cp /jacoco/jacocoagent.jar /dist/ && + sh -c "cp /jacoco/jacocoagent.jar /dist/ && cp /jacoco/jacococli.jar /dist/ && - echo 'Additional files copied'" + echo 'Jacoco files copied'" + + copy-evomaster-agent: + image: alpine:latest + volumes: + - ${HOME}/.m2:/root/.m2 + - ${DIST_FOLDER}:/dist + command: > + sh -c "cp /root/.m2/repository/org/evomaster/evomaster-client-java-instrumentation/${EVOMASTER_VERSION}/evomaster-client-java-instrumentation-${EVOMASTER_VERSION}.jar /dist/evomaster-agent.jar && + echo 'evomaster-agent.jar copied'" volumes: gradle-cache-jdk8: diff --git a/scripts/dist-docker.py b/scripts/dist-docker.py index 7d7adaa26..f08f40a9f 100644 --- a/scripts/dist-docker.py +++ b/scripts/dist-docker.py @@ -48,7 +48,7 @@ def detect_compose_cmd(): sys.exit(1) -def fmt_elapsed(seconds): +def format_elapsed_time(seconds): m, s = divmod(int(seconds), 60) return f"{m}m {s}s" if m else f"{s}s" @@ -65,11 +65,16 @@ def run_build(compose, service, *, background=False, evomaster=False): return subprocess.run(cmd, check=False) -def copy_additional_files(compose): - print("Copying Additional Files") - print(">>> Copying evomaster-agent and jacoco files to dist...") - run(compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T", "copy-additional-files"]) - print("Additional files copied!\n") +def copy_jacoco(compose): + print(">>> Copying jacoco files to dist...") + run(compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T", "copy-jacoco"]) + print("Jacoco files copied!\n") + + +def copy_evomaster_agent(compose): + print(">>> Copying evomaster-agent to dist...") + run(compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T", "copy-evomaster-agent"]) + print("evomaster-agent.jar copied!\n") def show_jar(path): @@ -104,9 +109,10 @@ def parse_args(): " dist-docker.py --parallel # Build all projects in parallel\n" " dist-docker.py 8 gradle # Build only JDK 8 Gradle projects\n" " dist-docker.py 11 maven -p # Build JDK 11 Maven in parallel mode\n" - " dist-docker.py --copy-files # Only copy evomaster-agent and jacoco files\n" + " dist-docker.py --copy-files # Only copy jacoco files\n" + " dist-docker.py --copy-files -E # Only copy jacoco + evomaster-agent files\n" " dist-docker.py --interactive # Prompt before deleting dist/ on full build\n" - " dist-docker.py --evomaster # Also build evomaster runners (full build)\n" + " dist-docker.py --evomaster # Also build evomaster runners + copy evomaster-agent\n" " dist-docker.py -E --parallel # Full build in parallel" ), ) @@ -185,7 +191,9 @@ def main(): print("Copy Additional Files Only Mode") dist_dir.mkdir(parents=True, exist_ok=True) os.chdir(PROJ_DIR) - run(compose + ["-f", COMPOSE_FILE, "run", "--rm", "-T", "copy-additional-files"]) + copy_jacoco(compose) + if args.evomaster: + copy_evomaster_agent(compose) print("Files copied successfully!") for f in ["evomaster-agent.jar", "jacocoagent.jar", "jacococli.jar"]: show_jar(f) @@ -272,11 +280,11 @@ def main(): for svc, (proc, svc_start) in list(img_pending.items()): if proc.poll() is not None: done += 1 - print(f" [{done}/{total}] Image ready: {svc} ({fmt_elapsed(time.time() - svc_start)})") + print(f" [{done}/{total}] Image ready: {svc} ({format_elapsed_time(time.time() - svc_start)})") del img_pending[svc] if img_pending: time.sleep(2) - print(f"All Docker images built! (took {fmt_elapsed(time.time() - img_start)})\n") + print(f"All Docker images built! (took {format_elapsed_time(time.time() - img_start)})\n") # Step 2: Run builds step2_start = time.time() @@ -300,7 +308,7 @@ def main(): code = proc.poll() if code is not None: done += 1 - svc_elapsed = fmt_elapsed(time.time() - svc_start) + svc_elapsed = format_elapsed_time(time.time() - svc_start) if code != 0: print(f" [{done}/{total}] FAILED: {svc} (exit code {code}, {svc_elapsed})") failed += 1 @@ -314,28 +322,29 @@ def main(): print(f"\nERROR: {failed} build(s) failed!") sys.exit(1) - print(f"\nAll parallel builds completed successfully! (took {fmt_elapsed(time.time() - step2_start)})\n") + print(f"\nAll parallel builds completed successfully! (took {format_elapsed_time(time.time() - step2_start)})\n") else: print(">>> Running builds in SEQUENTIAL mode...\n") for i, svc in enumerate(services, 1): print(f">>> [{i}/{total}] Building: {svc}") svc_start = time.time() result = run_build(compose, svc, evomaster=args.evomaster) - svc_elapsed = fmt_elapsed(time.time() - svc_start) + svc_elapsed = format_elapsed_time(time.time() - svc_start) if result.returncode != 0: print(f"\nERROR: {svc} build failed! (after {svc_elapsed})") sys.exit(1) print(f" Completed in {svc_elapsed}\n") + copy_jacoco(compose) if args.evomaster: - copy_additional_files(compose) + copy_evomaster_agent(compose) # Cleanup print("Cleaning up Docker containers...") run(compose + ["-f", COMPOSE_FILE, "down"]) # Summary - total_elapsed = fmt_elapsed(time.time() - build_start) + total_elapsed = format_elapsed_time(time.time() - build_start) print() print("Build Summary") print(f"Builds executed: {len(services)}") diff --git a/scripts/dist-docker.sh b/scripts/dist-docker.sh deleted file mode 100644 index 5288be944..000000000 --- a/scripts/dist-docker.sh +++ /dev/null @@ -1,399 +0,0 @@ -#!/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 ./scripts/build/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/dist-docker.sh ' for incremental builds" - echo " Example: ./scripts/dist-docker.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 ./scripts/build/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 ./scripts/build/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 ./scripts/build/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 ./scripts/build/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 ./scripts/build/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