Mengapa build.number sebuah "penyalahgunaan" versi semantik?

35

Saya sedang menjelaskan sistem pembangunan yang diusulkan (Gradle / Artifactory / Jenkins / Chef) kepada salah satu arsitek senior kami, dan dia berkomentar kepada saya bahwa saya agak tidak setuju, tetapi saya tidak cukup berpengalaman untuk benar-benar mempertimbangkannya.

Proyek ini membangun perpustakaan Java (JAR) sebagai artefak untuk digunakan kembali oleh tim lain. Untuk versi, saya ingin menggunakan pendekatan semantik:

<major>.<minor>.<patch>

Di mana patchmenunjukkan perbaikan bug / darurat, minormenunjukkan rilis yang kompatibel ke belakang, dan majormenunjukkan baik refactoring besar-besaran dari API dan / atau perubahan yang tidak kompatibel ke belakang.

Sejauh pengiriman berlangsung di sini adalah apa yang saya inginkan: seorang pengembang melakukan beberapa kode; ini memicu build ke lingkungan QA / TEST. Beberapa tes dijalankan (beberapa otomatis, beberapa manual). Jika semua tes lulus, maka bangunan produksi menerbitkan JAR ke dalam repo kami. Pada titik ini JAR harus diversi dengan benar, dan pemikiran saya adalah untuk menggunakan build.numberyang secara otomatis dihasilkan dan disediakan oleh alat CI kami untuk bertindak sebagai nomor tambalan.

Jadi, versi sebenarnya adalah:

<major>.<minor>.<build.number>

Sekali lagi, di mana build.numberdisediakan oleh alat CI.

Arsitek menolak ini, mengatakan bahwa menggunakan nomor build CI adalah "penyalahgunaan" versi semantik.

Pertanyaan saya adalah: apakah ini benar, dan jika demikian, mengapa? Dan jika tidak, mengapa tidak?

herpylderp
sumber

Jawaban:

45

Nomor build Anda tidak akan disetel ulang ke 0, ketika versi minor dan mayor meningkat, ini melanggar bagian 7 dan 8 dari spesifikasi :

Versi minor Y (xYz | x> 0) HARUS bertambah jika fungsionalitas baru yang kompatibel mundur diperkenalkan ke API publik. Ini HARUS bertambah jika ada fungsionalitas API publik yang ditandai sebagai usang. Ini DAPAT ditingkatkan jika fungsionalitas baru atau peningkatan diperkenalkan dalam kode pribadi. Ini MUNGKIN termasuk perubahan level patch. Versi tambalan HARUS diatur ulang ke 0 saat versi minor bertambah.

Versi utama X (Xyz | X> 0) HARUS ditambahkan jika ada perubahan yang tidak kompatibel mundur diperkenalkan ke API publik. Ini MUNGKIN termasuk perubahan tingkat kecil dan patch. Patch dan versi minor HARUS diatur ulang ke 0 ketika versi utama bertambah.

Jadi, nomor versi (utama, kecil, tambalan) harus disediakan secara manual, karena ini digunakan untuk memberi tahu pengguna Anda tentang perubahan di satu tempat tanpa harus melihat changelog Anda atau dokumen lain.

Jika Anda ingin memasukkan nomor build Anda, maka Anda dapat menambahkannya setelah +(bagian 10):

Metadata build MUNGKIN dilambangkan dengan menambahkan tanda tambah dan serangkaian pengidentifikasi titik terpisah segera setelah patch atau versi pra-rilis. Pengidentifikasi HARUS hanya terdiri dari alfanumerik ASCII dan tanda hubung [0-9A-Za-z-]. Pengidentifikasi TIDAK HARUS kosong. Bangun metadata HARUS diabaikan ketika menentukan prioritas versi. Dengan demikian dua versi yang hanya berbeda dalam build metadata, memiliki prioritas yang sama. Contoh: 1.0.0-alpha + 001, 1.0.0 + 20130313144700, 1.0.0-beta + exp.sha.5114f85.

