Pracujemy nad aplikacją sieciową Spring Boot, a używaną przez nas bazą danych jest MySql ;
konfiguracja, którą mamy, to najpierw testujemy ją lokalnie (oznacza to, że musimy zainstalować MySql na naszym komputerze);
następnie naciskamy na Bitbucket ;
Jenkins automatycznie wykrywa nowy push do Bitbucket i wykonuje na nim kompilację (aby kompilacja Jenkins mvn przebiegła pomyślnie, musimy również zainstalować MySql na maszynach wirtualnych, na których działa Jenkins).
jeśli kompilacja Jenkins przejdzie pomyślnie, wypychamy kod do naszej aplikacji na OpenShift (używając wtyczki wdrażania Openshift na Jenkins).
Problem, który, jak zapewne już wymyśliliście, polega na tym, że:
w
application.properties
nie możemy na stałe zakodować informacji MySql. Ponieważ nasz projekt będzie działał w 3 różnych miejscach ( lokalny , Jenkins i OpenShift ), musimy dynamizować pole źródła danychapplication.properties
(wiemy, że istnieją różne sposoby, ale na razie pracujemy nad tym rozwiązaniem).spring.datasource.url = spring.datasource.username = spring.datasource.password =
Opracowane przez nas rozwiązanie polega na tym, że tworzymy systemowe zmienne środowiskowe lokalnie oraz w vm Jenkinsa (nazywając je w ten sam sposób, w jaki OpenShift je nazywa) i przypisując im odpowiednio wartości:
export OPENSHIFT_MYSQL_DB_HOST="jdbc:mysql://localhost"
export OPENSHIFT_MYSQL_DB_PORT="3306"
export OPENSHIFT_MYSQL_DB_USERNAME="root"
export OPENSHIFT_MYSQL_DB_PASSWORD="123asd"
Zrobiliśmy to i działa. Sprawdziliśmy również, czy Map<String, String> env = System.getenv();
zmienne środowiskowe można przekształcić w zmienne Java jako takie:
String password = env.get("OPENSHIFT_MYSQL_DB_PASSWORD");
String userName = env.get("OPENSHIFT_MYSQL_DB_USERNAME");
String sqlURL = env.get("OPENSHIFT_MYSQL_DB_HOST");
String sqlPort = env.get("OPENSHIFT_MYSQL_DB_PORT");
Teraz pozostaje nam tylko użyć tych zmiennych java application.properties
i właśnie z tym mamy problem.
W którym folderze i jak, musimy przypisać password
, userName
, sqlURL
oraz sqlPort
zmienne dla application.properties
aby móc je zobaczyć i jak możemy włączyć je application.properties
?
Próbowaliśmy wielu rzeczy, jedną z nich jest:
spring.datasource.url = ${sqlURL}:${sqlPort}/"nameofDB"
spring.datasource.username = ${userName}
spring.datasource.password = ${password}
Jak dotąd brak szczęścia. Prawdopodobnie nie umieszczamy tych zmiennych env we właściwej klasie / folderze lub używamy ich niepoprawnie application.properties
.
Twoja pomoc jest bardzo ceniona !!
Dzięki!
Odpowiedzi:
Nie musisz używać zmiennych java. Aby uwzględnić zmienne systemowe env, dodaj do
application.properties
pliku:Ale sposób sugerowane przez @Stefan Isele jest bardziej korzystne, ponieważ w tym przypadku trzeba zadeklarować tylko jedną zmienną env:
spring.profiles.active
. Wiosna automatycznie odczyta odpowiedni plik właściwości wedługapplication-{profile-name}.properties
szablonu.źródło
docker run --name my-tomcat -p 127.0.0.1:8080:8080 -e APP_DB_DB=mydb -e APP_DB_USER=dbuser -e APP_DB_PASS=dbpass --link mongo-myapp:mongo -v /path-to/tomcat/webapps:/usr/local/tomcat/webapps -d tomcat:8-jre8-alpine
spring.activemq.broker-url
wówczas odpowiadająca zmienna będzie:SPRING_ACTIVEMQ_BROKER_URL
. kropki i myślniki są automatycznie konwertowane na podkreślenia. Jest to niezwykle wygodne podczas pracy z pojemnikami / butami sprężynowymi.Najłatwiejszym sposobem uzyskania różnych konfiguracji dla różnych środowisk jest użycie profili sprężynowych. Zobacz konfigurację zewnętrzną .
Daje to dużą elastyczność. Używam go w swoich projektach i jest to niezwykle pomocne. W twoim przypadku masz 3 profile: „lokalny”, „jenkins” i „openshift”
Trzeba wówczas 3 znajomych pliki specyficzne własności:
application-local.properties
,application-jenkins.properties
, iapplication-openshift.properties
Tam możesz ustawić właściwości odpowiedniego środowiska. Po uruchomieniu aplikacji musisz określić profil, który chcesz aktywować w następujący sposób:
-Dspring.profiles.active=jenkins
Edytować
Według dokumentu wiosennego można ustawić systemową zmienną środowiskową,
SPRING_PROFILES_ACTIVE
aby aktywowała profile i nie trzeba jej przekazywać jako parametru.czy jest jakiś sposób na przekazanie opcji aktywnego profilu dla aplikacji internetowej w czasie wykonywania?
Nie. Wiosna określa aktywne profile jako jeden z pierwszych kroków podczas budowania kontekstu aplikacji. Aktywne profile są następnie wykorzystywane do decydowania, które pliki właściwości zostaną odczytane, a które komponenty zostaną utworzone. Po uruchomieniu aplikacji nie można tego zmienić.
źródło
application-production.properties
zostałby wdrożony na maszynie produkcyjnej w bezpieczny sposób i zwykle nie znajdowałby się w repozytorium kodu źródłowego aplikacji.Jest to odpowiedź na szereg komentarzy, ponieważ moja reputacja nie jest wystarczająco wysoka, aby komentować bezpośrednio.
Możesz określić profil w czasie wykonywania, o ile kontekst aplikacji nie został jeszcze załadowany.
źródło
Flayway nie rozpoznaje bezpośrednich zmiennych środowiskowych w pliku application.properties (Spring-Boot V2.1). na przykład
Aby rozwiązać ten problem, zrobiłem te zmienne środowiskowe, zwykle tworzę plik .env:
I wyeksportuj zmienne do mojego środowiska:
I w końcu po prostu uruchom polecenie
Lub uruchom plik jar
Istnieje inne podejście tutaj: https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/maven-plugin/examples/run-env-variables.html
źródło
Oto fragment kodu w łańcuchu właściwości środowiska, które są ładowane pliki dla różnych środowisk.
Plik właściwości w zasobach aplikacji ( src / main / resources ): -
Idealnie, application.properties zawiera wszystkie wspólne właściwości, które są dostępne dla wszystkich środowisk, a właściwości związane ze środowiskiem działają tylko w określonym środowisku. dlatego kolejność ładowania tych plików właściwości będzie następująca -
Fragment kodu tutaj: -
źródło
Być może piszę to zbyt późno, ale mam podobny problem, gdy próbowałem zastąpić metody odczytu właściwości.
Mój problem polegał na: 1) Odczytanie właściwości z env, jeśli ta właściwość została ustawiona w env 2) Odczytanie właściwości z właściwości systemowej, jeśli ta właściwość została ustawiona we właściwości systemowej 3) I na koniec, odczytanie z właściwości aplikacji.
Aby rozwiązać ten problem, przechodzę do mojej klasy konfiguracji komponentu bean
I nadpisuj fabrykę w @PropertySource. A potem stworzyłem własną implementację do odczytu właściwości.
I utworzył PropertySourceCustom
To mi pomogło.
źródło
Korzystając z kontekstu Spring 5.0 Udało mi się załadować poprawny plik właściwości w oparciu o środowisko systemowe za pomocą następującej adnotacji
Tutaj wartość MYENV jest odczytywana ze środowiska systemowego, a jeśli środowisko systemowe nie jest obecne, zostanie załadowany domyślny plik właściwości środowiska testowego, jeśli podam nieprawidłową wartość MYENV - uruchomienie aplikacji nie powiedzie się.
Uwaga: dla każdego profilu chcesz zachować - musisz utworzyć plik application- [profile] .property i chociaż użyłem Spring kontekstu 5.0 i nie Spring boot - wierzę, że to zadziała również na Spring 4.1
źródło
Napotkałem ten sam problem, co autor pytania. W naszym przypadku odpowiedzi w tym pytaniu były niewystarczające, ponieważ każdy z członków mojego zespołu miał inne środowisko lokalne i zdecydowanie potrzebowaliśmy
.gitignore
pliku, który miał inny ciąg połączenia db i poświadczenia, więc ludzie nie zatwierdzają wspólnego pliku przez pomyłkę i zrywaj połączenia db innych użytkowników.Ponadto, gdy wykonaliśmy poniższą procedurę, było łatwo wdrożyć w różnych środowiskach i jako dodatkowy bonus nie musieliśmy mieć żadnych poufnych informacji w kontroli wersji .
Zdobycie pomysłu z frameworka Symfony 3 PHP, który ma
parameters.yml
(.gitignored) iparameters.yml.dist
(który jest próbką, która tworzy pierwszą poprzezcomposer install
),Zrobiłem następujące, łącząc wiedzę z poniższych odpowiedzi: https://stackoverflow.com/a/35534970/986160 i https://stackoverflow.com/a/35535138/986160 .
Zasadniczo daje to swobodę korzystania z dziedziczenia konfiguracji sprężynowych i wyboru aktywnych profili poprzez konfigurację u góry oraz dodatkowe wrażliwe dane uwierzytelniające w następujący sposób:
application.yml.dist (próbka)
application.yml (.gitignore-d na serwerze deweloperskim)
application.yml (.gitignore-d na komputerze lokalnym)
application-dev.yml (dodatkowe właściwości specyficzne dla środowiska nie są wrażliwe)
To samo można zrobić z .properties
źródło
Jeśli pliki właściwości są eksternalizowane jako zmienne środowiskowe, do konfiguracji IDE można dodać następującą konfigurację uruchamiania:
--spring.config.additional-location={PATH_OF_EXTERNAL_PROP}
źródło