Где Нам Следует Хранить Файл Свойств Приложения При Продвижении Сборки С Помощью Jenkins?

  • Автор темы Matreshka
  • Обновлено
  • 14, Oct 2024
  • #1

Мы используем Spring Boot для разработки серверных служб Java.

application_test/uat/production.properties
file has the database configurations. We are deploying in 4 different environments (dev, test, UAT, and production). The properties files will be different for different environments. Where should we keep these files and how should do build promotion using Jenkins? We are using Apache Tomcat to deploy our WAR file.

Теперь мы храним файл свойств в

@PropertySource(value = {"file:${catalina.base}/conf/application_dev.properties"})
directory and accessing using the following code.

C:\Program Files\Apache Software Foundation\Tomcat 7.0\conf

Каждый раз, когда мы развертываем в разных средах, нам необходимо заменить соответствующее имя файла.

application.properties
, commit the code and let Jenkins build and deploy. Now manually we have to keep the files in different environments too.

Подскажите, пожалуйста, как нам это сделать.

#jenkins #jenkins-pipeline #spring-boot

Matreshka


Рег
28 Jun, 2007

Тем
74

Постов
216

Баллов
646
  • 25, Oct 2024
  • #2

Я не согласен с @levi, вам следует придерживаться метода 12-факторного приложения. Оставляем конфиги в репозитории. Простые изменения пароля или небольших настроек требуют фиксации и перестройки конвейера. Это слишком много работы для такой простой вещи.

Последние три компании, в которых я работал, используют репозитории «одного филиала». Существует только основная ветка, и разработчики создают на ее основе «функциональные» ветки. Все различные среды создаются из мастера.

В этом случае у нас есть статический файл конфигурации, но все значения вводятся конвейером сборки. Вы можете получить их из разных источников: переменные окружения сервера сборки, внешний инструмент (Hashicorp Vault) или даже другой репозиторий, содержащий все конфигурации (последний наименее желателен).

 

Trxtrainyme5


Рег
05 Dec, 2011

Тем
80

Постов
200

Баллов
620
  • 25, Oct 2024
  • #3

Типичный подход — использовать папку для каждой среды, содержащую файлы с одинаковыми именами:

@Value("${name}")
private String name;

Затем параметризуйте @PropertySource, чтобы использовать переменную среды, например «env»:

@PropertySource

Теперь вам просто нужно убедиться, что в каждой среде существует определенная переменная среды операционной системы под названием «env», которая установлена ​​правильно (т. е. dev, test, uat или prod). Вы не указали, как запускаете свое приложение (скрипт запуска сервера j2ee в Linux? Докер-контейнер Springboot?), Но установка переменной среды в каждой среде не должна быть проблемой.

Вместо того, чтобы загружать файлы из «${catalina.base}», вы можете загружать файлы из пути к классам, например:

src/main/resources/dev/application.properties
src/main/resources/test/application.properties
src/main/resources/uat/application.properties
src/main/resources/prod/application.properties

Если вы создаете с помощью maven, вы можете создать папки в разделе

src/main/resources
and they will be скопировано в путь к классам:

// see https://stackoverflow.com/a/26387933/329496
@PropertySource("classpath:${env}/application.properties")

Это значительно упростило ситуацию. Дженкинсу вообще не нужно ничего делать, поскольку один и тот же артефакт сборки/выпуска можно запускать в любой среде. Обычно Дженкинсу приходится выполнять дополнительную работу по перенастройке приложения для работы в определенной среде. Скорее, вам следует стремиться к тому, чтобы одно задание выпуска Jenkins создавало артефакт, который можно было бы просто скопировать между средами.

У такого подхода есть один недостаток. Если вы хотите создать новую среду, вам необходимо добавить новый файл в систему управления версиями и создать новый артефакт выпуска. При использовании устаревших технологий настройка новых сред требует большой работы (например, ввод в эксплуатацию виртуальных машин и баз данных), поэтому этот «дополнительный шаг» по добавлению файла в код не кажется проблемой.

