Вопрос или проблема
У меня есть многоуровневый проект Maven с двумя модулями: network
и devenv
. Структура проекта выглядит следующим образом:
service
├── network
│ ├── src
│ │ ├── main
│ │ ├── test
│ │ │ └── resources
│ │ │ └── application-bridge-to-bridge-test.properties
│ └── resources
├── devenv
│ └── resources
│ └── application.properties (содержит все свойства, необходимые для производства)
└── pom.xml
-
Тесты модуля
network
должны инициализировать свойства изapplication.properties
, а затем переопределять определенные значения, используяapplication-bridge-to-bridge-test.properties
(которые специфичны для сетевых тестов). -
Локально я справился с этим, добавив следующее в класс тестов сети:
@TestPropertySource(locations = {
"file:../devenv/src/main/resources/application.properties.properties",
"classpath:application-bridge-to-bridge-test.properties"
})
Это работает нормально локально, но когда конвейер запускает тесты в CI/CD, я получаю следующее исключение:
java.lang.IllegalStateException: Не удалось добавить PropertySource в Environment...
Дополнительное ограничение: Мы не можем импортировать модуль devenv в network, потому что network является зависимостью devenv. Эта циклическая зависимость сломает сборку.
Мой вопрос:
- Есть ли способ решить эту проблему, чтобы тесты работали в конвейере CI/CD?
- Какова лучшая практика для управления общими свойствами между модулями, чтобы избежать дублирования? Файлы свойств
network
иdevenv
в основном идентичны, и разработчикам легко забыть обновить оба файла, когда вносятся изменения.
Буду очень признателен за любые предложения или лучшие практики!
Вы можете рассмотреть возможность извлечения всей общедоступной конфигурации из файла application.properties
в devenv
в новый файл application-common.properties
. Этот новый файл должен находиться в модуле, который как devenv
, так и network
представляют. На этом этапе вы можете представить его следующим образом: @TestPropertySource({“classpath: application-common.properties”})
. Возможно, @TestPropertySource({“classpath*:application-common.properties”})
. Извините, что не использовал это таким образом. Если рассмотреть центр конфигурации (например, nacos), это может быть проще.
Ответ или решение
Для управления свойствами тестирования между двумя модулями в многомодульном проекте на Maven существует несколько вариантов, которые помогут решить возникшие проблемы и упростить управление конфигурацией.
Проблема с загрузкой свойств в CI/CD
-
Ошибка в CI/CD: Ошибка, которую вы получаете в CI/CD, связана с тем, что относительный путь к файлу
application.properties
, указанный в аннотации@TestPropertySource
, может не разрешаться правильно в окружении CI/CD. Это может вызвать проблемы, так как ваша система сборки не обязательно придерживается той же структуры каталогов.Решение: Используйте абсолютный путь или измените структуру вашего проекта, чтобы такие конфигурации могли быть доступны из общего модуля. Например, вы можете добавить центральный модуль (например,
config
илиcommon
), который будет содержать все общие ресурсы.
Управление общими свойствами
-
Вынос общих свойств: Чтобы избежать дублирования свойств в ваших модулях, вы можете выделить общие параметры конфигурации в отдельный файл
application-common.properties
.- Структура проекта: Можете создать новый модуль под названием
config
илиcommon
, который будет содержать общий файл свойств. -
Затем обновите ваши тестовые конфигурации следующим образом:
@TestPropertySource(locations = { "classpath:application-common.properties", "classpath:application-bridge-to-bridge-test.properties" })
Это позволит загружать общие свойства в обоих модулях без дублирования.
- Структура проекта: Можете создать новый модуль под названием
Автоматизация образцов свойств
-
Управление изменениями: Многие команды используют инструменты резервного копирования для управления конфигурациями. Вы можете рассмотреть возможность использования таких решений, как Spring Cloud Config, которые позволяют хранить все конфигурации во внешнем репозитории и предоставлять их на лету вашим модулям.
Также, не забудьте добавить сборку вашего общего модуля в конфигурацию
pom.xml
ваших модулей, чтобы пакетный менеджер Maven мог разрешить зависимости.
Резюме
- Используйте абсолютные пути или создайте общий модуль для хранения свойств.
- Выделите общие и специфические свойства в отдельные файлы для повышения удобства управления.
- Воспользуйтесь возможностями Spring для централизованного управления конфигурациями.
Следуя указанным рекомендациям, вы сможете эффективно управлять тестовыми свойствами между различными модулями в вашем проекте на Maven, избегая дублирования и минимизируя возможные ошибки как в локальной среде разработки, так и в CI/CD.