Build.number neden anlamsal sürümün “kötüye kullanılması” dır?


35

Bizim üst düzey mimarlar birine bir teklif inşa sistemi (Gradle / Artifactory / Jenkins / şef) anlatırken, o da bana bir yorum yaptı bunu çeşit tartmak-in gerçekten katılmıyorum, ama tecrübeli yeterince etmek değilim.

Bu proje, diğer ekipler tarafından yeniden kullanılacak bir eser olarak bir Java kütüphanesi (JAR) oluşturur. Sürüm için, aşağıdakilerin anlamsal yaklaşımını kullanmak istiyorum:

<major>.<minor>.<patch>

Nerede patch, hata / acil düzeltmeleri gösterir minorgeriye doğru uyumlu bültenleri gösterir ve majorAPI ve / veya geriye doğru uyumsuz değişikliklerin ya masif refactorings gösterir.

Teslimat buraya geldiğinde istediğim şey: geliştirici bazı kodlar işliyor; Bu bir QA / TEST ortamına bir yapı tetikler. Bazı testler yapıldı (bazıları otomatik, bazıları manuel). Tüm testler geçerse, o zaman bir üretim kurumu JAR’ı şirket içi depoda yayınlar. Bu noktada JAR düzgün bir şekilde sürümlendirilmeli ve benim düşüncem build.number, otomatik olarak oluşturulan ve CI aracımızın yama numarası olarak davranması için sağlananı kullanmaktı .

Böylece, versiyonlama aslında olacaktır:

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

Yine, build.numberCI aracı tarafından sağlananlar.

Mimar, CI yapı numarasını kullanmanın anlamsal sürümün "kötüye kullanılması" olduğunu söyleyerek bunu reddetti.

Sorum şu: bu doğru mu ve öyleyse neden? Ve değilse, neden olmasın?

Yanıtlar:


45

Küçük ve büyük sürümler arttığında, derleme numaranız 0'a sıfırlanmayacaktır, bu özelliklerin 7. ve 8. bölümlerini ihlal eder :

Genel API'ye yeni, geriye dönük uyumlu işlevsellik sunulmuşsa, Y (xYz | x> 0) sürümleri artırılmalıdır. Herhangi bir genel API işlevinin kullanımdan kaldırılmış olarak işaretlenmesi, artırılmalıdır. Özel kod içerisinde önemli miktarda yeni işlevsellik ya da iyileştirmeler yapıldığında, artırılabilir. Yama seviyesi değişiklikleri içerebilir. Küçük sürüm artırıldığında, yama sürümü 0 olarak sıfırlanmalıdır.

Genel API'ye geriye dönük uyumsuz herhangi bir değişiklik yapıldığında, ana sürüm X (Xyz | X> 0) artırılmalıdır. Küçük ve yama düzeyinde değişiklikler içerebilir. Büyük sürüm artırıldığında, düzeltme eki ve küçük sürüm 0'a sıfırlanmalıdır.

Bu nedenle, sürüm numaralarının (ana, küçük, yama) manuel olarak sunulması gerekir, çünkü bunlar kullanıcılarınıza bir yerdeki değişikliklerden bahsetmek için değiştirmeden veya başka bir belgeye bakmak zorunda kalmadan kullanılır.

Derleme numaranızı dahil etmek istiyorsanız, bunları aşağıdaki bölümlerden sonra ekleyebilirsiniz +(bölüm 10):

Yapı meta verileri MAY, bir yama işareti veya düzeltme eki veya sürüm öncesi sürümü hemen izleyen bir dizi noktadan ayrılmış tanımlayıcı ekleyerek belirtilebilir. Tanımlayıcılar, yalnızca ASCII alfanümerikler ve kısa çizgi [0-9A-Za-z-] içermelidir. Tanımlayıcılar boş olmamalıdır. Sürüm önceliği belirlenirken derleme meta verileri göz ardı edilmelidir. Bu nedenle, yalnızca derleme meta verilerinde farklı olan iki sürüm aynı önceliğe sahiptir. Örnekler: 1.0.0-alfa + 001, 1.0.0 + 20130313144700, 1.0.0-beta + exp.sha.5114f85.


Hızlı takip @Residuum (ve cevap için BTW + 1): sürüm numaraları her zaman manuel olarak elde edilmeli mi? Olmazsa, CI / inşa numarası yerine hangi araçlar kullanılabilir?
herpylderp

1
@herpylderp hiç değil, Tom Preston-Werner'in 'özelliği' sadece onun görüşüdür, diğer şirketlerin yüklerinin farklı (genellikle birbirine çok benzer) standartları vardır. Bunların çoğunda, otomatik olarak üretilen bir numara sürümün bir parçasıdır. CI derleme numarasını kullanmak yapılacak mantıklı bir şeydir.
gbjbaanb

