Secara efektif melacak perubahan ke konfigurasi dari dev ke prod

9

Pertanyaan ini menggunakan layanan Spring Boot sebagai contoh, tetapi bisa berupa teknologi apa pun.

Dengan asumsi sebagai berikut:

  • Lingkungan (dev / QA / prod) dimiliki oleh tim yang berbeda. Ini berarti dev tidak boleh memiliki akses ke konfigurasi prod.
  • Konfigurasi (katakanlah application.properties) dieksternalisasi, yaitu bukan bagian dari biner
  • Biner / paket yang sama (katakanlah service.jar) digunakan di setiap lingkungan dan dikendalikan oleh penyebaran otomatis

Sementara perubahan pada artefak biner (service.jar) secara otomatis disebarluaskan ke setiap lingkungan, perubahan pada konfigurasi masih memerlukan intervensi manual, yang akhirnya akan menjadi tidak tersinkronisasi di setiap lingkungan.

Sebagai contoh, katakanlah tim dev menambahkan beberapa pasangan nilai kunci ke application.properties di lingkungan mereka. Apa cara terbaik untuk merekam kunci-kunci baru ini, sehingga ketika penyebaran terjadi dalam tim ops mereka tahu persis kunci mana yang akan ditambahkan, sehingga risiko memulai layanan baru dan melihatnya gagal karena kunci yang hilang diminimalkan?

Saya tahu akan ada langkah-langkah manual yang terlibat, tetapi saya ingin tahu bagaimana orang berurusan dengan ini dan menemukan cara yang paling efektif.

Mathieu Fortin
sumber
Jawaban Snarky: Hancurkan silo. Buat tim lintas fungsi dari pengembang & pengembang (dan siapa pun yang Anda butuhkan untuk mengembangkan produk, UX, pemasaran, QA, dll.), Buat tim Anda bertanggung jawab untuk mengembangkan, menyebarkan, dan mendukung produk, periksa semua konfigurasi ke dalam VCS , mengotomatiskan penerapan ke semua lingkungan (ya, termasuk prod) dan melanjutkan hidup Anda.
RubberDuck
Tim lintas fungsi penuh mungkin sulit dicapai di beberapa lingkungan di mana keamanan merupakan kendala utama.
Mathieu Fortin
Saya tahu @MathieuFortin. Itu sebabnya saya berkomentar dan memulainya dengan "jawaban snarky" bukannya menjawab. Ini solusi ideal saya, tetapi tidak ada yang akan bekerja untuk Anda, sayangnya.
RubberDuck

Jawaban:

3

Ini terutama masalah komunikasi, tetapi Anda dapat membuat kesalahan lebih kecil kemungkinannya dengan beberapa langkah teknis dan organisasi sederhana. Pertama, Anda harus memberikan dokumentasi yang baik dan berkualitas tinggi dari semua entri dalam file konfigurasi Anda, serta beberapa contoh yang mudah diakses atau file konfigurasi "default". Contoh file dapat secara otomatis digunakan untuk setiap lingkungan, karena tidak dimaksudkan untuk diubah oleh tim prod langsung.

Selanjutnya, dengan setiap rilis baru, berikan changelog, tempat perubahan penting didokumentasikan. Perubahan pada konfigurasi yang dapat mencegah sistem bekerja ketika mereka hilang selalu penting, jadi pastikan informasinya ada di sana.

Sebagai contoh, katakanlah tim dev menambahkan beberapa pasangan nilai kunci ke application.properties di lingkungan mereka. Apa cara terbaik untuk merekam kunci-kunci baru ini, sehingga ketika penyebaran terjadi di tim ops mereka tahu persis kunci mana yang harus ditambahkan, sehingga risiko memulai layanan baru dan melihatnya gagal karena kunci yang hilang diminimalkan?

