-
Notifications
You must be signed in to change notification settings - Fork 0
feat(spring-oracle-example): initialize Spring Boot project with Orac… #67
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
Changes from 1 commit
File filter
Filter by extension
Conversations
Jump to
Diff view
Diff view
There are no files selected for viewing
| 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 | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
Suggested change
🧰 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 |
||||||||||||||||||||||||||||||||||||||||||||
| 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
| - 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
There was a problem hiding this comment. Choose a reason for hiding this commentThe 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
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||
| - name: Wait for containers to initialize | ||||||||||||||||||||||||||||||||||||||||||||
| run: sleep 20 | ||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||
| - name: Check container health | ||||||||||||||||||||||||||||||||||||||||||||
| run: | | ||||||||||||||||||||||||||||||||||||||||||||
| ./.github/scripts/check-container-health.sh "${{ steps.services.outputs.services }}" | ||||||||||||||||||||||||||||||||||||||||||||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Replace fixed sleep with a bounded health wait loop Avoids flakiness on slow Oracle startup. Apply: - - name: Wait for containers to initialize
- run: sleep 20
-
- - name: Check container health
- run: |
- ./.github/scripts/check-container-health.sh "${{ steps.services.outputs.services }}"
+ - name: Wait until services are healthy (max 5m)
+ run: |
+ set -e
+ for svc in ${{ steps.services.outputs.services }}; do
+ id="$(docker compose -f ./spring-oracle-example/compose.yaml ps -q "$svc")"
+ for i in {1..60}; do
+ status="$(docker inspect -f '{{if .State.Health}}{{.State.Health.Status}}{{else}}starting{{end}}' "$id" 2>/dev/null || echo starting)"
+ [ "$status" = "healthy" ] && break
+ sleep 5
+ done
+ docker inspect -f '{{.Name}} -> {{.State.Health.Status}}' "$id"
+ done
+
+ - name: Check container health
+ run: ./.github/scripts/check-container-health.sh "${{ steps.services.outputs.services }}"📝 Committable suggestion
Suggested change
🧰 Tools🪛 YAMLlint (1.37.1)[error] 68-68: no new line character at the end of file (new-line-at-end-of-file) 🤖 Prompt for AI Agents
coderabbitai[bot] marked this conversation as resolved.
Outdated
|
||||||||||||||||||||||||||||||||||||||||||||
| 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 | ||||||||||
|
Comment on lines
+32
to
+33
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Consider keeping LICENSE/README in context. Some multi-stage builds copy README/LICENSE into the image labels or docs; harmless to include given size. -LICENSE
-README.md
+# LICENSE
+# README.md📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||
| **/*.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* | ||||||||||
| Original file line number | Diff line number | Diff line change | ||||||||||
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| @@ -0,0 +1,2 @@ | ||||||||||||
| /mvnw text eol=lf | ||||||||||||
| *.cmd text eol=crlf | ||||||||||||
|
Comment on lines
+1
to
+2
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) EOL rules look good; add shell scripts for completeness. Add LF for executable shell scripts to avoid CRLF issues on *nix. /mvnw text eol=lf
*.cmd text eol=crlf
+*.sh text eol=lf📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||
| 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 |
| 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/ |
| 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 |
| 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 | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+16
to
+19
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Minor: avoid repeated Maven evaluations in build step You invoke ./mvnw three extra times just to compute artifactId/version. Cache finalName once to reduce build time/log noise. Apply: -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
+RUN --mount=type=bind,source=pom.xml,target=pom.xml \
+ --mount=type=cache,target=/root/.m2 \
+ APP_NAME=$(./mvnw -q -DforceStdout help:evaluate -Dexpression=project.build.finalName) && \
+ ./mvnw -q package -DskipTests && \
+ mv "target/${APP_NAME}.jar" target/app.jar📝 Committable suggestion
Suggested change
🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
|
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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" ] | ||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
|
Comment on lines
+27
to
+47
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. Fix final image: copy as root, set WORKDIR, classpath, and only then drop to non-root Current COPYs run as appuser into "/", and ENTRYPOINT lacks a classpath, so the container will fail to start. Move USER after COPY (or use --chown), set a working dir, copy to that dir, and use the Boot loader classpath. Apply: -FROM eclipse-temurin:21-jre-jammy AS final
-
-ARG UID=10001
-RUN adduser \
+FROM eclipse-temurin:21-jre-jammy AS final
+WORKDIR /app
+
+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/ ./
+COPY --from=extract /build/target/extracted/dependencies/ /app/dependencies/
+COPY --from=extract /build/target/extracted/spring-boot-loader/ /app/spring-boot-loader/
+COPY --from=extract /build/target/extracted/snapshot-dependencies/ /app/snapshot-dependencies/
+COPY --from=extract /build/target/extracted/application/ /app/application/
EXPOSE 8080
-
-ENTRYPOINT [ "java", "org.springframework.boot.loader.launch.JarLauncher" ]
+USER appuser
+ENTRYPOINT ["java","-cp","/app:/app/dependencies/*:/app/snapshot-dependencies/*:/app/spring-boot-loader/*","org.springframework.boot.loader.launch.JarLauncher"]📝 Committable suggestion
Suggested change
🧰 Tools🪛 Checkov (3.2.334)[low] 1-47: Ensure that HEALTHCHECK instructions have been added to container images (CKV_DOCKER_2)
Comment on lines
+45
to
+47
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Add a container HEALTHCHECK (optional but recommended) A simple HTTP probe improves ops. If you don’t use Actuator, tweak the URL. Apply: EXPOSE 8080
+HEALTHCHECK --interval=30s --timeout=5s --start-period=40s --retries=5 \
+ CMD wget -qO- http://127.0.0.1:8080/actuator/health | grep -q '"status":"UP"' || exit 1
USER appuser
🧰 Tools🪛 Checkov (3.2.334)[low] 1-47: Ensure that HEALTHCHECK instructions have been added to container images (CKV_DOCKER_2) 🤖 Prompt for AI Agents |
||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
| 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: | ||
|
Comment on lines
+7
to
+9
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🛠️ Refactor suggestion Wait for DB readiness using healthchecks. depends_on alone doesn’t wait for Oracle to accept connections; add service healthcheck and condition. Apply: app:
@@
- depends_on:
- - oracle-db
+ depends_on:
+ oracle-db:
+ condition: service_healthy
@@
oracle-db:
@@
+ healthcheck:
+ test: ["CMD-SHELL", "echo 'SELECT 1 FROM DUAL;' | sqlplus -s SYSTEM:${ORACLE_PASSWORD}@localhost:1521/XEPDB1 | grep -q 1"]
+ interval: 10s
+ timeout: 5s
+ retries: 30
+ start_period: 60sAlso applies to: 22-32 🤖 Prompt for AI Agents |
||
| 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 | ||
|
Comment on lines
+10
to
+18
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) 🛠️ Refactor suggestion Hard-coded credentials in Compose; externalize and require via .env. Avoid committing secrets; enforce presence at runtime. Apply: 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_USERNAME: ${SPRING_DATASOURCE_USERNAME:?required}
+ SPRING_DATASOURCE_PASSWORD: ${SPRING_DATASOURCE_PASSWORD:?required}
SPRING_DATASOURCE_DRIVER: oracle.jdbc.OracleDriver
SPRING_JPA_HIBERNATE_DDL_AUTO: update
SPRING_JPA_SHOW_SQL: true
SPRING_HIBERNATE_DIALECT: org.hibernate.dialect.OracleDialect
@@
environment:
- ORACLE_PASSWORD: "Admin123"
+ ORACLE_PASSWORD: ${ORACLE_PASSWORD:?required}Add an Want me to generate Also applies to: 28-29 🧰 Tools🪛 Checkov (3.2.334)[low] 14-15: Base64 High Entropy String (CKV_SECRET_6) 🤖 Prompt for AI Agents |
||
| 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 | ||
|
Comment on lines
+1
to
+32
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Add trailing newline. Fix linter complaint. 🧰 Tools🪛 Checkov (3.2.334)[low] 14-15: Base64 High Entropy String (CKV_SECRET_6) 🪛 YAMLlint (1.37.1)[error] 32-32: no new line character at the end of file (new-line-at-end-of-file) 🤖 Prompt for AI Agents |
||
| 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; | ||
|
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 🧹 Nitpick (assertive) Plaintext password committed. Keep for demo if intentional, but prefer sourcing from env/secrets during init to avoid teaching bad practices. 🤖 Prompt for AI Agents |
||
| GRANT CREATE SESSION TO TEST_SCHEMA; | ||
| GRANT CONNECT, RESOURCE TO TEST_SCHEMA; | ||
| ALTER USER TEST_SCHEMA QUOTA UNLIMITED ON USERS; | ||
|
Comment on lines
+1
to
+5
There was a problem hiding this comment. Choose a reason for hiding this commentThe reason will be displayed to describe this comment to others. Learn more. 💡 Verification agent 🧩 Analysis chainAvoid deprecated/over-privileged roles and confirm container context.
Would you like me to tailor this for your exact Oracle image? Proposed revision: -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;
+-- WHENEVER SQLERROR EXIT SQL.SQLCODE
+-- Switch container only if running in CDB$ROOT
+-- ALTER SESSION SET CONTAINER = XEPDB1;
+CREATE USER TEST_SCHEMA IDENTIFIED BY "Ag101Pwd123";
+GRANT CREATE SESSION TO TEST_SCHEMA;
+GRANT CREATE TABLE, CREATE SEQUENCE, CREATE VIEW, CREATE TRIGGER, CREATE PROCEDURE TO TEST_SCHEMA;
+ALTER USER TEST_SCHEMA QUOTA 200M ON USERS;🌐 Web query: 💡 Result: Short answer: The image runs init SQL as SYSDBA in the CDB root by default, but you can switch to the pluggable DB inside those scripts. So:
Sources:
References: Keep the container switch; remove legacy roles and limit quotas
🤖 Prompt for AI Agents |
||
There was a problem hiding this comment.
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:
📝 Committable suggestion
🧰 Tools
🪛 YAMLlint (1.37.1)
[warning] 3-3: truthy value should be one of [false, true]
(truthy)
🤖 Prompt for AI Agents