Kami sedang mengerjakan aplikasi web Spring Boot dan database yang kami gunakan adalah MySql ;
setup yang kita miliki adalah pertama kita mengujinya secara lokal (berarti kita perlu menginstal MySql pada PC kita);
lalu kita dorong ke Bitbucket ;
Jenkins secara otomatis mendeteksi dorongan baru untuk Bitbucket dan melakukan build di atasnya (untuk membangun Jenkins, kita juga perlu menginstal MySql pada mesin virtual yang menjalankan Jenkins).
jika Jenkins build pass, kami mendorong kode ke aplikasi kami di OpenShift (menggunakan plugin penempatan openshift di Jenkins).
Masalah yang kami miliki karena Anda mungkin sudah mengetahuinya adalah:
di
application.properties
kita tidak bisa hard kode info MySql. Karena proyek kami akan berjalan di 3 tempat yang berbeda ( lokal , Jenkins , dan OpenShift ), kami perlu membuat bidang sumber data dinamisapplication.properties
(kami tahu ada cara berbeda untuk melakukannya tetapi kami sedang mengerjakan solusi ini untuk saat ini).spring.datasource.url = spring.datasource.username = spring.datasource.password =
Solusi yang kami temukan adalah kami membuat variabel lingkungan sistem secara lokal dan dalam Jenkins vm (menamainya dengan cara yang sama dengan OpenShift menamainya) dan menetapkan nilai yang tepat untuk masing-masingnya:
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"
Kami telah melakukan ini dan berhasil. Kami juga telah memeriksa Map<String, String> env = System.getenv();
bahwa variabel lingkungan dapat dibuat menjadi variabel java seperti:
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");
Sekarang satu-satunya yang tersisa adalah kita perlu menggunakan variabel-variabel java di kita application.properties
dan itulah yang kita mengalami masalah dengan.
Di mana folder, dan bagaimana, kita perlu menetapkan password
, userName
, sqlURL
, dan sqlPort
variabel untuk application.properties
dapat melihat mereka dan bagaimana kita memasukkan mereka dalam application.properties
?
Kami telah mencoba banyak hal, salah satunya adalah:
spring.datasource.url = ${sqlURL}:${sqlPort}/"nameofDB"
spring.datasource.username = ${userName}
spring.datasource.password = ${password}
Tidak beruntung sejauh ini. Kami mungkin tidak meletakkan variabel env ini di kelas / folder yang benar atau menggunakannya secara salah application.properties
.
Bantuan Anda sangat dihargai !!
Terima kasih!
Jawaban:
Anda tidak perlu menggunakan variabel java. Untuk memasukkan variabel sistem env, tambahkan yang berikut ke
application.properties
file Anda :Tapi cara yang disarankan oleh @Stefan Isele lebih disukai, karena dalam hal ini Anda harus menyatakan hanya satu variabel env:
spring.profiles.active
. Spring akan membaca file properti yang sesuai secara otomatis denganapplication-{profile-name}.properties
templat.sumber
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
kemudian variabel lingkungan yang sesuai akan:SPRING_ACTIVEMQ_BROKER_URL
. titik dan garis pisah secara otomatis dikonversi ke garis bawah. Ini sangat nyaman saat bekerja dengan container / spring boot.Cara termudah untuk memiliki konfigurasi yang berbeda untuk lingkungan yang berbeda adalah dengan menggunakan profil pegas. Lihat konfigurasi eksternal .
Ini memberi Anda banyak fleksibilitas. Saya menggunakannya dalam proyek saya dan ini sangat membantu. Dalam kasus Anda, Anda akan memiliki 3 profil: 'lokal', 'jenkins', dan 'openshift'
Anda kemudian memiliki 3 profil file properti spesifik:
application-local.properties
,application-jenkins.properties
, danapplication-openshift.properties
Di sana Anda dapat mengatur properti untuk lingkungan yang bersangkutan. Ketika Anda menjalankan aplikasi, Anda harus menentukan profil yang akan diaktifkan seperti ini:
-Dspring.profiles.active=jenkins
Edit
Menurut pegas dokumen Anda dapat mengatur variabel lingkungan sistem
SPRING_PROFILES_ACTIVE
untuk mengaktifkan profil dan tidak perlu meneruskannya sebagai parameter.apakah ada cara untuk melewati opsi profil aktif untuk aplikasi web pada saat run?
Tidak. Pegas menentukan profil aktif sebagai salah satu langkah pertama, saat membangun konteks aplikasi. Profil aktif kemudian digunakan untuk memutuskan file properti mana yang dibaca dan kacang mana yang dipakai. Setelah aplikasi dimulai ini tidak dapat diubah.
sumber
application-production.properties
akan digunakan untuk mesin produksi dengan cara yang aman, dan biasanya tidak akan berada dalam repositori kode sumber aplikasi.Ini sebagai tanggapan terhadap sejumlah komentar karena reputasi saya tidak cukup tinggi untuk berkomentar secara langsung.
Anda dapat menentukan profil saat runtime selama konteks aplikasi belum dimuat.
sumber
Flayway tidak mengenali variabel lingkungan langsung ke dalam application.properties (Spring-Boot V2.1). misalnya
Untuk mengatasi masalah ini, saya melakukan variabel lingkungan ini, biasanya saya membuat file .env:
Dan ekspor variabel ke lingkungan saya:
Dan akhirnya jalankan saja perintahnya
Atau jalankan file jar Anda
Ada pendekatan lain di sini: https://docs.spring.io/spring-boot/docs/2.1.0.BUILD-SNAPSHOT/maven-plugin/examples/run-env-variables.html
sumber
Berikut ini adalah potongan kode melalui serangkaian file properti lingkungan yang sedang dimuat untuk lingkungan yang berbeda.
File properti di bawah sumber daya aplikasi Anda ( src / main / resources ): -
Idealnya, application.properties berisi semua properti umum yang dapat diakses untuk semua lingkungan dan properti terkait lingkungan hanya berfungsi pada lingkungan yang ditentukan. oleh karena itu urutan memuat file properti ini akan sedemikian rupa -
Cuplikan kode di sini: -
sumber
Mungkin saya menulis ini terlambat, tetapi saya mendapatkan masalah yang sama ketika saya mencoba menimpa metode untuk membaca properti.
Masalah saya adalah: 1) Baca properti dari env jika properti ini telah diatur dalam env 2) Baca properti dari properti sistem jika properti ini telah diselesaikan di properti sistem 3) Dan terakhir, baca dari properti aplikasi.
Jadi, untuk menyelesaikan masalah ini saya pergi ke kelas konfigurasi kacang saya
Dan menimpa pabrik di @PropertySource. Dan kemudian saya telah membuat implementasi saya sendiri untuk membaca properti.
Dan menciptakan PropertySourceCustom
Jadi, ini telah membantu saya.
sumber
Menggunakan konteks Spring 5.0 Saya telah berhasil mencapai memuat file properti yang benar berdasarkan pada lingkungan sistem melalui anotasi berikut
Di sini nilai MYENV dibaca dari lingkungan sistem dan jika lingkungan sistem tidak ada maka file properti lingkungan pengujian standar akan dimuat, jika saya memberikan nilai MYENV yang salah - itu akan gagal untuk memulai aplikasi.
Catatan: untuk setiap profil, Anda ingin mempertahankan - Anda harus membuat aplikasi - [profil] file .property dan meskipun saya menggunakan konteks Spring 5.0 & bukan boot Spring - Saya percaya ini juga akan bekerja pada Spring 4.1
sumber
Saya menghadapi masalah yang sama dengan penulis pertanyaan. Untuk kasus kami, jawaban dalam pertanyaan ini tidak cukup karena masing-masing anggota tim saya memiliki lingkungan lokal yang berbeda dan kami pasti perlu
.gitignore
file yang memiliki string koneksi db dan kredensial yang berbeda, sehingga orang tidak melakukan file umum karena kesalahan dan memutuskan koneksi db orang lain.Selain itu, ketika kami mengikuti prosedur di bawah ini, mudah untuk digunakan di lingkungan yang berbeda dan sebagai bonus tambahan kami tidak perlu memiliki informasi sensitif dalam kontrol versi sama sekali .
Mendapatkan ide dari kerangka kerja PHP Symfony 3 yang memiliki
parameters.yml
(.gitignored) dan aparameters.yml.dist
(yang merupakan sampel yang membuat yang pertama melaluicomposer install
),Saya melakukan yang berikut menggabungkan pengetahuan dari jawaban di bawah ini: https://stackoverflow.com/a/35534970/986160 dan https://stackoverflow.com/a/35535138/986160 .
Pada dasarnya ini memberikan kebebasan untuk menggunakan warisan konfigurasi pegas dan memilih profil aktif melalui konfigurasi di atas ditambah kredensial tambahan yang sensitif sebagai berikut:
application.yml.dist (contoh)
application.yml (.gitignore-d di server dev)
application.yml (.gitignore-d pada mesin lokal)
application-dev.yml (sifat khusus lingkungan tambahan tidak sensitif)
Hal yang sama dapat dilakukan dengan .properties
sumber