Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
68 changes: 68 additions & 0 deletions .github/workflows/spring-oracle-example.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,68 @@
name: spring-oracle-example CI Build

on:
pull_request:
branches: [master]
paths:
- "spring-oracle-example/**"
types:
- opened
- synchronize
- reopened
Comment on lines +3 to +11
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Quote the “on” key to satisfy YAML linters

Prevents YAML 1.1 truthy parsing complaints.

Apply:

-on:
+"on":
   pull_request:
     branches: [master]
     paths:
       - "spring-oracle-example/**"
     types:
       - opened
       - synchronize
       - reopened
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
on:
pull_request:
branches: [master]
paths:
- "spring-oracle-example/**"
types:
- opened
- synchronize
- reopened
"on":
pull_request:
branches: [master]
paths:
- "spring-oracle-example/**"
types:
- opened
- synchronize
- reopened
🧰 Tools
🪛 YAMLlint (1.37.1)

[warning] 3-3: truthy value should be one of [false, true]

(truthy)

🤖 Prompt for AI Agents
.github/workflows/spring-oracle-example.yml lines 3-11: the top-level YAML key
on is unquoted which can trigger YAML 1.1 truthy parsing linters; update the
file to quote the key (e.g., change on: to "on":) so the key is treated as a
string, preserving the existing pull_request block and behavior.


jobs:

integration-tests:
name: Run Unit & Integration Tests
runs-on: ubuntu-latest
defaults:
run:
working-directory: spring-oracle-example
strategy:
matrix:
distribution: [ 'temurin' ]
java: [ '21' ]
Comment on lines +23 to +24
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🧹 Nitpick (assertive)

Fix bracket spacing in matrices (YAMLlint)

Compact arrays silence lint errors.

Apply:

-        distribution: [ 'temurin' ]
-        java: [ '21' ]
+        distribution: ["temurin"]
+        java: ["21"]
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
distribution: [ 'temurin' ]
java: [ '21' ]
distribution: ["temurin"]
java: ["21"]
🧰 Tools
🪛 YAMLlint (1.37.1)

[error] 23-23: too many spaces inside brackets

(brackets)


[error] 23-23: too many spaces inside brackets

(brackets)


[error] 24-24: too many spaces inside brackets

(brackets)


[error] 24-24: too many spaces inside brackets

(brackets)

🤖 Prompt for AI Agents
.github/workflows/spring-oracle-example.yml lines 23-24: the matrix arrays use
spaced bracket style which triggers YAMLlint; replace the current "distribution:
[ 'temurin' ]" and "java: [ '21' ]" with compact arrays (no spaces after '[' or
before ']'), e.g. "distribution: ['temurin']" and "java: ['21']".

steps:
- uses: actions/checkout@v5
with:
fetch-depth: 0

- name: Set up JDK ${{ matrix.java }}
uses: actions/setup-java@v5.0.0
with:
java-version: ${{ matrix.java }}
distribution: ${{ matrix.distribution }}
cache: 'maven'
- name: Build and analyze
run: ./mvnw clean verify

health-check:
name: Health Check on Services
runs-on: ubuntu-latest
steps:
- name: Checkout repository and submodules
uses: actions/checkout@v5
with:
submodules: true

- name: Extract service names from docker compose
id: services
run: |
echo "services<<EOF" >> $GITHUB_OUTPUT
docker compose -f ./spring-oracle-example/compose.yaml config --services >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT

Comment on lines +48 to +54
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Harden GITHUB_OUTPUT handling and normalize services list

Fail fast on errors and emit a space-delimited list to avoid quoting/newline pitfalls downstream.

-      - name: Extract service names from docker compose
+      - name: Extract service names from docker compose
         id: services
         run: |
-          echo "services<<EOF" >> $GITHUB_OUTPUT
-          docker compose -f ./spring-oracle-example/compose.yaml config --services >> $GITHUB_OUTPUT
-          echo "EOF" >> $GITHUB_OUTPUT
+          set -euo pipefail
+          services="$(docker compose -f ./spring-oracle-example/compose.yaml config --services | tr '\n' ' ' | sed -e 's/[[:space:]]\+/ /g' -e 's/[[:space:]]$//')"
+          echo "services=${services}" >> "$GITHUB_OUTPUT"
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Extract service names from docker compose
id: services
run: |
echo "services<<EOF" >> $GITHUB_OUTPUT
docker compose -f ./spring-oracle-example/compose.yaml config --services >> $GITHUB_OUTPUT
echo "EOF" >> $GITHUB_OUTPUT
- name: Extract service names from docker compose
id: services
run: |
set -euo pipefail
services="$(docker compose -f ./spring-oracle-example/compose.yaml config --services | tr '\n' ' ' | sed -e 's/[[:space:]]\+/ /g' -e 's/[[:space:]]$//')"
echo "services=${services}" >> "$GITHUB_OUTPUT"
🤖 Prompt for AI Agents
In .github/workflows/spring-oracle-example.yml around lines 48-54, the step
writing services to GITHUB_OUTPUT should fail fast on errors and emit a single
space-delimited value instead of raw newlines; update the script to enable
strict shell mode (e.g., set -euo pipefail), run docker compose to capture the
service names into a variable, normalize newlines to spaces (trim
leading/trailing whitespace), verify the variable is non-empty and exit with an
error if it is, then write a single line like services=<space-delimited-list> to
$GITHUB_OUTPUT so downstream steps get a safe, quoted-free list.

