Apa yang dapat Anda lakukan untuk mengurangi jumlah bug penyebaran situs web langsung?

11

Saya yakin banyak dari Anda telah mengalami masalah ini. Situs web atau aplikasi web sedang berjalan dan aktif. Anda ingin mengunggah versi berikutnya, tetapi Anda belum menemukan semuanya, seperti menetapkan nilai ke false dalam file konfigurasi, memasukkan catatan lain ke dalam basis data, dan melakukan banyak hal kecil yang terkadang dapat menghitung hingga 20 atau lebih parameter.

Segera setelah Anda mengunggah versi baru, semuanya rusak. Sekarang, memperbaiki masalah mungkin hanya memakan waktu hingga 20 menit, tetapi tekanan keseluruhan yang Anda toleransi, dan kerusakan finansial dan niat baik terhadap perusahaan terkadang tidak dapat dilupakan.

Apa cara untuk mengurangi jenis bug ini yang muncul dari konfigurasi awal penyebaran versi baru?

PS: Tolong jangan menyebutkan daftar periksa, karena kami sudah memilikinya. Masalah dengan check-list adalah, mereka harus selalu diperbarui, tetapi tidak.

Saeed Neamati
sumber
6
Anda tidak boleh merusak situs web Anda saat memperbaruinya. Jika Anda ... maka prosedur Anda salah.
Ramhound
10
"Masalah dengan check-list adalah bahwa, mereka harus selalu diperbarui, tetapi mereka tidak akan" Dalam hal itu, Anda akan dikutuk. Kami dapat memberi tahu Anda hal-hal baik yang harus dilakukan, dan - seperti daftar periksa - tidak akan selesai. Jika Anda tidak dapat terus memperbarui daftar periksa, Anda harus mempertimbangkan mencari jenis pekerjaan lain jika kesalahan dan kecerobohan ditoleransi dengan lebih baik. Mungkin layanan pemerintah.
S.Lott
5
Jika Anda belum menemukan semuanya, Anda seharusnya tidak menggunakan.
HLGEM
Jika penyebaran gagal, Anda harus mengembalikannya.
Tulains Córdova

Jawaban:

28

Dua hal:

  • Lingkungan pementasan, mirip dengan lingkungan langsung tempat Anda melakukan uji coba penyebaran.
  • Cukup pengujian lingkungan ini setelah penerapan. Otomatis dan tidak otomatis.

Ada hal lain yang bisa dilakukan.

Saya sarankan membaca seri blog 5 bagian tentang penyebaran otomatis oleh Troy Hunt. Tooling yang ia gunakan adalah MS stack spesifik, tetapi konsepnya universal.

Oded
sumber
Anda berarti bahwa semua situs web di seluruh dunia memiliki lingkungan pementasan .
Saeed Neamati
15
Tidak semuanya. Itulah sebabnya mereka memiliki masalah dengan penempatan. Setiap situs dengan ukuran signifikan yang telah saya kerjakan memang memilikinya.
Oded
@Saeed Neamati - Tentu saja bukan ini alasan yang tepat sehingga banyak situs web tidak benar-benar berfungsi sebagaimana mestinya (yaitu situs pembayaran beban eksternal serikat kredit saya) ketika itu terjadi, pelanggan Anda dengan di lapangan hanya menertawakan Anda. Dalam kasus saya, saya punya pilihan selain menggunakan situs web serikat kredit saya.
Ramhound
6
@eed: Aku tidak bisa berbicara untuk dunia tetapi semua milikku pasti bisa.
Wyatt Barnett
1
@eedeed semua yang baik lakukan.
HLGEM
13

Saya heran, mengapa tidak ada yang menyebutkan Kontrol versi - yang merupakan salah satu cara paling penting untuk menyelamatkan Anda dari masalah saat memperbarui / meningkatkan.

Pertama, penyebaran Anda seharusnya hanya klon dari cabang stabil di repositori Anda. Semuanya termasuk file konfigurasi, file SQL, skrip instal / perbarui HARUS dikontrol versi.

Kedua, Anda perlu memiliki "semacam" area pementasan - bisa berupa apa saja - server lokal, server cloud virtual sementara yang baru saja Anda hasilkan, pengaturan host virtual yang sangat sederhana, atau, aplikasi kustom lengkap yang Anda mempertahankan bersama dengan aplikasi utama. Perbedaan antara "area pementasan" ini dan "area pengembangan" Anda adalah bahwa yang terdahulu lebih dekat memodelkan (atau mensimulasikan) lingkungan penyebaran Anda yang sebenarnya. Misalnya, Anda dapat mengembangkan pada PHP 5.3.x dengan modul Apache, tetapi karena host Anda adalah PHP 5.2.x dengan FCGI, area pementasan Anda harus sama.

Kemudian, Anda terlebih dahulu menulis dan menguji pembaruan Anda di lingkungan pengembangan Anda. Gabungkan perubahan-perubahan itu ke repositori area pementasan, dan uji lagi. Pada titik ini Anda dapat membuat perubahan pada konfigurasi Anda agar sesuai dengan penyebaran Anda - karena ini dikontrol versi, tidak ada yang akan hilang, dan Anda selalu dapat kembali jika terjadi masalah.

Akhirnya gabungkan perubahan area pementasan pada salinan penyebaran langsung Anda.

Kompleksitas area pementasan Anda harus mencerminkan kompleksitas dan ruang lingkup aplikasi Anda. Tetapi bagaimanapun juga, kontrol Versi sangat diperlukan.

Tentu saja jika Anda tidak menggunakan kontrol Versi - semua ini tidak berlaku - tetapi sama naifnya dengan menulis database di Logo.

treecoder
sumber
3
+1 tetapi saya tidak menyebutkannya karena saya hanya mengasumsikan kontrol versi dipahami ...
maple_shaft
3
Ya, luar biasa berapa banyak orang yang hanya mengendalikan kode yang mereka pedulikan dan bukan hal-hal seperti konfigurasi, SQl, dll.
HLGEM
1
@HLGEM, Anda benar sedih, saya mengontrol sumber segalanya, saya bahkan memiliki server subversi berjalan di rumah untuk dokumen NON DEVELOPMENT yang saya miliki di rumah seperti resume saya dan resep memasak. :)
maple_shaft
2
@maple_shaft, Ohhhh, saya tidak pernah berpikir untuk mengontrol versi resume saya, ide yang bagus.
HLGEM
3
Tentu saja ide yang bagus - suatu hari Anda akan melihat log dan melihat apa yang Anda pelajari dan bagaimana Anda menjadi lebih dan lebih berpengalaman seiring berjalannya waktu. Dan, jika Anda melakukan satu atau dua bulan sekali, log Anda setelah 25 tahun akan sangat menarik.
treecoder
6

Seperti yang disarankan, gunakan sistem pementasan . Ini memberi Anda kesempatan untuk menguji perubahan Anda di lingkungan hidup.

Ini memunculkan poin lain: memiliki penguji . Menguji hal-hal yang saya tulis sendiri tidak menemukan bug sebanyak ketika orang lain menguji aplikasi saya.

Hal lain: mengotomatiskan proses penyebaran Anda . Lakukan migrasi db dengan migrasi semut, gunakan versi terbaru secara otomatis dari svn melalui capistrano dll. Ketika Anda menggunakan sesuatu, Anda tidak perlu melakukan lebih dari cukup klik dan semuanya otomatis. Khusus untuk situs web yang memerlukan beberapa pengaturan konfigurasi, langkah-langkah manual yang diperlukan untuk penyebaran adalah mimpi buruk dan kemungkinan ada yang tidak beres.

Maks
sumber
6

Untuk sesuatu yang benar-benar, pasti tidak boleh berhenti mempertimbangkan memiliki sistem A dan B dan menggunakan penyeimbang beban untuk merutekan semua permintaan ke A saat Anda meningkatkan dan menguji B, dan kemudian merutekan semuanya ke B saat Anda memperbarui A.

Untuk poin bonus, tambahkan C dan pastikan sistem Anda secara geografis terpisah sehingga gempa tidak akan mengambil 2 dari mereka secara bersamaan.

Untuk banyak aplikasi, saya akui bahwa ini berlebihan.

Ini juga mempersulit manajemen transaksi yang perlu Anda lakukan, tetapi masalahnya tidak dapat diatasi.

Bill Michell
sumber
1
Ini adalah jawaban yang benar
2
Terima kasih. Tetapi versi, sistem pementasan dan penyebaran satu sentuhan juga penting.
Bill Michell
5

Ya, Anda memerlukan lingkungan pengujian atau pementasan di mana Anda melewati semua langkah, tetapi menyimpan file konfigurasi terpisah untuk lingkungan yang terpisah adalah suatu keharusan.

Environments
|_property_files
    |_ dev
        |_ com.bla.util
        |    |_ example.properties
        |_ com.bla.beans
        |    |_ someconfig.xml
    |_ test
        ....
    |_ production
        ....
|_database_updates
    |_ dev
        |_ insert_new_static_data.sql
        |_ ...

...

Pada dasarnya dalam skrip build dan deployment, saya mengambil properti environment yang akan mengambil file meta data khusus lingkungan seperti file XML dan menggantinya di lokasi build saya sebelum pengemasan. Selanjutnya dalam skrip deployment saya, saya akan mencari file SQL di pembaruan database dan mengeksekusi mereka pada database yang dikonfigurasi untuk lingkungan itu juga.

Saya bisa melakukan ini dengan tugas membangun kustom, tapi saya sebenarnya hanya menggunakan beberapa tes JUnit untuk melakukan ini untuk saya. Jika ada pengecualian SQL terjadi maka tes gagal dan penyebaran gagal. Secara umum skrip SQL juga memiliki kecerdasan, jika data yang diperlukan sudah ada di lingkungan maka mereka melewatkan memasukkan atau memperbarui.

Saya juga memiliki direktori serupa untuk skrip batch atau shell yang harus saya jalankan untuk lingkungan tertentu.

Katakan semua dalam pertanyaan Anda adalah ini: mereka harus selalu diperbarui, tetapi mereka tidak akan.

Konfigurasi ini mendorong bangunan dan penyebaran otomatis Anda jadi jika Anda TIDAK memperbaruinya maka bangunan Anda gagal dan manajer Anda diemail tentang hal itu. Sama pentingnya bagi tim untuk mempertahankan konfigurasi build dan deployment untuk rilis spesifik seperti halnya bagi mereka untuk memeriksa kode yang mengkompilasi. Entah pelanggaran merusak bangunan.

Singkatnya, adopsi yang lebih besar dari prinsip integrasi berkelanjutan (CI) akan membantu menghilangkan kepedihan rilis produksi.

maple_shaft
sumber
4

1) Sebarkan terlebih dahulu ke situs uji dan uji perubahan Anda

2) Memiliki semua konfigurasi dalam file konfigurasi (konfigurasi web atau yang serupa). Konfigurasi ini kemudian harus spesifik untuk aplikasi dan tidak pernah ditimpa. Setiap perubahan kemudian delibrate daripada lupa untuk mengubah sesuatu yang harus berbeda dari tes.

Tom Squires
sumber
Dan pastikan ada orang yang mengulas kode konfigurasi untuk setiap lingkungan yang berbeda.
HLGEM
4

Selain saran bagus di atas untuk memiliki lingkungan pra-produksi dan menggunakan pengujian otomatis:

Mengurangi kompleksitas basis kode. Lebih sedikit kode, umumnya, berarti lebih sedikit bug dan lebih mudah untuk menemukannya. Inilah filosofi di balik refactoring, pemisahan kekhawatiran, dan sebagainya.

Segmen basis kode . Satu pendekatan umum adalah untuk memisahkannya menjadi:

  • beberapa bagian inti yang berubah perlahan dan dibagikan di seluruh situs
  • banyak bagian daun yang dapat berubah lebih cepat tetapi masing-masing hanya berdampak pada bagian yang lebih kecil dari situs

Pemahaman tentang basis kode ini memungkinkan Anda untuk memfokuskan pengembangan dan pengujian pada bagian inti, karena bug akan memiliki efek paling drastis.

Alex Feinman
sumber
3

Rilis yang dieksekusi dengan baik adalah semua tentang perencanaan dan komunikasi. Jadi sebelum melakukan rilis pertimbangkan pertanyaan-pertanyaan ini:

  1. Berapa lama rilis mungkin berlangsung, dan apakah ada risiko membiarkan orang terus berinteraksi dengan produk saya saat rilis sedang berlangsung? Jika ada risiko pada sistem, pertimbangkan untuk menjadikan sistem offline dan memasang pesan "Sistem sedang dalam pemeliharaan" sebagai gantinya.

  2. Apakah ada pelanggan yang perlu Anda beri tahu tentang rilis sebelumnya? Apakah saya perlu memberi tahu mereka tentang kemungkinan gangguan layanan, atau penurunan kinerja saat rilis sedang berlangsung? Secara pribadi saya selalu melakukan kesalahan dalam berkomunikasi berlebihan dan memberi tahu semua pelanggan tentang rilis yang akan datang atau jendela pemeliharaan di blog umum atau tempat serupa.

  3. Apa rencana darurat saya jika rilis salah? Misalnya, jika rilisnya berjalan buruk, haruskah kita memutar kembali dan mengembalikan sistem ke cara semula untuk meminimalkan kapan saja kita sedang offline? Dan jika demikian, apakah langkah-langkah untuk meluncurkan kembali sebuah rilis didokumentasikan dengan baik? Atau haruskah saya memiliki orang yang tepat di telepon atau di tangan untuk membantu mengatasi masalah jika terjadi. Secara pribadi, saya pikir cara terbaik untuk mendekati perencanaan rilis adalah dengan mengasumsikan ada sesuatu yang salah dengan rilis. Dengan begitu saya memaksa diri saya untuk memikirkan beberapa masalah ini sebelumnya.

Selanjutnya, ketika datang untuk melaksanakan rilis, salah satu cara terbaik untuk memastikan bahwa itu akan berjalan dengan lancar adalah dengan berlatih, berlatih, berlatih, dan mendokumentasikan semua yang Anda temui di sepanjang jalan. Jadi, jauh sebelum menerapkan kode baru untuk produksi, praktikkan penerapan kode ke lingkungan pementasan yang aman dan berpasir terlebih dahulu. Minta orang yang akan bertanggung jawab untuk menggelar produksi, melakukan uji coba penerapan hingga pementasan. Pertimbangkan ini gladi resik pakaian Anda dan lakukan seperti yang Anda lakukan jika ini adalah hal yang nyata. Dokumentasikan semua yang Anda lakukan di setiap langkah; mendokumentasikan setiap perintah yang Anda jalankan, kode SQL apa pun yang Anda jalankan, semua file yang Anda modifikasi, dan bagaimana Anda memodifikasinya dan untuk setiap langkah sepanjang jalan, dokumentasikan apa yang Anda harapkan untuk melihat apakah prosedur tersebut dijalankan dengan benar. Jika dan ketika Anda menemukan masalah, dokumentasikan apa yang Anda lakukan untuk menyelesaikannya.

Kemudian penyebaran latihan selesai, lihat catatan Anda dan lihat apakah Anda dapat memperbaiki proses untuk menghilangkan kesalahan. Kemudian lakukan semuanya lagi . Terus berlatih sampai mengeksekusi rilis menjadi rutin seperti mengikuti lembar instruksi sederhana, seperti "masuk ke mesin ini, jalankan perintah ini; kemudian login ke database dan jalankan perintah SQL ini; lalu ..."

Tercantum di atas adalah hal-hal yang dapat dilakukan oleh operasi atau tim manajemen rilis untuk membantu rilis berjalan dengan lancar. Tapi apa yang bisa dilakukan rekayasa untuk membantu meminimalkan risiko dalam rilis?

  1. Simpan rilis kecil. Sederhananya, semakin kompleks serangkaian perubahan kode yang terkandung oleh rilis, semakin berisiko rilis akan menjadi. Bantulah tim operasi Anda dengan merencanakan untuk memiliki jumlah rilis kecil yang lebih besar, daripada jumlah yang lebih kecil dari rilis besar selama periode waktu yang sama.

  2. Tes tes tes. Jangan hanya menguji kode Anda di lingkungan QA Anda, gunakan lingkungan pementasan untuk menguji perangkat lunak Anda juga. Seringkali ada bug yang memiliki sedikit atau tidak ada hubungannya dengan kode itu sendiri, tetapi lebih tepatnya memiliki akar penyebab yang terletak pada konfigurasi lingkungan itu sendiri (atau campuran keduanya). Untuk menemukan masalah ini, Anda perlu menguji kode Anda di lingkungan yang mirip dengan produksi, alias pementasan.

Sebagai kata terakhir, kadang-kadang yang paling penting bukanlah apa yang kita lakukan untuk mencegah hal-hal yang tidak beres, tetapi itu adalah bagaimana kita memperlakukan diri kita sendiri ketika mereka melakukan kesalahan. Karena itu, saya pikir penting untuk membangun budaya di perusahaan Anda seputar transparansi operasional. Jangan mencoba untuk menyembunyikan masalah dari pelanggan, terbuka. Gunakan Twitter secara aktif untuk memberi tahu pelanggan jika ada masalah yang saat ini diketahui dan sedang diselesaikan oleh tim Anda ( Lighthouse sangat hebat dalam hal ini!). Pertimbangkan untuk menerbitkan halaman "status" untuk layanan Anda yang dapat dirujuk oleh pelanggan untuk melihat apakah ada yang salah ( TypePad menawarkan contoh yang bagus untuk ini). Intinya, selalu berbuat salah di sisi komunikasi berlebihan. Pelanggan Anda akan berterima kasih untuk itu.

Byrne Reese
sumber
1

Banyak jawaban di sini sudah memberi tahu Anda bagaimana menerapkan solusi spesifik Anda untuk masalah, tetapi, sejauh yang saya tahu, masalah sebenarnya bukan salah satu dari migrasi / memperbarui situs web dengan benar. Bisa jadi desain / arsitektur di belakangnya rapuh.

Jika itu benar, Anda harus menyesuaikan arsitektur untuk sistem Anda sedemikian rupa sehingga cukup kuat untuk terus berfungsi dengan baik bahkan jika pengaturan konfigurasi berubah atau tidak diatur dengan benar, dan sedemikian rupa sehingga rusak dengan anggun jika terjadi. Idealnya, jika Anda telah menambahkan fungsionalitas baru atau mengubah fungsionalitas lama dengan cara yang memerlukan kolom basis data baru, situs Anda akan berfungsi bahkan jika kolom tersebut hilang (mungkin tanpa fungsionalitas baru, atau dengan bentuk terdegradasi dari fungsionalitas lama) . Klien Anda seharusnya tidak kehilangan uang - paling buruk, ia mungkin tidak mendapatkan uang baru dari perbaikan yang Anda lakukan.

Jika sistem Anda cukup rapuh sehingga pengaturan konfigurasi dapat menyebabkan masalah serius seperti itu, pembaruan program tidak akan menjadi satu-satunya sumber masalah - dan mencari tahu bagaimana melakukan pembaruan dengan aman hanya akan meningkatkan kerusakan yang akan Anda alami ketika kegagalan berasal dari sumber yang berbeda.

blueberryfields
sumber