From d70196112d508d17074033828be27b2c665aa6b3 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Joakim=20M=C3=B6rling?= Date: Fri, 1 May 2026 18:40:18 +0200 Subject: [PATCH] refactor: move Gradle wrapper to repo root, add convenience tasks MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Move gradlew, gradle/wrapper, and settings.gradle from backend/ to the repo root so build commands run from the top-level directory. This follows the standard multi-project Gradle layout where the build tool lives alongside docker-compose.yml and all submodules. - Move gradlew + gradle/wrapper/* from backend/ to repo root - Move settings.gradle to root with rootProject.name and include 'backend' - Create root build.gradle with convenience tasks: check, up, down, reset - check task chains frontend lint → frontend test → backend check - Update docker-compose.yml backend volume from ./backend:/app to .:/app - Update backend.Dockerfile entrypoint to ./gradlew :backend:bootRun - Update AGENTS.md: document ./gradlew check, up, down, reset - Delete backend/settings.gradle (now at root) - Add .gradle/ and build/ to .gitignore - Add !gradle/wrapper/gradle-wrapper.jar exception (blocked by *.jar rule) All 38 frontend tests and 33 backend tests pass via ./gradlew check. --- .gitignore | 4 ++ AGENTS.md | 28 ++++++++++--- build.gradle | 38 ++++++++++++++++++ docker-compose.yml | 2 +- docker/backend.Dockerfile | 2 +- .../wrapper/gradle-wrapper.jar | Bin .../wrapper/gradle-wrapper.properties | 0 backend/gradlew => gradlew | 0 backend/settings.gradle => settings.gradle | 2 + 9 files changed, 68 insertions(+), 8 deletions(-) create mode 100644 build.gradle rename {backend/gradle => gradle}/wrapper/gradle-wrapper.jar (100%) rename {backend/gradle => gradle}/wrapper/gradle-wrapper.properties (100%) rename backend/gradlew => gradlew (100%) rename backend/settings.gradle => settings.gradle (59%) diff --git a/.gitignore b/.gitignore index 19a5b58..71b578d 100644 --- a/.gitignore +++ b/.gitignore @@ -39,6 +39,10 @@ Thumbs.db docker-compose.override.yml certs/ +# Gradle +.gradle/ +build/ + # Java *.hprof diff --git a/AGENTS.md b/AGENTS.md index 2c1cac1..3ddd86c 100644 --- a/AGENTS.md +++ b/AGENTS.md @@ -24,11 +24,23 @@ PostgreSQL 16. Deployed via Docker Compose. Always run these after making changes to verify nothing is broken. +Gradle lives at repo root. All commands below run from the repo root unless noted. + ### Quick start (everything) ```bash cp .env.example .env # first time only, then fill in keys docker compose up -d # starts postgres, backend, frontend +./gradlew up # same as above (Gradle wrapper) +``` + +### All-in-one + +```bash +./gradlew check # frontend lint → frontend test → backend test → integration test +./gradlew up # docker compose up -d +./gradlew down # docker compose down +./gradlew reset # docker compose down -v && docker compose up -d (full DB reset) ``` ### Frontend (Vue.js 3 + Vite) @@ -45,10 +57,8 @@ npm run test # vitest ### Backend (Spring Boot 4 + Java 21) ```bash -cd backend -./gradlew bootRun # dev server on :8080 -./gradlew test # JUnit 5 + Mockito -./gradlew check # full verification including integration tests +./gradlew :backend:bootRun # dev server on :8080 +./gradlew :backend:test # JUnit 5 + Mockito (backend only) ``` ### Stripe webhooks (local testing) @@ -80,7 +90,8 @@ bilhej/ │ │ ├── router/ # Vue Router config │ │ └── assets/ # Static files, CSS │ └── ... -├── backend/ # Spring Boot 4 (Java 21) +├── backend/ # Spring Boot 4 (Java 21) — Gradle subproject +│ ├── build.gradle # Spring Boot plugin, Java deps, test config │ ├── src/main/java/se/bilhalsning/ │ │ ├── config/ # @Configuration classes │ │ ├── controller/ # REST controllers @@ -96,7 +107,7 @@ bilhej/ │ ├── application-docker.yml # docker profile (PostgreSQL) │ └── db/migration/ # Flyway migrations ├── docker/ # Dockerfiles -│ ├── backend.Dockerfile # dev: JDK 21 + gradle bootRun +│ ├── backend.Dockerfile # dev: JDK 21 + gradle :backend:bootRun │ ├── backend.prod.Dockerfile # prod: multi-stage (Gradle build → JRE Alpine, non-root) │ ├── frontend.Dockerfile # dev: Node 24 + vite dev server │ ├── frontend.prod.Dockerfile # prod: multi-stage (Node build → nginx) @@ -104,6 +115,11 @@ bilhej/ │ └── entrypoint.sh # prod: self-signed cert generation ├── docker-compose.yml # dev: postgres + backend (bootRun) + frontend (Vite HMR) ├── docker-compose.prod.yml # prod: multi-stage images, no source mounts, restart always +├── gradlew # Gradle wrapper (repo root) +├── gradle/ +│ └── wrapper/ +├── settings.gradle # rootProject.name + include 'backend' +├── build.gradle # convenience tasks: check, up, down, reset ├── .env.example ├── AGENTS.md # This file ├── README.md diff --git a/build.gradle b/build.gradle new file mode 100644 index 0000000..49d979f --- /dev/null +++ b/build.gradle @@ -0,0 +1,38 @@ +plugins { + id 'base' +} + +tasks.register('frontendLint', Exec) { + description = 'Run ESLint in the frontend directory' + workingDir = file("${rootProject.projectDir}/frontend") + commandLine 'npm', 'run', 'lint' +} + +tasks.register('frontendTest', Exec) { + description = 'Run Vitest in the frontend directory' + dependsOn frontendLint + workingDir = file("${rootProject.projectDir}/frontend") + commandLine 'npm', 'run', 'test' +} + +tasks.named('check').configure { + dependsOn frontendLint, frontendTest +} + +tasks.register('up', Exec) { + description = 'Start all services via Docker Compose' + workingDir = rootProject.projectDir + commandLine 'docker', 'compose', 'up', '-d' +} + +tasks.register('down', Exec) { + description = 'Stop all Docker Compose services' + workingDir = rootProject.projectDir + commandLine 'docker', 'compose', 'down' +} + +tasks.register('reset', Exec) { + description = 'Wipe database and restart all services' + workingDir = rootProject.projectDir + commandLine 'bash', '-c', 'docker compose down -v && docker compose up -d' +} diff --git a/docker-compose.yml b/docker-compose.yml index 444d45b..e8b081b 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -36,7 +36,7 @@ services: postgres: condition: service_healthy volumes: - - ./backend:/app + - .:/app - gradle-cache:/root/.gradle frontend: diff --git a/docker/backend.Dockerfile b/docker/backend.Dockerfile index 0d73282..a0960cc 100644 --- a/docker/backend.Dockerfile +++ b/docker/backend.Dockerfile @@ -1,3 +1,3 @@ FROM eclipse-temurin:21-jdk WORKDIR /app -ENTRYPOINT ["./gradlew", "bootRun", "--no-daemon"] +ENTRYPOINT ["./gradlew", ":backend:bootRun", "--no-daemon"] diff --git a/backend/gradle/wrapper/gradle-wrapper.jar b/gradle/wrapper/gradle-wrapper.jar similarity index 100% rename from backend/gradle/wrapper/gradle-wrapper.jar rename to gradle/wrapper/gradle-wrapper.jar diff --git a/backend/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties similarity index 100% rename from backend/gradle/wrapper/gradle-wrapper.properties rename to gradle/wrapper/gradle-wrapper.properties diff --git a/backend/gradlew b/gradlew similarity index 100% rename from backend/gradlew rename to gradlew diff --git a/backend/settings.gradle b/settings.gradle similarity index 59% rename from backend/settings.gradle rename to settings.gradle index 7d5bf60..2a2d33a 100644 --- a/backend/settings.gradle +++ b/settings.gradle @@ -1 +1,3 @@ rootProject.name = 'bilhej' + +include 'backend'