Apa cara terbaik untuk versi proyek multi-komponen

10

Saya punya program yang dibangun dari 5 komponen utama. Saya menemukan penomoran versi standar terlalu membatasi karena saya ingin melihat versi apa setiap kompomen.

Adakah yang menemukan cara mudah untuk melakukan ini selain masing-masing daftar secara terpisah?

John Smith
sumber
1
Apakah semua komponen dibangun secara bersamaan? Apakah mereka "dibebaskan" pada saat yang sama?
Adam Lear
1
@Anna Lear: tidak, komponen dibuat dan dirilis pada waktu yang berbeda.
John Smith
Jika mereka dirilis secara independen, saya akan memperlakukan mereka sebagai produk terpisah, masing-masing dengan nomor versi 'pengembangan' mereka sendiri. Jika kombinasi ini juga dijual / dirilis sebagai produk tunggal yang dapat memiliki versi 'komersial'.
Kwebble
Apa tujuan Anda saat membuat versi? Untuk apa informasi versi itu digunakan ? Pelaporan bug? memeriksa kepatuhan peningkatan? lisensi? Menjawab pertanyaan-pertanyaan ini dapat menjawab pertanyaan root Anda.
Alex Feinman

Jawaban:

7

Kami memiliki masalah yang sama persis dengan produk kami, dan kami memutuskan untuk melakukan nomor versi individual untuk setiap komponen dan versi produk hanya versi pemasaran yang terdiri dari berbagai komponen pada revisi tertentu.

Dave Nay
sumber
2
Seperti apa itu dalam sistem kontrol versi Anda? Apakah Anda "menyematkan" semua sub-proyek saat Anda membuat rilis besar?
Robert Harvey
Ketika kami sedang mempersiapkan rilis utama semua komponen ditinjau dan jika ada perubahan maka mereka menerima versi yang diperbarui pada saat itu. Versi ini ditandai dalam Kiln.
Dave Nay
3

Kami memiliki "versi rilis sistem", yang merupakan nomor versi standar yang menjelaskan konfigurasi komponen tertentu, lalu file terpisah mencantumkan versi masing-masing komponen untuk rilis sistem tertentu. Pelanggan mengatakan 5.2.1 tetapi kami dapat mencari bangunan individu jika perlu. Biasanya untuk rilis utama kami menyinkronkan semua versi individual sehingga semuanya dibangun dari nomor cabang yang sama lagi.

Karl Bielefeldt
sumber
1
Ini adalah apa yang saya pikirkan, tetapi bagaimana Anda mengelola ini dalam lingkungan CI / CD? Menjaga dokumentasi itu tampak seperti PITA nyata
Sinaesthetic
1

Versi adalah masalah yang terpisah dari pengembangan aplikasi berbasis komponen. Baik Anda ingin versi setiap komponen, atau Anda ingin versi seluruh aplikasi.

Pola yang terkenal untuk versi adalah dari Microsoft :

major version.minor version.build number.revision

Misalnya, Anda dapat melihat file DLL di platform .NET untuk memiliki versi seperti 2.0.3600.1, atau sesuatu seperti itu.

Jadi, saya sarankan Anda pertama kali menentukan apakah Anda ingin versi keseluruhan sistem atau komponennya. Jika Anda ingin versi keseluruhan sistem, maka setelah setiap integrasi, bangun seluruh proyek, dan tingkatkan bagian nomor build . Jika tidak, maka cukup versi setiap komponen yang dibuat.

Saeed Neamati
sumber
Saya tidak setuju dengan strategi nomor pembuatan Anda. Nomor build biasanya berubah setiap kali Anda membangun proyek untuk komponen tertentu, sehingga tidak akan berfungsi.
Robert Harvey
@ Robert, ya, nomor build segera menjadi nomor yang bagus. Itu sebabnya beberapa sistem lain tidak memasukkannya. Kamu bebas pergi. Namun, versi utama dan versi minor sama-sama keluar di hampir semua sistem versi.
Saeed Neamati
Versi semacam ini untuk kompatibilitas dan tidak benar-benar menjawab masalah.
Sinaesthetic
1

Berhati-hatilah dengan versi, itu mungkin membunuh Anda :-) Jangan mencoba membuat hal-hal terlalu rumit.

Saya pikir pendekatan berikut ini dapat membantu Anda:

Versi setiap komponen secara individual dengan skema versi apa pun yang Anda inginkan. Dari komentar Anda, saya mengerti bahwa Anda memiliki VCS di tempat. Saya juga berasumsi bahwa setiap komponen memiliki file di mana versinya disimpan (kan?). Sekali per hari / minggu (mana yang bekerja lebih baik untuk tim Anda) tambahkan tag ke salah satu revisi terbaru di VCS yang menandai revisi itu sebagai revisi resmi terbaru (dan secara opsional menambahkan nomor super-revisi). Sekarang Anda dapat meminta VCS untuk revisi dengan tag itu dan kemudian mencari versi komponen dalam versi resmi itu.

