Praktik terbaik dengan kode sumber bercabang dan siklus hidup aplikasi

10

Kami adalah toko ISV kecil dan kami biasanya mengirimkan versi baru produk kami setiap bulan. Kami menggunakan Subversion sebagai repositori kode kami dan Visual Studio 2010 sebagai IDE kami. Saya sadar banyak orang menganjurkan Mercurial dan sistem kontrol sumber terdistribusi lainnya, tetapi pada titik ini saya tidak melihat bagaimana kita bisa mendapat manfaat dari ini, tetapi saya mungkin salah.

Masalah utama kami adalah bagaimana menjaga agar cabang dan trunk utama tetap sinkron.

Inilah cara kami melakukan sesuatu hari ini:

  1. Lepaskan versi baru (secara otomatis membuat tag di Subversion)
  2. Terus bekerja di bagasi utama yang akan dirilis bulan depan

Dan siklus berulang setiap bulan dan bekerja dengan sempurna. Masalah muncul ketika rilis layanan yang mendesak perlu dirilis. Kami tidak dapat melepaskannya dari batang utama (2) karena sedang dalam pengembangan berat dan tidak cukup stabil untuk dilepaskan segera.

Dalam hal ini kami melakukan hal berikut:

  1. Buat cabang dari tag yang kami buat pada langkah (1)
  2. Perbaikan bug
  3. Uji dan lepaskan
  4. Dorong perubahan kembali ke bagasi utama (jika ada)

Masalah terbesar kami adalah menggabungkan keduanya (cabang dengan main). Dalam sebagian besar kasus, kami tidak dapat mengandalkan penggabungan otomatis karena misalnya:

  • banyak perubahan telah dilakukan pada trunk utama
  • menggabungkan file kompleks (seperti file Visual Studio XML dll.) tidak berfungsi dengan baik
  • pengembang / tim lain membuat perubahan yang tidak Anda pahami dan Anda tidak bisa hanya menggabungkannya

Jadi apa yang Anda pikirkan adalah praktik terbaik untuk menyinkronkan kedua versi yang berbeda ini (cabang dan utama). Apa yang kamu kerjakan?

Toni Frankola
sumber
1
Pastikan Anda memeriksa tfsbranchingguideiii.codeplex.com (tidak memposting sebagai jawaban karena tidak langsung menjawab pertanyaan Anda, tetapi saya selalu merekomendasikannya kepada orang yang ingin meningkatkan cabang-fu TFS mereka). Mungkin salah satu dari rencana cabang mereka akan memberi Anda ide tentang bagaimana meningkatkan pengaturan Anda.
nlawalker

Jawaban:

2

Saya pikir pendekatan Anda untuk percabangan dan penggabungan adalah OK, tetapi jika masalah utama adalah bahwa basis kode sangat tidak stabil, itulah yang Anda butuhkan untuk fokus dan meminimalkan.

Hal utama yang harus dipastikan adalah bahwa basis kode memiliki pemisahan keprihatinan yang baik . Ketergantungan antara berbagai komponen perlu diisolasi dan dikurangi. Ini harus menyelesaikan sebagian besar masalah Anda. Juga mengikuti praktik-praktik seperti prinsip tanggung jawab tunggal akan membantu.

Jika perubahan arsitektur besar perlu terjadi, itu harus terjadi di cabang sendiri, dan kemudian bergabung kembali ke utama setelah sepenuhnya diuji dan 'stabil' (sesuai alasan). Ini mungkin menyakitkan dan menantang tetapi juga harus jarang. Jika Anda memiliki praktik pengujian yang baik maka risiko diminimalkan.

Mungkin juga membantu mengubah ke sistem kontrol versi terdistribusi. Ini akan memberi Anda bagasi yang stabil, dengan berbagai fitur digabungkan dari cabang yang berbeda saat siap. Anda masih akan mengalami kesulitan menggabungkan jika kode terlalu saling tergantung, tetapi Anda akan memiliki kontrol lebih.

Melihat ini dari perspektif lain, pertimbangkan juga peningkatan komunikasi di antara tim Anda. Jalankan pertemuan rutin gaya tangkas teratur. Pertimbangkan di mana anggota tim duduk dan bagaimana hal itu dapat membantu. Jika penggabungan yang kompleks perlu dilakukan, itu mungkin bukan hal yang buruk - gunakan pendekatan pemrograman berpasangan yang akan memberikan pemahaman kepada kedua belah pihak.

Alex Angas
sumber
2

Saya cenderung melihatnya dari arah sebaliknya:

  • Batang harus selalu menjadi kode siap produksi (setelah rilis awal pertama Anda, yaitu).
  • Seharusnya ada cabang tipe pengembangan yang berjalan paralel ke trunk, tempat pengembangan bulanan Anda terjadi. Setiap bulan ketika datang untuk merilis waktu, ini akan digabung menjadi bagasi, diuji, dan kemudian dirilis.
  • Perbaikan terbaru kemudian dapat dengan mudah dilakukan di bagasi Anda dan diperiksa, dan selalu berhasil digunakan. Kemudian buat tambalan dari perbaikan terbaru, dan terapkan ke cabang pengembangan Anda.

Tentu saja, alur kerja ini jauh lebih cocok untuk sesuatu yang bukan SVN, karena percabangan dan penggabungan yang baik adalah sesuatu yang cukup menyakitkan di SVN, terlepas dari alur kerja Anda. Dalam pengalaman saya, menggabungkan di SVN hampir selalu harus dilakukan secara manual, karena itu tidak berfungsi, dan tidak ada jalan nyata di sekitarnya.

sevenseacat
sumber
1

Akhir-akhir ini, saya menganjurkan filosofi "cabang dan penggabungan" sebagai hasil terakhir. Saya pikir itu adalah kebenaran yang disayangkan bahwa berurusan dengan penggabungan kode dari cabang bukanlah masalah teknis, tetapi itu adalah tugas yang sulit secara kognitif: Saya pikir itu hanya karena otak manusia tidak melacak detail yang cukup untuk membuatnya mudah. Selain itu, saya belum melihat percabangan dan penggabungan benar-benar bekerja dalam praktik. Setelah kode bercabang, pengalaman memberi tahu saya bahwa itu bukan masalah untuk menggabungkannya lagi.

smithco
sumber
2
VCS apa yang sudah Anda coba? Kemudahan penggabungan sangat tergantung pada VCS yang digunakan.
alternatif
Banyak VCS baru yang benar-benar menangani penggabungan dengan sangat baik. Kadang-kadang konflik masih akan terjadi, tetapi mereka cenderung konflik yang sebenarnya, bukan yang palsu dilaporkan banyak waktu oleh SVN.
sevenseacat
Saya sudah mencoba beberapa sistem SCM. Sebagian besar alat penggabungan dapat membanting bersama dua bagian teks dengan jumlah keberhasilan yang bervariasi. Namun, tidak ada alat gabungan yang dapat mengetahui apakah itu mendapatkan hasil yang tepat. Saya telah melihat terlalu banyak bug yang lolos karena beberapa programmer memutuskan untuk mempercayai alat penggabung.
smithco
1
Menggabungkan alat tidak seharusnya membanting dua teks. Mereka seharusnya menggabungkan perubahan dari komitmen induk; perbedaan besar
alternatif
Gabung alat tidak mengerti kode. Yang dapat mereka lakukan adalah mengambil dua bagian teks yang berbeda dan mencoba untuk secara cerdik merekonsiliasi mereka. Saya tidak bisa cukup menekankan berapa kali saya telah melihat penggabungan yang buruk tergelincir dan menyebabkan kegagalan pembangunan dan bug. Setiap penggabungan harus dianggap berisiko dan hasil ditinjau oleh manusia dan lulus uji sebelum melakukan perubahan yang digabungkan. Ini proses yang rumit dan jarang dilakukan.
smithco
1

Pendekatan rilis-on-utama yang disiplin berfungsi dengan baik.

Percabangan SVN tidak dirancang agar fleksibel. Saya menyarankan masalah pertama Anda terletak pada SVN; pindah dari itu akan membuka opsi baru.

Paul Nathan
sumber