diff --git a/.env.example b/.env.example new file mode 100644 index 0000000..5fa0cf9 --- /dev/null +++ b/.env.example @@ -0,0 +1,4 @@ +DBURL=postgres:5432 +DBNAME=library-app +DBUSERNAME=library_app +DBPASSWORD=replace-with-a-local-password diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml new file mode 100644 index 0000000..f89d566 --- /dev/null +++ b/.github/workflows/ci.yml @@ -0,0 +1,59 @@ +name: CI + +on: + push: + branches: [main] + pull_request: + +permissions: + contents: read + +concurrency: + group: ci-${{ github.workflow }}-${{ github.ref }} + cancel-in-progress: true + +jobs: + verify: + runs-on: ubuntu-24.04 + timeout-minutes: 15 + + services: + postgres: + image: postgres:16-alpine + env: + POSTGRES_USER: library_app + POSTGRES_PASSWORD: local-ci-password + POSTGRES_DB: library-app + ports: + - 5432:5432 + options: >- + --health-cmd "pg_isready -U library_app -d library-app" + --health-interval 5s + --health-timeout 5s + --health-retries 10 + + env: + DBURL: localhost:5432 + DBNAME: library-app + DBUSERNAME: library_app + DBPASSWORD: local-ci-password + + steps: + - name: Check out fork + uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7 + + - name: Set up Java 17 + uses: actions/setup-java@03ad4de0992f5dab5e18fcb136590ce7c4a0ac95 # v5 + with: + distribution: temurin + java-version: "17" + cache: maven + + - name: Test and package + run: ./mvnw --batch-mode --no-transfer-progress verify + + - name: Validate Compose contract + run: docker compose --env-file .env.example config --quiet + + - name: Build Java 17 container + run: docker build --tag library-app-spring-boot:ci . diff --git a/.gitignore b/.gitignore index 8b1360c..374b2c5 100644 --- a/.gitignore +++ b/.gitignore @@ -32,4 +32,5 @@ build/ ### VS Code ### .vscode/ -.DS_Store \ No newline at end of file +.DS_Store +.env diff --git a/Dockerfile b/Dockerfile index 647dccc..0470110 100644 --- a/Dockerfile +++ b/Dockerfile @@ -1,20 +1,18 @@ -# syntax=docker/dockerfile:1.2 - -FROM maven AS build +FROM maven:3.9-eclipse-temurin-17 AS build WORKDIR /app # Copy only the pom.xml and download dependencies COPY ./pom.xml /app -RUN --mount=type=cache,target=/root/.m2 mvn dependency:go-offline +RUN mvn --batch-mode --no-transfer-progress dependency:go-offline # Copy the rest of the project files COPY ./src /app/src # Build the project -RUN --mount=type=cache,target=/root/.m2 mvn clean package -DskipTests +RUN mvn --batch-mode --no-transfer-progress clean package -DskipTests -FROM openjdk +FROM eclipse-temurin:17-jre-jammy WORKDIR /app diff --git a/README.md b/README.md index 981c9fa..af59cd0 100644 --- a/README.md +++ b/README.md @@ -2,6 +2,17 @@ Kütüphaneler tarafından kullanılabilecek kayıt yönetimlerini, kitap ödünç verme ve alma işlemlerini yapabilecekleri Rest API projesidir. +> **Fork durumu:** Bu depo, [gorbadil/LibraryAppSpringBoot](https://github.com/gorbadil/LibraryAppSpringBoot) projesinin fork'udur; özgün projenin tamamı Okan'a aitmiş gibi sunulmaz. [Okan'ın upstream'den sonraki 10 commit'i](https://github.com/gorbadil/LibraryAppSpringBoot/compare/main...okturan:main) örnek veri yükleme, global hata yönetimi, repository/service düzeltmeleri, tek alanlı kategori ve yayınevi güncelleme hataları, silme hataları, Docker veri davranışı ve kurulum dokümantasyonu üzerinde çalışır. + +## Okan Tarafından Eklenen Farklar + +- Tekrarlanabilir örnek kütüphane verisi üreten `DataLoader`. +- API hatalarını tutarlı yanıtlara dönüştüren global exception handler. +- Yalnız adres/açıklama alanı değiştiğinde başarısız olan yayınevi ve kategori güncellemelerinin düzeltilmesi. +- Silme hatalarının ve repository sorgularının iyileştirilmesi. +- Java 17'ye sabitlenmiş container build/runtime aşamaları ve PostgreSQL servis sağlık kontrolü. +- Kaynakta parola tutmayan Compose yapılandırması ve Java 17/PostgreSQL CI doğrulaması. + ## Kullanılan Teknolojiler Java @@ -72,19 +83,25 @@ Aşağıda, API'nin sunduğu temel endpoint'lerin bir listesi bulunmaktadır: 1. Projeyi klonlayın. - `git clone https://github.com/okturan/LibraryAppSpringBoot.git` 2. Docker yüklü ise, - 1. `docker-compose up` - 2. `src/main/resources/application.properties` dosyasında veri tabanı konfigürasyonunu yapın. -3. Projeyi ayağa kaldırmak için IDE'nizden start edin. + 1. `cp .env.example .env` + 2. `.env` içindeki yerel veritabanı kullanıcı adı ve parolasını değiştirin. + 3. `docker compose up --build` +3. Docker olmadan çalıştırmak için aşağıdaki ortam değişkenlerini tanımlayıp `./mvnw spring-boot:run` komutunu kullanın. 4. Swagger üzerinden API kullanılabilir. Tarayıcınızdan [http://localhost:8080/swagger-ui/index.html#/](http://localhost:8080/swagger-ui/index.html#/)'e gidin. 5. End pointlere istek atabilirsiniz. ## Ortam Değişkenleri -Bu projeyi çalıştırmak için aşağıdaki ortam değişkenlerini application.properties dosyasından değiştirmelisiniz. +Bu projeyi çalıştırmak için aşağıdaki ortam değişkenlerini tanımlayın; gerçek kimlik bilgilerini `application.properties`, `.env.example` veya Git geçmişine yazmayın. + +- `DBURL` — ör. `localhost:5432` +- `DBNAME` — ör. `library-app` +- `DBUSERNAME` +- `DBPASSWORD` + +## Doğrulama -spring.datasource.url -spring.datasource.username -spring.datasource.password +GitHub Actions, PostgreSQL servis konteyneri üzerinde Java 17 ile Maven testlerini ve paketlemeyi çalıştırır; ardından Compose yapılandırmasının örnek ortam dosyasıyla çözümlendiğini ve uygulama container'ının Java 17 tabanında üretildiğini doğrular. Bu bir fork olduğundan, doğrulama Okan'ın farkını kanıtlar; upstream kaynakların yazarlığını değiştirmez. ## Lisans diff --git a/docker-compose.yaml b/docker-compose.yaml index e97c96b..fe16aff 100644 --- a/docker-compose.yaml +++ b/docker-compose.yaml @@ -6,18 +6,23 @@ services: depends_on: - postgres environment: - DBURL: postgres:5432 - DBNAME: library-app - DBUSERNAME: postgres - DBPASSWORD: postgres + DBURL: ${DBURL:-postgres:5432} + DBNAME: ${DBNAME:-library-app} + DBUSERNAME: ${DBUSERNAME:?set DBUSERNAME in .env} + DBPASSWORD: ${DBPASSWORD:?set DBPASSWORD in .env} postgres: - image: postgres + image: postgres:16-alpine ports: - 5432:5432 environment: - POSTGRES_USER: postgres - POSTGRES_PASSWORD: postgres - POSTGRES_DB: library-app + POSTGRES_USER: ${DBUSERNAME:?set DBUSERNAME in .env} + POSTGRES_PASSWORD: ${DBPASSWORD:?set DBPASSWORD in .env} + POSTGRES_DB: ${DBNAME:-library-app} + healthcheck: + test: ["CMD-SHELL", "pg_isready -U $${POSTGRES_USER} -d $${POSTGRES_DB}"] + interval: 5s + timeout: 5s + retries: 10 volumes: - - /var/lib/postgresql/data \ No newline at end of file + - /var/lib/postgresql/data diff --git a/mvnw b/mvnw old mode 100644 new mode 100755 diff --git a/pom.xml b/pom.xml index fa8c152..51d274c 100644 --- a/pom.xml +++ b/pom.xml @@ -36,7 +36,7 @@ org.postgresql postgresql - 42.7.3 + 42.7.11