- name: Start containers with Compose Action
uses: hoverkraft-tech/compose-action@v2.3.0
with:
compose-file: './spring-oracle-example/compose.yaml'
services: ${{ steps.services.outputs.services }}
up-flags: '--build'
down-flags: '--volumes'

Comment on lines +55 to +62
Copy link
Copy Markdown

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

🛠️ Refactor suggestion

Pin third-party action and clean up orphans on down

Pin by commit SHA for security; remove orphaned containers on teardown to reduce cross-run interference.

-      - name: Start containers with Compose Action
-        uses: hoverkraft-tech/compose-action@v2.3.0
+      - name: Start containers with Compose Action
+        uses: hoverkraft-tech/compose-action@v2.3.0
+        # TODO: consider pinning to the action's commit SHA for supply-chain hardening
         with:
           compose-file: './spring-oracle-example/compose.yaml'
           services: ${{ steps.services.outputs.services }}
           up-flags: '--build'
-          down-flags: '--volumes'
+          down-flags: '--volumes --remove-orphans'
📝 Committable suggestion

‼️ IMPORTANT
Carefully review the code before committing. Ensure that it accurately replaces the highlighted code, contains no missing lines, and has no issues with indentation. Thoroughly test & benchmark the code to ensure it meets the requirements.

Suggested change
- name: Start containers with Compose Action
uses: hoverkraft-tech/compose-action@v2.3.0
with:
compose-file: './spring-oracle-example/compose.yaml'
services: ${{ steps.services.outputs.services }}
up-flags: '--build'
down-flags: '--volumes'
- name: Start containers with Compose Action
uses: hoverkraft-tech/compose-action@v2.3.0
# TODO: consider pinning to the action's commit SHA for supply-chain hardening
with:
compose-file: './spring-oracle-example/compose.yaml'
services: ${{ steps.services.outputs.services }}
up-flags: '--build'
down-flags: '--volumes --remove-orphans'
🤖 Prompt for AI Agents
.github/workflows/spring-oracle-example.yml lines 55-62: the Compose Action is
using a floating tag and doesn't remove orphaned containers on teardown; update
the uses key to pin the action to a specific commit SHA (replace the tag with
hoverkraft-tech/compose-action@<commit-sha>) for security, and modify down-flags
to include --remove-orphans (e.g., '--volumes --remove-orphans') so orphaned
containers are cleaned up on down.

- name: Wait for containers to initialize
run: sleep 30

- name: Check container health
run: |
./.github/scripts/check-container-health.sh "${{ steps.services.outputs.services }}"
1 change: 1 addition & 0 deletions pom.xml
Original file line number Diff line number Diff line change
Expand Up @@ -16,6 +16,7 @@
<module>spring-prometheus-grafana-example</module>
<module>spring-keycloak-example</module>
<module>spring-jasper-example</module>
<module>spring-oracle-example</module>
</modules>

</project>
62 changes: 62 additions & 0 deletions spring-oracle-example/.dockerignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
# Include any files or directories that you don't want to be copied to your
# container here (e.g., local build artifacts, temporary files, etc.).
#
# For more help, visit the .dockerignore file reference guide at
# https://docs.docker.com/go/build-context-dockerignore/

**/.DS_Store
**/.classpath
**/.dockerignore
**/.env
**/.factorypath
**/.git
**/.gitignore
**/.idea
**/.project
**/.sts4-cache
**/.settings
**/.toolstarget
**/.vs
**/.vscode
**/.next
**/.cache
**/*.dbmdl
**/*.jfm
**/charts
**/docker-compose*
**/compose.y*ml
**/Dockerfile*
**/secrets.dev.yaml
**/values.dev.yaml
**/vendor
LICENSE
README.md
**/*.class
**/*.iml
**/*.ipr
**/*.iws
**/*.log
**/.apt_generated
**/.gradle
**/.gradletasknamecache
**/.nb-gradle
**/.springBeans
**/build
**/dist
**/gradle-app.setting
**/nbbuild
**/nbdist
**/nbproject/private
**/target
*.ctxt
.mtj.tmp
.mvn/timing.properties
buildNumber.properties
dependency-reduced-pom.xml
hs_err_pid*
pom.xml.next
pom.xml.releaseBackup
pom.xml.tag
pom.xml.versionsBackup
release.properties
replay_pid*
2 changes: 2 additions & 0 deletions spring-oracle-example/.gitattributes
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
/mvnw text eol=lf
*.cmd text eol=crlf
30 changes: 30 additions & 0 deletions spring-oracle-example/.github/workflows/maven.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
name: CI Build