Residuum
sumber
Followup cepatResiduum (dan BTW +1 untuk jawabannya): haruskah nomor versi selalu diturunkan secara manual? Jika tidak, alat apa yang bisa digunakan sebagai pengganti nomor CI / build?
herpylderp
1
@herpylderp sama sekali tidak, 'spec' Tom Preston-Werner hanya pendapatnya, banyak perusahaan lain memiliki standar yang berbeda (umumnya sangat mirip satu sama lain). Pada sebagian besar dari itu, nomor yang dibuat secara otomatis adalah bagian dari versi. Menggunakan nomor build CI adalah hal yang masuk akal untuk dilakukan.
gbjbaanb
Anda masih dapat menggunakan alat CI, jika alat ini memungkinkan Anda untuk melakukan aritmatika pada angka bentukan. Apapun versi build yang Anda lepaskan sebagai peningkatan versi mayor atau minor, masukkan nomor build itu ke ekspresi untuk string versi yang dikurangi dari nomor build CI saat ini. Voila, Anda baru saja mengatur ulang nomor build Anda ke nol untuk versi baru, tanpa benar-benar mengatur ulang nomor build Anda.
KeithS
2
Adapun saya, saya hanya menggunakan [mayor]. [Minor]. [Revisi]. [Versi SVN] untuk DLL, dan [mayor]. [Minor]. [Versi SVN] untuk installer. Nomor build CI hanya untuk penggunaan internal, untuk menunjukkan di mana build yang gagal mungkin dijalankan kembali terhadap basis kode yang sama persis setelah perubahan ke lingkungan CI (menginstal sertifikat kunci, menambahkan perpustakaan umum ke GAC dll).
KeithS
1
@ gbjbaanb et al .: Dalam setiap diskusi tentang "versi semantik" yang saya ikuti , definisi dari semver.org adalah pokok bahasan. Cari di web untuk "versi semantik", dan setidaknya halaman pertama muncul dengan pro / kontra tentang definisi dari semver.org . Anda bebas menggunakan skema versi Anda sendiri, tetapi jangan menyebutnya versi semantik, karena istilah ini didefinisikan dengan jelas.
Residuum
2

Salah satu alasannya adalah bahwa tambalan mungkin memerlukan beberapa build, jadi jika Anda memiliki versi 5.7, dan Anda ingin menambalnya ke 5.7.1, tetapi 2 perbaikan bug pertama Anda gagal membangun ketika mereka dikirimkan ke sistem CI, maka Anda akan menjadi di 5.7.3 sebelum Anda merilis tambalan pertama Anda!

Jawabannya adalah cukup menggunakan 4 digit (seperti yang cenderung dimiliki sistem Microsoft). Keempat adalah nomor build dan digunakan "hanya untuk informasi". Secara umum orang menaruh nomor versi repositori di sana (jika mereka menggunakan SVN atau TFS atau serupa) yang sangat bagus karena Anda dapat memverifikasi komit persis yang digunakan untuk membangun binari. Jika Anda tidak memiliki hal seperti itu, maka nomor build CI adalah perkiraan yang masuk akal (seperti yang Anda harapkan sistem CI Anda dapat mengingat nomor build dan mengikatnya ke sejarah repo, tetapi Anda tidak bergantung pada CI sistem mengingatnya - Anda tidak pernah dapat menghapus build lama).

Satu hal yang perlu diperhatikan, Skema Microsoft untuk versi menggunakan posisi ke-3 untuk nomor membangun. Chrome hanya menggunakan 1 angka. Ubuntu menggunakan tanggal. Tidak ada "standar" untuk digunakan , kecuali bahwa semua angka harus bertambah.

gbjbaanb
sumber
5
Meskipun tidak ada standar yang digunakan atau diberlakukan secara universal, pertanyaannya tampaknya secara khusus tentang versi semantik yang memang memiliki spesifikasi.
Doval
Bahkan yang rusak di lapangan, misalnya versi Microsoft NuGet menggunakan semver, dengan cara yang rusak (menggunakan gaya pra - rilis untuk nomor bangunan), dan Ruby menggunakan major.minor.teeny.patch . Bagaimanapun, karena nomor build dapat menjadi bagian dari semver, arsitek berbicara tosh (meskipun harus diakui, itu seharusnya + build, bukan di posisi ke-3).
gbjbaanb
2
SemVer 2.0 spec dari 2013 dan spec 1.0 dari 2012 sejauh yang saya tahu. Kemungkinan NuGet dan Ruby melakukan hal mereka sendiri sebelum spec muncul. Ini tidak seperti spec SemVer adalah novel; itu hanya memformalkan apa yang sudah dilakukan orang sehingga kita semua akhirnya bisa sepakat pada satu cara untuk melakukannya alih-alih selusin variasi.
Doval
"Anda memiliki versi 5.7, dan Anda ingin menambalnya ke 5.7.1, tetapi 2 perbaikan bug pertama Anda gagal dibangun ketika dikirim ke sistem CI, maka Anda akan berada di 5.7.3 sebelum Anda merilis tambalan pertama Anda ! " ok, tapi jadi apa? Saya tidak ingat apa pun di semver mengatakan angka-angka tidak boleh dilewati.
Andy