Jika Anda hanya ingin secara lokal, tulis skrip kecil yang akan mengumpulkan versi setiap komponen dari tempat di mana disimpan dalam kode.

Jika Anda ingin membuatnya lebih mewah, setelah Anda melakukan penandaan, Anda dapat melihat file milik masing-masing komponen, mengingat bahwa Anda dapat mengidentifikasi file yang dimiliki komponen tertentu. Jika ada yang berubah, tambahkan versi untuk komponen tertentu itu. Alternatifnya adalah melakukan ini secara manual. Alternatif lain adalah kombinasi percabangan dan penggabungan dengan pelacakan versi.

Victor Hurdugaci
sumber
1

Sebagian besar nomor versi menggunakan revisi besar dan kecil yang didorong oleh pemasaran, sehingga Anda tidak dapat menggunakannya untuk melacak masing-masing versi komponen. Singkatnya, Anda perlu menemukan beberapa bagian lain dari versi yang dapat Anda gunakan untuk melacak versi masing-masing komponen, dan memesan nomor versi utama dan kecil untuk melacak seluruh paket.

Jika Anda mengikuti sesuatu yang mirip dengan pola Microsoft:

major-version.minor-version.build-number.revision

Anda dapat menggunakan .revisi untuk melacak versi masing-masing komponen, dan menggunakan angka revisi minor dan utama untuk melacak perubahan produk lengkap, dengan cara biasa.

Jika Anda mengikuti pola yang mirip dengan ini:

Major-Version.Minor-Version.Build-Number

Anda harus menggunakan nomor build untuk melacak masing-masing versi komponen.

Robert Harvey
sumber
0

Seluruh buku ditulis tentang perangkat lunak versi.

Berikut ini pendekatan yang saya gunakan.

Setiap bagian memiliki versi dalam bentuk:

major.minor.developmental

Masing-masing adalah angka, mulai dari 0.

Untuk rilis resmi (yaitu kepada pelanggan), bagian pengembangan harus selalu 0 sebagai kebijakan.

Mayor bertambah dengan keputusan pemasaran.

Minor bertambah dengan set fitur yang dirilis - ke pasar.

Contoh:

  • Saya memulai pengembangan pada komponen baru, jadi nomor versi saya akan 0.0.1. Ketika saya melepaskan meja saya ke rekan-rekan saya, misalnya, untuk pengujian internal, jumlah pengembangan naik ke 0,0.2, 0.0.3, dan seterusnya.

  • Saya merilis hal baru ini ke pasar sebagai 1.0.0, di mana satu-satunya perubahan yang diizinkan dari akhir pengembangan untuk rilis adalah mengubah nomor versi (mis. 0,0.43 -> 1.0.0).

  • Beberapa fitur baru harus ditambahkan. Saya mulai bekerja pada garis dasar 1.0.0, menambahkan fitur-fitur ini, sehingga versi yang saya rilis kepada kolega saya untuk pengujian adalah 1.0.1, 1.0.2, dan seterusnya.

  • Fitur selanjutnya dirilis ke pasar sebagai 1.1.0.

  • Pemasaran memutuskan bahwa hal besar berikutnya akan sangat besar, sehingga akan keluar sebagai 2.0.0. Saya mulai bekerja pada 1.1.1, maju melalui 1.1.x, dan dirilis sebagai 2.0.0.

Dan siklus itu berulang.

Pendekatan ini, untuk setiap komponen, memberi Anda keterlacakan nenek moyang.

Di dalam sistem manajemen revisi sumber (dan objek) Anda, gunakan cabang dan tag (label, apa pun terminologi Anda saat itu) untuk mengelola pengembangan.

Kontrol revisi Anda kemudian dapat mengelola setiap komponen sepenuhnya secara terpisah, dengan cabang pengembangan dan label / tag untuk masing-masing komponen. Atau Anda dapat menggabungkan semuanya, dalam hal ini Anda mungkin ingin melakukan percabangan dengan paket kerja - tetapi pastikan untuk memberi label / tag dengan melepaskan setiap komponen (dan ketika Anda melakukannya, beri label / tag semuanya, bukan hanya bit untuk komponen. Dengan cara ini Anda memiliki potret keadaan semuanya pada saat itu.)

Kemungkinan proses rilis Anda akan membutuhkan pemikiran yang cermat. Menggunakan pendekatan ini mencakup beberapa langkah manual, dan ini mungkin tidak diinginkan - ini semua tergantung pada bagaimana sistem build Anda menyodok nomor versi ke objek akhir. Untuk banyak kode yang disematkan di mana nomor versi hanya bernama angka (mis. #Didefinisikan dalam kode C), Anda tidak punya banyak pilihan selain melakukan semua ini secara manual. Platform desktop dengan GUI yang bagus sering membuat ini jauh lebih ramah.

dengan cepat_now
sumber
Jadi, apakah pada dasarnya Anda mengatakan bahwa, untuk versi komponen individu Anda menambah angka ketiga, dan untuk versi seluruh sistem Anda menambah angka pertama atau kedua untuk setiap komponen?
Robert Harvey
Lakukan setiap komponen secara terpisah sebagai nomor versi pengembangan. Gulung bagian utama atau kecil dengan rilis produk lengkap yang terkait. CATATAN bahwa ini bekerja cukup baik untuk firmware tertanam - Saya akan memberikan banyak pemikiran untuk ini vs sesuatu yang lain untuk PC berbasis s / w di mana Anda mungkin mengirim banyak DLL. Pendekatan ini juga memiliki beberapa kerutan untuk hal-hal seperti PC-s / w di mana Anda mungkin ingin mengidentifikasi dan mengirimkan paket layanan.
cepat_now
Menarik bagaimana para pengetuk mengundurkan diri tanpa mengatakan apa masalahnya, atau menyarankan sesuatu yang lebih baik.
cepat,
0

Ringkasan

Bagi saya, satu-satunya cara yang dapat diandalkan untuk versi perangkat lunak adalah dengan menggunakan pengidentifikasi hash atau perubahan dari sistem kontrol versi Anda.

Nomor versi build keseluruhan dapat berguna, tetapi itu hanya benar-benar dijamin unik jika Anda memiliki server build dan / atau Anda menandatangani setiap rilis. Namun bagi banyak dari kita, ini tidak layak.

Jika proyek Anda terbagi atas beberapa repositori kontrol versi, Anda juga perlu membangun mekanisme di mana antarmuka pengguna Anda dapat meminta setiap repositori dependen dan melaporkannya kembali ke pengguna.

Contoh dari pengalaman pribadi

Dalam sebuah proyek di perusahaan sebelumnya, di mana kami memiliki masalah dengan perangkat lunak memodifikasi pelanggan (internal) kami dan mengkompilasi ulang, saya melembagakan sebuah proses di mana hash mercurial dikompilasi ke dalam setiap aplikasi dan perpustakaan. Setiap kali perangkat lunak dimulai, string revisi dibangun dengan menanyakan semua komponen perangkat lunak.

String revisi ini ditampilkan ketika Anda pergi ke halaman tentang dan ditulis ke file log setiap kali aplikasi dimulai. Itu dari bentuk:

Application name     (6a72e7c61f54)
    Library1         (b672a13a41e1)
        Library2     (9cc35769b23a)
    Library2         (9cc35769b23a)
    Library3         (4e9f56a0186a+)
        Library2     (9cc35769b23a)
    Library4         (2e3b08c4ac76)
        Library1     (b672a13a41e1)
            Library2 (9cc35769b23a)

Dari sini saya dapat dengan mudah melihat bahwa mereka telah memodifikasi Library3 dan tidak melakukan perubahan itu ke repositori, sehingga mereka menggunakan kode yang tidak terkontrol. Saya juga dapat membandingkan hash dengan sistem pengujian saya saat ini, jadi saya mungkin dapat mengidentifikasi bahwa hash telah mengembalikan (katakanlah) Library1 ke versi yang lebih lama.

Ini berarti bahwa setiap kali mereka melaporkan bug, saya selalu dapat membangun kembali kode yang digunakan pada saat masalah terjadi, atau paling tidak tahu pasti bahwa saya tidak dapat mereproduksi pengaturan.

Untuk detail lebih lanjut dari sistem build yang saya gunakan, bagaimana saya menyelesaikan ini, masalah apa yang saya miliki, dan apa yang orang sarankan untuk menghindarinya, lihat pertanyaan Stack Overflow saya .

Catatan: Sistem ini hanya benar-benar layak jika Anda menggunakan sistem kontrol revisi di mana hash yang diberikan dijamin menghasilkan set file yang sama di direktori kerja Anda (misalnya git dan lincah) jika direktori kerja yang diberikan dapat berisi campuran file dan direktori dari beberapa revisi (mis. svn) maka semua taruhan dimatikan mengenai keadaan direktori kerja dan metode ini tidak akan berfungsi sama sekali.

Mark Booth
sumber