Araç derleme numaralarında aritmetik işlem yapmanıza izin veriyorsa, CI aracını yine de kullanabilirsiniz. Büyük veya küçük sürüm yükseltmesi olarak piyasaya sürdüğünüz sürüm ne olursa olsun, bu derleme numarasını, geçerli CI derleme numarasından çıkarılan sürüm dizesi ifadesine ekleyin. Voila, derleme numaranızı sıfırlamadan yeni sürüm için derleme numaranızı sıfırlamanız yeterli.
KeithS

2
Bana gelince, sadece DLL dosyaları için [major]. [Minor]. [Revizyon]. [SVN-Version] ve yükleyiciler için [major]. [Minor]. [SVN-Version] kullanıyorum. CI derleme numarası yalnızca dahili kullanım içindir, başarısız olan bir derlemenin CI ortamındaki bir değişiklikten sonra aynı kod tabanına göre yeniden çalıştırılabileceğini göstermek için kullanılır (bir anahtar sertifika yükleme, GAC'ye ortak kütüphaneler ekleme vb.).
KeithS

1
@gbjbaanb ve ark .: İçinde bulunduğum "anlamsal versiyonlama" ile ilgili her tartışmada, semver.org'daki tanım konu oldu. "Semantik sürüm" için web'de arama yapın ve en azından ilk sayfa semver.org'daki tanımla ilgili artı / eksilerle birlikte gelir . Kendi versiyonlama şemalarınızı kullanmakta özgürsünüz, ancak bu terim açıkça tanımlandığı için anlamsal versiyonlama demeyin.
Kalıntı

2

Bunun bir nedeni, düzeltme ekinin birkaç yapı gerektirmesidir, bu nedenle 5.7 sürümüne sahipseniz ve 5.7.1'e düzeltme eki uygulamak istiyorsanız, ancak ilk 2 hata düzeltmeniz CI sistemine gönderildiğinde derlenemez. 5.7.3'te ilk yamasını çıkarmadan önce!

Cevap, basitçe 4 rakam kullanmaktır (Microsoft sistemlerinin sahip olduğu gibi). Dördüncü bir yapı numarasıdır ve "sadece bilgi için" kullanılır. Genelde insanlar depo sürüm numarasını oraya koyarlar (eğer SVN veya TFS veya benzerini kullanıyorlarsa), bu ikilileri oluşturmak için hangi kesin taahhüdün kullanıldığını doğrulayabileceğiniz için gerçekten güzeldir. Eğer böyle bir şeye sahip değilseniz, CI inşa numarası makul bir yaklaşımdır (CI sisteminizin inşa numaralarını hatırlayabilmesini ve repo geçmişine bağlayabilmesini umarsınız, ancak CI'ye güvenmezsiniz) Sistem onları hatırlayarak - eski yapıları asla silemezsiniz).

Unutulmaması gereken bir şey, sürümlendirme için Microsoft şeması derleme numaraları için 3 pozisyon kullanır. Chrome sadece 1 sayı kullanıyor. Ubuntu tarihi kullanır. Kullanılacak "standart" yoktur , ancak tüm sayıların artması gerekir.


5
Evrensel olarak kullanılan veya uygulanan hiçbir standart bulunmamasına rağmen, soru özellikle bir spesifikasyonu olan anlamsal versiyonlama ile ilgili görünmektedir .
Doval,

Hatta örnekte Microsoft için, sahada kırık olduğunu Nuget sürüm (build numaraları için yayın öncesi stilini kullanarak) kırık bir şekilde, semver kullanımlar ve Ruby kullanır major.minor.teeny.patch . Her neyse, yapım numarası semverin bir parçası olabileceğinden, mimar tövbe ediyordu (kuşkusuz ki, 3. konumda değil, + inşa olmalı).
gbjbaanb

2
SemVer 2.0 spec 2013 ve 1.0 spec 2012 söyleyebileceğim kadarıyla. Teknik özellik görünmeden önce NuGet ve Ruby'nin kendi işlerini yapması muhtemel. SemVer spec'in yeni olduğu gibi değil; sadece insanların zaten ne yaptığını resmileştiriyor, böylece bir düzine değişiklik yerine bir yol üzerinde nihayet anlaşabiliriz.
Doval,

"5.7 sürümünüz var ve onu 5.7.1'e düzeltmek istiyorsunuz, ancak ilk 2 hata düzeltmeniz CI sistemine gönderildiğinde derlenemiyor, ilk düzeltme ekinizi yayınlamadan önce 5.7.3'te olacaksınız. !" tamam, peki ne olmuş? Semver'de sayıların atlanmaması gerektiğini söyleyen hiçbir şey hatırlamıyorum.
Andy
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.