mirror of
https://github.com/spring-projects/spring-petclinic.git
synced 2025-12-27 10:57:28 +00:00
Remove unavailable spring-boot-starter-restclient dependency
This commit is contained in:
parent
d42bdcbdfe
commit
8c3443a12f
10 changed files with 116 additions and 62 deletions
10
.dockerignore
Normal file
10
.dockerignore
Normal file
|
|
@ -0,0 +1,10 @@
|
|||
target
|
||||
.mvn
|
||||
.git
|
||||
.github
|
||||
.idea
|
||||
*.iml
|
||||
Dockerfile*
|
||||
node_modules
|
||||
build
|
||||
out
|
||||
4
.github/workflows/ci-petclinic-eks.yaml
vendored
4
.github/workflows/ci-petclinic-eks.yaml
vendored
|
|
@ -29,7 +29,7 @@ jobs:
|
|||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "25"
|
||||
java-version: "21"
|
||||
cache: maven
|
||||
|
||||
- name: Maven build & test
|
||||
|
|
@ -61,7 +61,7 @@ jobs:
|
|||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "25"
|
||||
java-version: "21"
|
||||
cache: maven
|
||||
|
||||
- name: Configure AWS credentials (OIDC)
|
||||
|
|
|
|||
4
.github/workflows/ci-petclinic-gke.yaml
vendored
4
.github/workflows/ci-petclinic-gke.yaml
vendored
|
|
@ -31,7 +31,7 @@ jobs:
|
|||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "25"
|
||||
java-version: "21"
|
||||
cache: maven
|
||||
|
||||
- name: Maven build & test
|
||||
|
|
@ -63,7 +63,7 @@ jobs:
|
|||
uses: actions/setup-java@v4
|
||||
with:
|
||||
distribution: temurin
|
||||
java-version: "25"
|
||||
java-version: "21"
|
||||
cache: maven
|
||||
|
||||
- name: Authenticate to Google Cloud (WIF)
|
||||
|
|
|
|||
77
Dockerfile
77
Dockerfile
|
|
@ -1,9 +1,9 @@
|
|||
# syntax=docker/dockerfile:1.6
|
||||
|
||||
ARG JAVA_VERSION=21
|
||||
ARG MAVEN_IMAGE=maven:3.9-eclipse-temurin-21
|
||||
ARG JDK_IMAGE=eclipse-temurin:21-jdk
|
||||
ARG DISTROLESS_IMAGE=gcr.io/distroless/base-debian12:nonroot
|
||||
ARG MAVEN_IMAGE=maven:3.9-eclipse-temurin-${JAVA_VERSION}
|
||||
ARG JDK_IMAGE=eclipse-temurin:${JAVA_VERSION}-jdk
|
||||
ARG RUNTIME_IMAGE=eclipse-temurin:${JAVA_VERSION}-jre
|
||||
|
||||
# =========================
|
||||
# 1) Build
|
||||
|
|
@ -17,7 +17,7 @@ RUN --mount=type=cache,target=/root/.m2 \
|
|||
|
||||
COPY . .
|
||||
RUN --mount=type=cache,target=/root/.m2 \
|
||||
mvn -q -DskipTests package
|
||||
mvn -q -DskipTests clean package
|
||||
|
||||
RUN set -eux; \
|
||||
JAR="$(ls -1 target/*.jar | head -n 1)"; \
|
||||
|
|
@ -37,7 +37,6 @@ RUN set -eux; \
|
|||
mkdir -p /whatap; \
|
||||
tar -xzf /tmp/whatap.agent.java.tar.gz -C /whatap; \
|
||||
rm -f /tmp/whatap.agent.java.tar.gz; \
|
||||
# agent jar 찾기
|
||||
AGENT_JAR="$(find /whatap -maxdepth 6 -type f \
|
||||
\( -name 'whatap.agent*.jar' -o -name '*whatap*agent*.jar' \) | head -n 1)"; \
|
||||
test -n "$AGENT_JAR"; \
|
||||
|
|
@ -46,48 +45,44 @@ RUN set -eux; \
|
|||
chmod -R a=rX /whatap
|
||||
|
||||
# =========================
|
||||
# 3) jlink Slim JRE
|
||||
# 3) Runtime (fallback-first: temurin JRE)
|
||||
# =========================
|
||||
FROM ${JDK_IMAGE} AS jre
|
||||
WORKDIR /jrebuild
|
||||
|
||||
COPY --from=builder /app/app.jar ./app.jar
|
||||
|
||||
RUN set -eux; \
|
||||
DEPS="$(jdeps --ignore-missing-deps --multi-release=21 --print-module-deps app.jar)"; \
|
||||
jlink --strip-debug --no-man-pages --no-header-files --compress=2 \
|
||||
--add-modules "$DEPS,\
|
||||
java.desktop,java.management,jdk.management,java.sql,java.naming,\
|
||||
java.logging,java.security.jgss,jdk.security.auth,java.security.sasl,java.instrument,\
|
||||
jdk.crypto.ec,jdk.unsupported,java.xml" \
|
||||
--output /opt/jre
|
||||
|
||||
# =========================
|
||||
# 4) Runtime (Distroless)
|
||||
# =========================
|
||||
FROM ${DISTROLESS_IMAGE}
|
||||
# 기본 목표는 “정상 기동”이므로 디버깅이 용이한 eclipse-temurin JRE를 사용한다.
|
||||
# distroless/jlink 최적화는 별도 커밋에서 재적용한다.
|
||||
FROM ${RUNTIME_IMAGE}
|
||||
WORKDIR /app
|
||||
|
||||
COPY --from=jre /opt/jre /opt/jre
|
||||
COPY --from=builder /app/app.jar ./app.jar
|
||||
COPY --from=builder /app/app.jar /app/app.jar
|
||||
COPY --from=whatap_agent /whatap /whatap
|
||||
|
||||
# ✅ 핵심: /whatap 을 nonroot(65532)가 소유하도록 복사
|
||||
COPY --from=whatap_agent --chown=65532:65532 /whatap /whatap
|
||||
ENV JAVA_TOOL_OPTIONS="" \
|
||||
JAVA_OPTS="" \
|
||||
ENABLE_WHATAP=false \
|
||||
WHATAP_HOME=/whatap
|
||||
|
||||
ENV JAVA_HOME=/opt/jre
|
||||
ENV PATH="/opt/jre/bin:${PATH}"
|
||||
# ENTRYPOINT wrapper: ENABLE_WHATAP=true 일 때만 agent 옵션을 추가한다.
|
||||
COPY <<'EOF' /entrypoint.sh
|
||||
#!/bin/sh
|
||||
set -eu
|
||||
|
||||
# ✅ whatap home 명시(에이전트가 내부 파일 쓸 때 경로 확정)
|
||||
ENV WHATAP_HOME=/whatap
|
||||
JAVA_ARGS=${JAVA_OPTS:-}
|
||||
case "${ENABLE_WHATAP:-false}" in
|
||||
true|TRUE|True)
|
||||
JAVA_ARGS="$JAVA_ARGS -javaagent:/whatap/whatap.agent.jar"
|
||||
JAVA_ARGS="$JAVA_ARGS -Dwhatap.paramkey=/whatap/paramkey.txt"
|
||||
JAVA_ARGS="$JAVA_ARGS -Dwhatap.server.host=${WHATAP_SERVER_HOST:-}"
|
||||
JAVA_ARGS="$JAVA_ARGS -Dlicense=${WHATAP_LICENSE:-}"
|
||||
JAVA_ARGS="$JAVA_ARGS -Dwhatap.micro.enabled=${WHATAP_MICRO_ENABLED:-}"
|
||||
JAVA_ARGS="$JAVA_ARGS --add-opens=java.base/java.lang=ALL-UNNAMED"
|
||||
;;
|
||||
esac
|
||||
|
||||
ENV JAVA_TOOL_OPTIONS="\
|
||||
-javaagent:/whatap/whatap.agent.jar \
|
||||
-Dwhatap.paramkey=/whatap/paramkey.txt \
|
||||
--add-opens=java.base/java.lang=ALL-UNNAMED \
|
||||
-XX:+UseContainerSupport \
|
||||
-XX:MaxRAMPercentage=75 \
|
||||
-XX:+ExitOnOutOfMemoryError \
|
||||
-XX:+AlwaysActAsServerClassMachine"
|
||||
exec java $JAVA_ARGS -XX:+UseContainerSupport -XX:MaxRAMPercentage=75 \
|
||||
-XX:+ExitOnOutOfMemoryError -XX:+AlwaysActAsServerClassMachine \
|
||||
-jar /app/app.jar
|
||||
EOF
|
||||
|
||||
RUN chmod +x /entrypoint.sh
|
||||
|
||||
EXPOSE 8080
|
||||
ENTRYPOINT ["/opt/jre/bin/java", "-jar", "/app/app.jar"]
|
||||
ENTRYPOINT ["/entrypoint.sh"]
|
||||
|
|
|
|||
25
README.md
25
README.md
|
|
@ -110,3 +110,28 @@ CSP별 Ingress, Registry, Secret 차이로 매니페스트 분리
|
|||
|
||||
본 프로젝트는 멀티클라우드 환경에서 GitOps 기반 CI/CD와
|
||||
운영 분리를 어떻게 설계할 수 있는지를 보여주는 예제입니다.
|
||||
|
||||
---
|
||||
|
||||
## 9. Spring Boot 3.x 다운그레이드 메모 (Boot 4.0.0-M3 → Boot 3.2.5)
|
||||
|
||||
- 참고 문서: *Spring Boot 3 Migration Guide*, *Spring Boot 3.2 Release Notes*, *Spring Framework 6.x*.
|
||||
- Jakarta 네임스페이스 전환 이후 API 의존성은 Boot 3.x 기본 BOM을 따라가며, Boot 4 / Spring 7 전용 의존성은 제거/하향 조정했다.
|
||||
- Java 21 런타임을 유지하며, 모듈 경계 문제를 피하기 위해 `--add-opens=java.base/java.lang=ALL-UNNAMED` 옵션을 Whatap 활성화 시에만 주입한다.
|
||||
- distroless/jlink 최적화는 별도 커밋으로 재적용 예정이며, 현재는 디버깅 및 호환성을 우선한 `eclipse-temurin:21-jre` 런타임을 사용한다.
|
||||
|
||||
### 잠재 호환 이슈 및 대응
|
||||
- 서드파티 라이브러리의 Spring 7 전용 API 사용 → Boot 3.x BOM 기준으로 의존성 하향. 필요 시 BOM에 맞는 버전으로 재빌드.
|
||||
- 에이전트/모듈 경계(`--add-opens`) 누락 시 JVM 시작 실패 가능 → Whatap 활성화 경로에서만 옵션을 주입하고, 기본 OFF 모드로 기동 보장.
|
||||
- 컨테이너 디버깅(쉘 유무) → distroless 대신 temurin JRE를 기본값으로 사용, 추후 최적화는 별도 PR로 진행.
|
||||
|
||||
---
|
||||
|
||||
## 10. WhaTap APM 토글 사용법
|
||||
|
||||
- 기본값: OFF (`ENABLE_WHATAP=false`).
|
||||
- 활성화: 컨테이너/Deployment 환경 변수로 아래를 설정한다.
|
||||
- `ENABLE_WHATAP=true`
|
||||
- `WHATAP_LICENSE`, `WHATAP_SERVER_HOST`, `WHATAP_MICRO_ENABLED`
|
||||
- 이미지에 `/whatap/whatap.agent.jar`, `/whatap/paramkey.txt`가 포함되어 있으며, 활성화 시 엔트리포인트 래퍼가 자동으로 JVM 옵션을 주입한다.
|
||||
- 외부 Secret(ExternalSecret: `whatap-apm-secret`)은 라이선스/서버/마이크로 트레이싱 키만 제공하며, `paramkey.txt`는 이미지에 포함된 파일을 사용한다.
|
||||
|
|
|
|||
|
|
@ -1,7 +1,7 @@
|
|||
plugins {
|
||||
id 'java'
|
||||
id 'checkstyle'
|
||||
id 'org.springframework.boot' version '4.0.0-M3'
|
||||
id 'org.springframework.boot' version '3.2.5'
|
||||
id 'io.spring.dependency-management' version '1.1.7'
|
||||
id 'org.graalvm.buildtools.native' version '0.11.1'
|
||||
id 'org.cyclonedx.bom' version '3.0.0'
|
||||
|
|
@ -13,11 +13,11 @@ plugins {
|
|||
gradle.startParameter.excludedTaskNames += [ "checkFormatAot", "checkFormatAotTest" ]
|
||||
|
||||
group = 'org.springframework.samples'
|
||||
version = '4.0.0-SNAPSHOT'
|
||||
version = '3.2.5-SNAPSHOT'
|
||||
|
||||
java {
|
||||
toolchain {
|
||||
languageVersion = JavaLanguageVersion.of(25)
|
||||
languageVersion = JavaLanguageVersion.of(21)
|
||||
}
|
||||
}
|
||||
|
||||
|
|
@ -77,7 +77,7 @@ checkstyleNohttp {
|
|||
}
|
||||
|
||||
tasks.withType(JavaCompile).configureEach {
|
||||
options.release = 17
|
||||
options.release = 21
|
||||
options.errorprone {
|
||||
disableAllChecks = true
|
||||
}
|
||||
|
|
|
|||
|
|
@ -37,17 +37,15 @@ spec:
|
|||
- name: SPRING_DATASOURCE_DRIVER_CLASS_NAME
|
||||
value: "org.postgresql.Driver"
|
||||
- name: APP_VERSION
|
||||
value: "A-4.0.0-49c6082"
|
||||
value: "A-3.2.x"
|
||||
- name: NODE_IP
|
||||
valueFrom: {fieldRef: {fieldPath: status.hostIP}}
|
||||
- name: NODE_NAME
|
||||
valueFrom: {fieldRef: {fieldPath: spec.nodeName}}
|
||||
- name: POD_NAME
|
||||
valueFrom: {fieldRef: {fieldPath: metadata.name}}
|
||||
# ✅ Whatap + 기존 JVM 옵션 (덮어쓰기 주의 OK)
|
||||
- name: JAVA_TOOL_OPTIONS
|
||||
value: >-
|
||||
-javaagent:/whatap/whatap.agent.jar -Dwhatap.server.host=$(WHATAP_SERVER_HOST) -Dlicense=$(WHATAP_LICENSE) -Dwhatap.micro.enabled=$(WHATAP_MICRO_ENABLED) -Dwhatap.paramkey=/whatap/paramkey.txt -XX:+UseContainerSupport -XX:MaxRAMPercentage=75 -XX:+ExitOnOutOfMemoryError -XX:+AlwaysActAsServerClassMachine
|
||||
- name: ENABLE_WHATAP
|
||||
value: "false"
|
||||
ports:
|
||||
- name: http
|
||||
containerPort: 8080
|
||||
|
|
|
|||
26
k8s/gcp/10-petclinic-secret-whatap.yaml
Normal file
26
k8s/gcp/10-petclinic-secret-whatap.yaml
Normal file
|
|
@ -0,0 +1,26 @@
|
|||
apiVersion: external-secrets.io/v1
|
||||
kind: ExternalSecret
|
||||
metadata:
|
||||
name: whatap-apm-secret
|
||||
namespace: petclinic-ns
|
||||
spec:
|
||||
refreshInterval: 1h
|
||||
secretStoreRef:
|
||||
name: gcp-secretmanager
|
||||
kind: ClusterSecretStore
|
||||
target:
|
||||
name: whatap-apm-secret
|
||||
creationPolicy: Owner
|
||||
data:
|
||||
- secretKey: WHATAP_LICENSE
|
||||
remoteRef:
|
||||
key: finalproj-dev-whatap-apm
|
||||
property: license
|
||||
- secretKey: WHATAP_SERVER_HOST
|
||||
remoteRef:
|
||||
key: finalproj-dev-whatap-apm
|
||||
property: server_host
|
||||
- secretKey: WHATAP_MICRO_ENABLED
|
||||
remoteRef:
|
||||
key: finalproj-dev-whatap-apm
|
||||
property: micro_enabled
|
||||
|
|
@ -35,6 +35,8 @@ spec:
|
|||
envFrom:
|
||||
- secretRef:
|
||||
name: petclinic-db-secret
|
||||
- secretRef:
|
||||
name: whatap-apm-secret
|
||||
|
||||
# 🔹 여기: Spring profile을 postgres용으로
|
||||
env:
|
||||
|
|
@ -48,7 +50,9 @@ spec:
|
|||
- name: SPRING_JPA_HIBERNATE_DDL_AUTO
|
||||
value: "none"
|
||||
- name: APP_VERSION
|
||||
value: "local"
|
||||
value: "A-3.2.x"
|
||||
- name: ENABLE_WHATAP
|
||||
value: "false"
|
||||
|
||||
ports:
|
||||
- name: http
|
||||
|
|
|
|||
10
pom.xml
10
pom.xml
|
|
@ -5,13 +5,13 @@
|
|||
<parent>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-parent</artifactId>
|
||||
<version>4.0.0-M3</version>
|
||||
<version>3.2.5</version>
|
||||
<relativePath></relativePath>
|
||||
</parent>
|
||||
|
||||
<groupId>org.springframework.samples</groupId>
|
||||
<artifactId>spring-petclinic</artifactId>
|
||||
<version>4.0.0-SNAPSHOT</version>
|
||||
<version>3.2.5-SNAPSHOT</version>
|
||||
|
||||
<name>petclinic</name>
|
||||
|
||||
|
|
@ -72,11 +72,6 @@
|
|||
<artifactId>spring-boot-starter-test</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
<dependency>
|
||||
<groupId>org.springframework.boot</groupId>
|
||||
<artifactId>spring-boot-starter-restclient</artifactId>
|
||||
<scope>test</scope>
|
||||
</dependency>
|
||||
|
||||
<!-- Databases - Uses H2 by default -->
|
||||
<dependency>
|
||||
|
|
@ -316,6 +311,7 @@
|
|||
<?m2e ignore?>
|
||||
<groupId>org.cyclonedx</groupId>
|
||||
<artifactId>cyclonedx-maven-plugin</artifactId>
|
||||
<version>2.9.1</version>
|
||||
</plugin>
|
||||
|
||||
</plugins>
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue