Spring Boot 3.3 с ошибкой базы данных поддержки CDS во время процесса сборки

Я работаю над проектом Spring Boot 3.3 с Java 21 и реализую новую функцию поддержки CDS (обмен данными классов). Приложение представляет собой стандартное CRUD-приложение с REST API, которое подключается к базе данных PostgreSQL. Мой application.yml выглядит так:

spring:
  datasource:
    url: jdbc:postgresql://host.docker.internal:5433/mydatabase
    username: myuser
    password: secret
  liquibase:
    change-log: classpath:db/changelog/db.changelog-master.xml
    contexts: schema, data
    database-change-log-lock-table: ${liquibase.database-change-log-lock-table}
    database-change-log-table: ${liquibase.database-change-log-table}
  jpa:
    properties:
      hibernate.show_sql: false
      hibernate.format_sql: true
      hibernate.highlight_sql: true
      hibernate.use_sql_comments: true
      hibernate.generate_statistics: false
      hibernate.hbm2ddl.auto: none # validate

audit:
  enable-spring-jpa-listener: true

cache:
  list:
    - name: absence-by-id
      time-to-live: 5m
      enabled: true
  default-time-to-live: 10m
  enable-cache-validation: true

У меня также есть Dockerfile, который используется для сборки и запуска приложения. Dockerfile выглядит следующим образом:

FROM bellsoft/liberica-runtime-container:jdk-21-crac-cds-musl as builder

WORKDIR /home/app
ADD . /home/app/spring-boot-clean-architecture
RUN cd spring-boot-clean-architecture && ./mvnw -Dmaven.test.skip=true -Daether.dependencyCollector.impl=bf clean package

FROM bellsoft/liberica-runtime-container:jdk-21-cds-slim-musl

WORKDIR /home/app
COPY --from=builder /home/app/spring-boot-clean-architecture/target/*.jar app.jar
COPY --from=builder /home/app/spring-boot-clean-architecture/configuration/development/ config/
RUN mv config/application-development.yml config/application.yml
RUN java -Djarmode=tools -jar app.jar extract --layers --launcher

RUN cp -r app/application/* .
RUN cp -r app/dependencies/* .
RUN cp -r app/spring-boot-loader/* .
RUN java -Dspring.aot.enabled=true -XX:ArchiveClassesAtExit=./app/application.jsa -Dspring.context.exit=onRefresh org.springframework.boot.loader.launch.JarLauncher

EXPOSE 8080
ENTRYPOINT exec java $JAVA_OPTS -Dspring.aot.enabled=true -XX:SharedArchiveFile=./app/application.jsa org.springframework.boot.loader.launch.JarLauncher

Сборка Docker работает нормально, когда моя база данных PostgreSQL работает. Однако во время CI/CD, когда база данных может быть недоступна, сборка завершается с ошибкой Caused by: java.net.ConnectException: Connection refused

И ошибка сборки Docker:

>>> RUN java -Dspring.aot.enabled=true -XX:ArchiveClassesAtExit=./app/application.jsa -Dspring.context.exit=onRefresh org.springframework.boot.loader.launch.JarLauncher
--------------------
ERROR: failed to solve: process "/bin/sh -c java -Dspring.aot.enabled=true -XX:ArchiveClassesAtExit=./app/application.jsa -Dspring.context.exit=onRefresh org.springframework.boot.loader.launch.JarLauncher" did not complete successfully: exit code: 1

Я рассматриваю следующие подходы, но не уверен, какой из них лучше:

  1. Используйте отдельный файл application.yml для CI/CD: настройте базу данных H2, чтобы приложение запускалось без необходимости использования реального экземпляра PostgreSQL.
  2. Исключения из автоконфигурации: исключите DataSourceAutoConfiguration и JpaRepositoriesAutoConfiguration, но это приводит к ошибкам, поскольку моим компонентам репозитория требуется менеджер сущностей. 3.Любой другой подход: есть ли другой способ более эффективно справиться с этой ситуацией?

Как лучше всего обрабатывать зависимости базы данных в процессе сборки CI/CD, чтобы избежать вышеуказанных ошибок или использовать Spring Boot с поддержкой CDS?

Несколько советов по работе с внешними соединениями во время обучения описаны здесь: github.com/spring-projects/spring-lifecycle-smoke-tests/blob‌​/…

Scott Frederick 13.06.2024 16:27

@Random Guy, ты решил эту проблему?

Mgreg 23.07.2024 09:12

Да, я это сделал, мне помогли документы Скотта, поэтому, используя свойства в application.yml, я обеспечил успешный «пробный прогон», который я искал. github.com/spring-projects/spring-lifecycle-smoke-tests/blob‌​/…

Random Guy 24.07.2024 10:31
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
3
186
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Как отметил Скотт в комментариях, существуют варианты настройки тестового запуска для JPA, JDBC, R2DBC, Spring Batch, Liquibase..., которые документированы прямо здесь https://github.com/spring-projects/spring -lifecycle-smoke-tests/blob/main/README.adoc#training-run-configuration

Использование тех из моего файла application.yml, которые использовались для этого запуска CDS, обеспечило успешный запуск и позволило мне использовать поддержку CDS. Еще раз спасибо, Скотт!

Поделитесь подробностями, например, какие действия вы предприняли для решения проблемы. Это поможет в будущем. Поскольку срок действия ссылок может истекать с течением времени

Aishwarya 24.07.2024 11:11

Другие вопросы по теме