Благодаря более современным облачным технологиям, таким как Kubernetes, вы можете настроить среду за считанные секунды и «по требованию». В этом случае вы не хотите предварительно указывать свою среду в своей кодовой базе. Скорее вам следует следовать подходу 12factor.net и определять каждое свойство как переменную среды, а Spring просто использовать их напрямую. Если вы посмотрите на нынешнюю Springboot документация по умолчанию он использует переменные среды. Это означает, что если вы не определили

@PropertySource("file:${catalina.base}/conf/${env}/application.properties") 
but you are using things like:

conf/dev/application.properties
conf/test/application.properties
conf/uat/application.properties
conf/prod/application.properties

они будут установлены из переменной среды то же имя, но с использованием всех заглавных букв. Тогда проблема переходит к тому, «как убедиться, что переменные среды правильно настроены в каждой среде». Технологии, которые позволяют легко развернуть среду за считанные секунды (kubernetes, cloudfoundry, swarm), также обычно упрощают управление переменными среды. С помощью kubernetes вы создаете «ConfigMap» (например, «my-app-properties») и имеете он монтируется как переменные среды где каждый ключ+значение определяет уникальную переменную среды для приложения. Каждая логическая среда может тогда представлять собой отдельное пространство имен Kubernetes (возможно, в общем кластере для разработки/тестирования, но в выделенном кластере для рабочей среды), которое имеет свой собственный объект конфигурации «my-app-properties», определяющий переменные среды для этой логической среды.

Вы можете поместить эти настройки под контроль версий, но не в репозиторий исходного кода приложения. Вместо этого вы можете использовать подход «инфраструктура как код», при котором все, что запускает приложение (например, все сценарии и yaml для настройки сред), находится в отдельном репозитории git. Затем вы можете настроить задание развертывания конфигурации, которое запускается веб-перехватчиком git в репозитории конфигурации. Это может привести к вытеснению новых переменных среды. Это позволяет вам осуществлять непрерывное развертывание изменений конфигурации, независимое от непрерывного развертывания кода приложения.

Если вы используете Kubernetes, то Helmfile — отличный выбор, поскольку он не будет обновлять в Kubernetes ничего, что не изменилось в git. Это означает, что можно безопасно повторно применять всю конфигурацию в репозитории git при каждом нажатии на защищенную главную ветку; helmfile дважды проверит, что уже развернуто, и обновит только те объекты конфигурации Kubernetes, которые необходимо обновить.

 

Wengerow46


Рег
08 May, 2020

Тем
93

Постов
207

Баллов
702
  • 25, Oct 2024
  • #4

У вас может быть ветка для каждой среды. Таким образом, ветка «dev» будет собирать и развертывать приложение «dev» в среде «dev».

Хотя согласно 12factor, настройки среды должны находиться за пределами репозитория вашего приложения. Хотя иногда сделать это сложнее, чем просто нарушить это правило.

 

Arrafceld81


Рег
25 Oct, 2024

Тем
67

Постов
213

Баллов
578
Похожие темы Дата
Похожие темы
Dockerfile — Докер-Контейнер Minecraft Отказывается Подключаться
Ansible — Настройка Нескольких Различных Сетевых Конфигураций Raspberry Pi
Jenkins 2.164.3 — Установка Программируемых Плагинов Для Определенных Версий
Развертывание. Как Предотвратить Сбой От Внесенных Изменений?
Дженкинс – Как Добавить Метку В Запрос На Извлечение Через Api Github?
Сеть - Доступная Автоматизация Сети: Записывайте Команды Всех Команд Из Нескольких Игр
Jenkins - Параллельное Выполнение Одного И Того Же Задания С Разной Конфигурацией - Путь К Сценарию Jenkinsfile Конвейера Обновлен Неправильно
Непрерывная Интеграция. Как Развернуть Эквивалент Zip Или War (Созданный Локально Через Npm)?
Почему Стек Docker Требует, Чтобы Docker Работал В Режиме Роя? Каковы Последствия При Работе На Одном Узле?
Prometheus — Повторное Использование Alertmanger Slack, Интеграция В Шаблон Jiralert