diff --git a/DockerFile b/DockerFile new file mode 100644 index 00000000..72e20294 --- /dev/null +++ b/DockerFile @@ -0,0 +1,45 @@ +# Base Image +FROM gradle:7.3.3-jdk11 AS builder + +# Working directory +WORKDIR /desktop_app + +# Copy all project files +COPY . . + +# Make gradlew executable +RUN chmod +x ./gradlew + +# Build application +RUN ./gradlew assemble --no-daemon + +# Check where the JAR file actually is +RUN find /desktop_app -name "*.jar" | grep -v "/gradle/" > jar_location.txt + +# Runtime stage - JRE only +FROM eclipse-temurin:11-jre-jammy +WORKDIR /app + +# Create non-root user (increased security) +RUN groupadd -r appgroup && \ + useradd -r -g appgroup -d /app -s /bin/false appuser && \ + chown -R appuser:appgroup /app + +# Copy the file with JAR location +COPY --from=builder /desktop_app/jar_location.txt /app/ + +COPY --from=builder /desktop_app/build/ /app/build/ + +# Use the first JAR found in the build directory (temp solution) +RUN find /app/build -name "*.jar" | grep -v "/gradle/" | head -1 > jar_path.txt && \ + if [ -s jar_path.txt ]; then \ + cp $(cat jar_path.txt) /app/app.jar && \ + chown appuser:appgroup /app/app.jar; \ + else \ + echo "No JAR files found!" && exit 1; \ + fi + +# Runtime config +USER appuser +EXPOSE 8080 +ENTRYPOINT ["java", "-jar", "/app/app.jar"] \ No newline at end of file diff --git a/build.gradle b/build.gradle index ff7b120e..f62197ea 100644 --- a/build.gradle +++ b/build.gradle @@ -15,7 +15,7 @@ plugins { // gretty is a gradle plugin to make it easy to run a server and hotswap code at runtime. // https://plugins.gradle.org/plugin/org.gretty - id 'org.gretty' version '3.0.4' + id 'org.gretty' version '3.1.5' // provides access to a database versioning tool. id "org.flywaydb.flyway" version "6.0.8" @@ -63,7 +63,7 @@ plugins { java { toolchain { - languageVersion.set(JavaLanguageVersion.of(11)) + languageVersion.set(JavaLanguageVersion.of(17)) } } diff --git a/desktop_app/gradle/wrapper/gradle-wrapper.properties b/desktop_app/gradle/wrapper/gradle-wrapper.properties index f371643e..068cdb2d 100644 --- a/desktop_app/gradle/wrapper/gradle-wrapper.properties +++ b/desktop_app/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.6.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists diff --git a/desktop_app/gradle/wrapper/gradle.bat b/desktop_app/gradle/wrapper/gradle.bat new file mode 100644 index 00000000..da9c7040 --- /dev/null +++ b/desktop_app/gradle/wrapper/gradle.bat @@ -0,0 +1,92 @@ +@rem +@rem Copyright 2015 the original author or authors. +@rem +@rem Licensed under the Apache License, Version 2.0 (the "License"); +@rem you may not use this file except in compliance with the License. +@rem You may obtain a copy of the License at +@rem +@rem https://www.apache.org/licenses/LICENSE-2.0 +@rem +@rem Unless required by applicable law or agreed to in writing, software +@rem distributed under the License is distributed on an "AS IS" BASIS, +@rem WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +@rem See the License for the specific language governing permissions and +@rem limitations under the License. +@rem + +@if "%DEBUG%"=="" @echo off +@rem ########################################################################## +@rem +@rem Gradle startup script for Windows +@rem +@rem ########################################################################## + +@rem Set local scope for the variables with windows NT shell +if "%OS%"=="Windows_NT" setlocal + +set DIRNAME=%~dp0 +if "%DIRNAME%"=="" set DIRNAME=. +@rem This is normally unused +set APP_BASE_NAME=%~n0 +set APP_HOME=%DIRNAME%.. + +@rem Resolve any "." and ".." in APP_HOME to make it shorter. +for %%i in ("%APP_HOME%") do set APP_HOME=%%~fi + +@rem Add default JVM options here. You can also use JAVA_OPTS and GRADLE_OPTS to pass JVM options to this script. +set DEFAULT_JVM_OPTS="-Xmx64m" "-Xms64m" + +@rem Find java.exe +if defined JAVA_HOME goto findJavaFromJavaHome + +set JAVA_EXE=java.exe +%JAVA_EXE% -version >NUL 2>&1 +if %ERRORLEVEL% equ 0 goto execute + +echo. +echo ERROR: JAVA_HOME is not set and no 'java' command could be found in your PATH. +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:findJavaFromJavaHome +set JAVA_HOME=%JAVA_HOME:"=% +set JAVA_EXE=%JAVA_HOME%/bin/java.exe + +if exist "%JAVA_EXE%" goto execute + +echo. +echo ERROR: JAVA_HOME is set to an invalid directory: %JAVA_HOME% +echo. +echo Please set the JAVA_HOME variable in your environment to match the +echo location of your Java installation. + +goto fail + +:execute +@rem Setup the command line + +set CLASSPATH=%APP_HOME%\lib\gradle-launcher-7.6.4.jar + + +@rem Execute Gradle +"%JAVA_EXE%" %DEFAULT_JVM_OPTS% %JAVA_OPTS% %GRADLE_OPTS% "-Dorg.gradle.appname=%APP_BASE_NAME%" -classpath "%CLASSPATH%" org.gradle.launcher.GradleMain %* + +:end +@rem End local scope for the variables with windows NT shell +if %ERRORLEVEL% equ 0 goto mainEnd + +:fail +rem Set variable GRADLE_EXIT_CONSOLE if you need the _script_ return code instead of +rem the _cmd.exe /c_ return code! +set EXIT_CODE=%ERRORLEVEL% +if %EXIT_CODE% equ 0 set EXIT_CODE=1 +if not ""=="%GRADLE_EXIT_CONSOLE%" exit %EXIT_CODE% +exit /b %EXIT_CODE% + +:mainEnd +if "%OS%"=="Windows_NT" endlocal + +:omega diff --git a/docker-compose.yaml b/docker-compose.yaml new file mode 100644 index 00000000..ea9aa718 --- /dev/null +++ b/docker-compose.yaml @@ -0,0 +1,35 @@ +version: '3.8' + +services: + demo-app: + build: + context: . + dockerfile: DockerFile + ports: + - "8080:8080" + volumes: + - ./build/db:/desktop_app/build/db + environment: + - JAVA_OPTS=-Xmx1g -XX:MaxMetaspaceSize=1024m + + sonarqube: + image: sonarqube:latest + ports: + - "9000:9000" + environment: + - SONARQUBE_JDBC_URL=jdbc:h2:mem:sonarqube + volumes: + - sonarqube_data:/opt/sonarqube/data + - sonarqube_extensions:/opt/sonarqube/extensions + - sonarqube_logs:/opt/sonarqube/logs + networks: + - demo-network + +networks: + demo-network: + driver: bridge + +volumes: + sonarqube_data: + sonarqube_extensions: + sonarqube_logs: \ No newline at end of file diff --git a/docs/BDD_video.mp4 b/docs/BDD_video.mp4 index 27c4646c..571239ed 100644 Binary files a/docs/BDD_video.mp4 and b/docs/BDD_video.mp4 differ diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index f371643e..2e6e5897 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,5 +1,5 @@ distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-7.0-bin.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-7.3.3-bin.zip zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists