Bagaimana cara beralih dari realitas percabangan yang kompleks ke model cabang tunggal?

15

Dalam organisasi besar, menggunakan metodologi air terjun biasanya menghasilkan struktur percabangan yang sangat kompleks (alias spagetti cabang ).

Strategi percabangan apa yang dapat digunakan untuk transisi dari realitas percabangan yang kompleks ke model cabang tunggal seperti pengembangan berbasis batang?

Memperbarui:

Untuk memperjelas, pertanyaannya adalah tentang migrasi / transisi itu sendiri , bukan tentang metodologi sebelum dan sesudah, yang cukup jelas.

Tidak bisa benar-benar "di EOB hari ini kita masih air terjun dengan trilyun cabang, tetapi besok hal pertama yang kita akan beralih ke berbasis-cabang, CI cabang tunggal".

Dan Cornilescu
sumber
Anda bisa menjadi air terjun dan memiliki praktik percabangan yang jelas dan ditegakkan atau menjadi gesit dan memiliki cabang trilyun (gratis-untuk-semua!). Satu tidak menyiratkan yang lain.
Alexandre
@Alexandre badan pertanyaan mengklarifikasi konteks: transisi dari banyak cabang ke satu.
Dan Cornilescu
1
Anda mengubah pertanyaan sepenuhnya dari yang asli ... membuat setengah dari jawaban tidak relevan.
Evgeny
1
Hm, saya gagal melihatnya. Pembaruan ini hanya menyatakan kembali bahwa fokusnya adalah pada apa yang tetap tidak berubah di kedua judul ("migrasi dari ... ke ...") dan badan ("dalam transisi ke"): devops.stackexchange.com/posts/122 / revisi . Setengah dari jawaban itu sudah tidak relevan karena mereka melewatkan itu. Itu sebabnya saya menambahkan klarifikasi.
Dan Cornilescu
1
Hai @DanCornilescu Saya melakukan edit setelah komentar Evgeny, jadi jangan coba tunjukkan pada saya;) Pertanyaan awal Anda memiliki elemen mengenai proses pengembangan perangkat lunak, model percabangan dan praktik DevOps. Orang-orang memberikan jawaban tentang apa yang mereka pikirkan tentang pertanyaan itu. Anda kemudian mengubah pertanyaan Anda (edit # 2: devops.stackexchange.com/revisions/122/2 ) dan membuat beberapa dari jawaban itu tidak relevan.
Alexandre

Jawaban:

11

Karena Anda menyebutkan air terjun, saya mengerti bahwa banyak cabang yang Anda maksudkan adalah cabang fitur daripada cabang pemeliharaan.

Dalam pengaturan ini, saya juga berasumsi bahwa cabang-cabang ini dibuat sesuai dengan rencana air terjun yang mencoba meminimalkan konflik. Ini menyiratkan bahwa tujuan pengembangan adalah untuk menghasilkan beberapa produk berbeda. Saat menggunakan model pengembangan cabang tunggal, penting untuk juga mengerjakan satu produk. Jika beberapa produk secara bersamaan dikembangkan dalam model pengembangan cabang tunggal, itu secara efektif "menempelkan" bersama-sama versi produk tesis ini, sehingga kita mungkin memiliki dalam versi a dari repositori produk sehat X dan produk kereta Y , sedangkan dalam versi b produk X memiliki regresi dan perbaikan bug Y , tetapi kami tidak memiliki versi di mana X danY sehat. Situasi seperti itu akan memaksa kita untuk menganggap X dan Y sebagai dikembangkan dalam repositori yang berbeda, yang merupakan petunjuk bahwa mereka seharusnya.

Oleh karena itu, langkah pertama harus melakukan pemisahan repositori :

  1. Aturlah repositori sehingga mudah untuk membaginya menjadi beberapa repositori kecil. Misalnya, mengatur ulang repositori saat ini sehingga setiap direktori tingkat atas sesuai dengan repositori yang ingin Anda buat di masa depan. Dengan melakukannya, Anda dapat terus menggunakan disiplin cabang-spageti yang dikenal semua orang.

  2. Ketika langkah 1 selesai, perbaiki disiplin cabang-spageti dengan mewajibkan cabang tunggal mana pun hanya dapat menyentuh file dalam satu direktori tingkat atas.

  3. Saat setiap cabang mematuhi langkah 2, lakukan pemisahan. Pengembang dapat dengan mudah mengonversi perubahan yang tertunda untuk menambal repositori tunggal, hanya dengan menghapus tingkat pertama dari lintasan.

Sekarang perpecahan telah dilakukan, Anda dapat mulai bekerja pada disiplin cabang itu sendiri.

  1. Perkenalkan teknik pemrograman yang membantu pengembangan cabang yang berumur pendek. Cabang yang berumur pendek adalah aspek penting dari semua metodologi cabang tunggal. Salah satu tujuan mereka adalah untuk mengurangi waktu yang dihabiskan untuk menggabungkan dan men-debug cabang yang berumur panjang. Teknik populer adalah pengenalan "fitur-flags" di mana "pabrik" menggunakan flag konfigurasi untuk menghasilkan versi historis dari suatu objek atau versi yang baru, yang pada awalnya sebagian dikembangkan, dari objek itu.

  2. Pada saat ini, Anda memiliki banyak repositori dengan hanya beberapa cabang di masing-masing, dan Anda dapat memutar tombol “kita secara global mengadopsi disiplin pengembangan berbasis-batang”, tanpa melihat gunung cabang-spageti yang asli runtuh di bagasi.

Perpecahan sebenarnya dari repositori mungkin opsional, tetapi Anda kemudian harus mengadopsi kebijakan yang dengan jelas menggambarkan ruang lingkup yang diperbolehkan dari setiap tambalan yang dikirimkan (untuk membatasi risiko konflik ketika menggabungkan perubahan di cabang utama). Mengurangi overhead yang terikat pada konflik adalah salah satu tujuan dari metodologi model cabang tunggal, jadi saya menganggap ini relevan dalam konteks Anda.

Michael Le Barbier Grünewald
sumber
benar: cabang-cabang itu adalah fitur dan (berbagai tingkatan) cabang integrasi.
Dan Cornilescu
1
sekitar 1: bahkan setelah pemisahan, mungkin perlu disebutkan Anda masih bisa mendapatkan tampilan seperti spaghetti dengan menggunakan repo
ᴳᵁᴵᴰᴼ
Tetapi Google dan FB menggunakan monorepos dengan berbasis-trunk ...
AnoE
6

Saat bermigrasi dari sesuatu ke sesuatu yang lain, hanya ada dua hal yang perlu Anda tentukan:

  1. Apa target anda
  2. Cara menuju ke sana (rencana migrasi)

Bagian pertama adalah, sayangnya, sering diabaikan atau cara terlalu samar. Anda tidak bisa hanya mengatakan bahwa apa yang Anda miliki berantakan dan Anda ingin mengaturnya. Apa artinya itu? Semua orang akan memiliki interpretasi yang berbeda (aka: setiap dev berpikir bahwa nya atau nya cara melakukan sesuatu adalah yang terbaik).

Kemungkinannya adalah, semua cabang yang Anda miliki melayani atau telah melayani suatu tujuan. Tanpa proses target yang jelas, orang akan terus melakukan apa yang sesuai untuk mereka yang paling cocok untuk mereka (dan memang demikian).

Misalnya, target Anda harus didefinisikan sejelas Vincent Driessen mendefinisikan "model percabangan Git yang sukses" . Jika Anda melihat model ini, itu sangat tepat: Dikatakan di mana kode stabil seharusnya, dan di mana fitur tidak stabil harus dikembangkan. Ia juga mengatakan bagaimana - dan kapan - untuk bercabang, memperbarui dan menggabungkan kembali. Anda tahu untuk apa masing-masing cabang, dan apa yang harus dilakukan dengan mereka. Kami menggunakan variasi dari apa yang dikemukakan oleh Vincent dan variasi kami didefinisikan dalam wiki kami.

Poin penting adalah membuat semua tim memahami dan menyepakati target. Mungkin bermanfaat untuk mengingatkan orang-orang bahwa Anda tidak mencari model percabangan favorit pribadi mereka, tetapi sebuah model yang dapat disetujui dan digunakan semua anggota tim dengan mudah.

Setelah Anda memiliki target, Anda akan dapat menjabarkan rencana migrasi Anda. Rencana itu bisa sepanjang atau sesingkat yang Anda inginkan. Saya telah melihat model percabangan seperti itu diberlakukan dalam semalam; di tempat lain, itu dilakukan lebih dari 2 atau 3 sprint. Bagi saya tidak masalah, asalkan kita membaik.

Anda bisa mulai dengan cabang "terbesar" atau lebih penting. Misalnya: "mulai sekarang, master harus selalu dalam kondisi untuk ditempatkan di prod dan cabang dev harus selalu dikompilasi" (atau apa pun aturan Anda). Kemudian, tegakkan versi (rilis) cabang. Setelah itu, tegakkan cabang fitur. Setelah itu, memaksakan pembekuan kode pada cabang versi, jika itu masuk akal.

DevOps adalah tentang komunikasi, keterbukaan dan efisiensi. Konsep-konsep ini harus diingat dan dikomunikasikan selama proses berlangsung.

Saya menyarankan untuk mengundang beberapa orang di luar tim pengembangan ke pertemuan proses sebagai pengamat. Ops atau manajemen menengah mungkin memiliki satu atau dua hal untuk dikatakan tentang model Anda. Kebutuhan pengembang harus diprioritaskan, tetapi jika model percabangan tidak mungkin disejajarkan dengan cara pengelolaannya, Anda akan lebih tahu sekarang dan tidak dalam satu atau dua bulan.

Jika Anda memiliki tim yang sangat besar, cobalah untuk menyertakan semua orang. Dengan tim yang sangat besar, Anda akan berakhir dengan dua atau tiga pertemuan. Jadi undanglah pemimpin tim di ruangan itu, tetapi miliki webcast yang tersedia dan beri tahu semua orang tentang hal itu. Jika ada yang punya saran atau masalah, mereka akan dapat menyuarakannya kepada pemimpin tim mereka dan jika itu valid, itu akan dibahas pada pertemuan kedua atau ketiga.

Alexandre
sumber
3

Sebenarnya sangat sederhana untuk mengubah repositori hydra multi-cabang menjadi model bercabang tunggal.

Pertama, Anda ingin memulai dengan cabang yang memiliki sedikit perbedaan antara dirinya dan master atau trunk. Periksa umur dan relevansinya. Jika masih relevan, mulailah menggabungkannya dan menyelesaikan konflik. Jika tidak lagi relevan, maka hapus.

Lanjutkan proses ini sampai Anda berhasil menggabungkan semua cabang Anda, menyelesaikan semua konflik, dan Anda hanya memiliki satu cabang yang tersisa.

Anda dapat mengikuti garis besar sederhana ini untuk memulai:

  1. Buat salinan cabang master / trunk Anda dan sebut saja temp_master
  2. Temukan cabang dengan divergensi terbesar dari master / trunk.
  3. Tentukan apakah cabang perlu disimpan, diarsipkan, atau dihapus.
    1. Jika perlu dijaga, lanjutkan ke langkah 4.
    2. Jika perlu dihapus atau diarsipkan, hapus dan arsipkan, lalu kembali ke langkah 2.
  4. Ulangi langkah 2 untuk menemukan cabang berikutnya dengan perbedaan paling kecil.
  5. Gabungkan dua cabang yang ditemukan di langkah 2 dan langkah 3, selesaikan semua konflik.
  6. Gabungkan kedua cabang Anda ini ke temp_mastercabang Anda .
  7. Uji kode dalam kode temp_master untuk melihat apakah itu mengkompilasi, dan membangun, dan menjalankan tes otomatis lain yang Anda miliki untuk kewarasan.
    1. Jika ada tes yang gagal, kembalilah, cari tahu mengapa, dan perbaiki, dan ulangi prosesnya.
    2. Jika tes masih gagal, pilih dua cabang yang berbeda untuk dikerjakan.
  8. Ulangi langkah 2 - 7 hingga Anda hanya memiliki dua cabang, master / trunk Anda dan temp_master.
  9. Akhirnya, bergabung temp_mastermenjadi master / trunk dan hidup dengan model cabang tunggal baru Anda.
avi
sumber
-4

Untuk organisasi besar dengan siklus sprint 4 minggu, Git-Flow adalah pendekatan yang lebih disukai karena Anda mendapatkan manfaat dari cabang fitur. Cabang siap produksi master selalu dapat digunakan. Juga, cabang master tetap bersih dari komitmen yang tidak diinginkan dengan mengikuti dua siklus komit (dari fitur ke Developdan Developcabang untuk menguasai).

Selain itu, percabangan juga ditentukan oleh frekuensi rilis produksi. Untuk penyebaran yang sering ke produksi, lebih baik memiliki cabang Fitur atau model Terpusat. Dalam hal ini overhead pengelolaan cabang dialihkan ke pengujian yang kuat di lingkungan yang lebih rendah untuk menjaga stabilitas produksi.

Shrek
sumber
Bisakah Anda meningkatkan jawaban ini agar lebih mudah dipahami?
Evgeny
Pertanyaannya secara spesifik menyatakan tentang migrasi / transisi itu sendiri, bukan tentang metodologi sebelum dan sesudahnya . Anda tampaknya berbicara yang terakhir di sini.
Toby Speight
@TobySpeight Pertanyaan telah diubah dari aslinya oleh pengeditan, itulah sebabnya jawaban ini dulunya relevan tetapi tidak lagi.
Evgeny