Cara terbaik untuk mengurangi risiko gagal adalah menghindari mengubah aplikasi Anda dengan cara yang memerlukan kunci baru, sehingga aplikasi harus kompatibel dengan file konfigurasi lama jika memungkinkan. Seringkali, aplikasi Anda dapat berperilaku dengan cara yang masuk akal dengan memberikan nilai default bawaan untuk kunci baru untuk kasus mereka hilang.

Namun, jika itu tidak mungkin, sistem Anda harus membuatnya semudah mungkin bagi tim prod untuk mencari tahu mengapa layanan baru gagal untuk memulai ketika kunci hilang. Harus ada pesan kesalahan yang jelas, mengatakan persis yang kunci hilang di mana file , dan jika perlu di mana untuk menemukan informasi tentang kunci hilang, atau petunjuk atau contoh tentang entri yang berarti untuk kunci ini.

Jika konfigurasinya kompleks, dan formatnya berubah dengan cara pengeditan manual menjadi rawan kesalahan, Anda mungkin juga mempertimbangkan untuk menyediakan alat untuk mengedit konfigurasi dan untuk migrasi ke versi yang lebih baru.

Sebagai contoh, saya menggunakan browser web Firefox, dan dengan setiap rilis baru (yang saya dapatkan secara otomatis), hal-hal tertentu ditambahkan ke konfigurasi lokal yang dapat diperiksa pada halaman "about: config". Ini sebanding dengan konfigurasi di lingkungan "produksi" Anda. Karena seluruh konfigurasi dijaga agar tetap kompatibel, saya tidak perlu menambahkan kunci baru ke konfigurasi secara manual hanya karena ada rilis baru dari browser. Dan untuk kasus saya ingin mengubah sesuatu di sana (mungkin entri baru yang bukan bagian dari versi sebelumnya), saya juga menggunakan menu Tools / Options, atau halaman "about: config", dan dapat menemukan entri plus beberapa jenis dokumentasi. Jadi saya sarankan mencoba menerapkan sistem Anda dengan cara yang sebanding.

Doc Brown
sumber
0

Di satu tempat saya pernah bekerja, mereka memiliki masalah yang sama. Konfigurasi produksi dikendalikan oleh tim pengembang, hanya mereka yang memiliki akses ke sana dalam repositori kode. Konfigurasi dev, qa, test, dll ... dapat dilihat oleh setiap orang.

Dalam contoh Anda, pengembang akan memperbarui file secara lokal, memeriksanya ke kontrol sumber, dan kemudian seseorang akan meminta tim build untuk melakukan build "config only" baru yang memeriksa file konfigurasi dan menyebarkannya, tetapi tidak mengkompilasi ulang atau gunakan kembali seluruh aplikasi.

Terserah anggota tim untuk memperbarui file konfigurasi untuk lingkungan lain pada waktu yang tepat. Ketika tiba saatnya untuk memperbarui untuk produksi, tim pengembang harus memperbarui file, melalui permintaan eksplisit dari pimpinan tim pengembang, meskipun biasanya permintaan itu hanya tampak seperti "salin file app.config dari QA1 ke PROD". Hal-hal sensitif seperti kata sandi berada dalam file konfigurasi terpisah, dan sekali lagi, hanya tim pengembang yang dapat mengakses file kata sandi Produksi. Perbedaannya adalah bahwa biasanya pengembang tidak melakukannyameminta perubahan pada file kata sandi karena mereka tidak memiliki kata sandi Produksi. Satu-satunya waktu mereka akan meminta tim pengembang untuk memperbaruinya adalah ketika menambahkan kata sandi baru untuk layanan baru. Dan meskipun demikian, para pengembang mungkin tidak akan tahu kata sandi Produksi, mereka hanya akan tahu kunci untuk menambahkan ke file (seperti "newService2.password").

Teknologi yang digunakan untuk mengelola banyak hal ini adalah Jenkins. Ada juga alat in-house yang digunakan untuk meminta dan menjadwalkan pembuatan melalui Jenkins.

FrustratedWithFormsDesigner
sumber