on:
push:
branches:
- "**"

jobs:
build:
name: Build
runs-on: ubuntu-latest
strategy:
matrix:
distribution: [ 'temurin' ]
java: [ '21' ]
steps:
- uses: actions/checkout@v5

- name: Setup Java 21
uses: actions/setup-java@v5
with:
java-version: ${{ matrix.java }}
distribution: ${{ matrix.distribution }}
cache: 'maven'

- name: Grant execute permission for mvnw
run: chmod +x mvnw

- name: Build with Maven
run: ./mvnw clean verify
32 changes: 32 additions & 0 deletions spring-oracle-example/.gitignore
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
target/
.mvn/wrapper/maven-wrapper.jar
!**/src/main/**/target/
!**/src/test/**/target/

### STS ###
.apt_generated
.classpath
.factorypath
.project
.settings
.springBeans
.sts4-cache

### IntelliJ IDEA ###
.idea
*.iws
*.iml
*.ipr

### NetBeans ###
/nbproject/private/
/nbbuild/
/dist/
/nbdist/
/.nb-gradle/
build/
!**/src/main/**/build/
!**/src/test/**/build/

### VS Code ###
.vscode/
2 changes: 2 additions & 0 deletions spring-oracle-example/.mvn/wrapper/maven-wrapper.properties
Original file line number Diff line number Diff line change
@@ -0,0 +1,2 @@
distributionType=only-script
distributionUrl=https://repo.maven.apache.org/maven2/org/apache/maven/apache-maven/3.9.11/apache-maven-3.9.11-bin.zip
47 changes: 47 additions & 0 deletions spring-oracle-example/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
FROM eclipse-temurin:21-jdk-jammy as deps

WORKDIR /build

COPY --chmod=0755 mvnw mvnw
COPY .mvn/ .mvn/

RUN --mount=type=bind,source=pom.xml,target=pom.xml \
--mount=type=cache,target=/root/.m2 ./mvnw dependency:go-offline -DskipTests

FROM deps as package

WORKDIR /build

COPY ./src src/
RUN --mount=type=bind,source=pom.xml,target=pom.xml \
--mount=type=cache,target=/root/.m2 \
./mvnw package -DskipTests && \
mv target/$(./mvnw help:evaluate -Dexpression=project.artifactId -q -DforceStdout)-$(./mvnw help:evaluate -Dexpression=project.version -q -DforceStdout).jar target/app.jar

FROM package as extract

WORKDIR /build

RUN java -Djarmode=layertools -jar target/app.jar extract --destination target/extracted

FROM eclipse-temurin:21-jre-jammy AS final

ARG UID=10001
RUN adduser \
--disabled-password \
--gecos "" \
--home "/nonexistent" \
--shell "/sbin/nologin" \
--no-create-home \
--uid "${UID}" \
appuser
USER appuser

COPY --from=extract build/target/extracted/dependencies/ ./
COPY --from=extract build/target/extracted/spring-boot-loader/ ./
COPY --from=extract build/target/extracted/snapshot-dependencies/ ./
COPY --from=extract build/target/extracted/application/ ./

EXPOSE 8080

ENTRYPOINT [ "java", "org.springframework.boot.loader.launch.JarLauncher" ]
32 changes: 32 additions & 0 deletions spring-oracle-example/compose.yaml
Original file line number Diff line number Diff line change
@@ -0,0 +1,32 @@
services:

app:
build:
context: .
restart: unless-stopped
depends_on:
- oracle-db
environment:
SPRING_PROFILES_ACTIVE: default
SERVER_PORT: 8080
SPRING_DATASOURCE_URL: jdbc:oracle:thin:@oracle-db:1521/XEPDB1
SPRING_DATASOURCE_USERNAME: TEST_SCHEMA
SPRING_DATASOURCE_PASSWORD: Ag101Pwd123
SPRING_DATASOURCE_DRIVER: oracle.jdbc.OracleDriver
SPRING_JPA_HIBERNATE_DDL_AUTO: update
SPRING_JPA_SHOW_SQL: true
SPRING_HIBERNATE_DIALECT: org.hibernate.dialect.OracleDialect
ports:
- "8080:8080"

oracle-db:
image: gvenzl/oracle-xe:21-slim
container_name: oracle-xe
restart: unless-stopped
ports:
- "1521:1521"
environment:
ORACLE_PASSWORD: "Admin123"
shm_size: 1g
volumes:
- ./docker/oracle:/docker-entrypoint-initdb.d
5 changes: 5 additions & 0 deletions spring-oracle-example/docker/oracle/init.sql
Original file line number Diff line number Diff line change
@@ -0,0 +1,5 @@
ALTER SESSION SET CONTAINER = XEPDB1;
CREATE USER TEST_SCHEMA IDENTIFIED BY Ag101Pwd123;
GRANT CREATE SESSION TO TEST_SCHEMA;
GRANT CONNECT, RESOURCE TO TEST_SCHEMA;
ALTER USER TEST_SCHEMA QUOTA UNLIMITED ON USERS;
Loading
Loading