Tại sao build.number là một lạm dụng của người Viking về phiên bản ngữ nghĩa?


35

Tôi đã giải thích một xây dựng hệ thống đề xuất (Gradle / Artifactory / Jenkins / Chef) đến một trong những kiến trúc sư cao cấp của chúng tôi, và ông đã thực hiện một lời nhận xét với tôi rằng tôi loại không đồng ý với, nhưng tôi không đủ kinh nghiệm để thực sự kiểm tra trọng lượng trên.

Dự án này xây dựng một thư viện Java (JAR) như một vật phẩm để được các nhóm khác sử dụng lại. Để tạo phiên bản, tôi muốn sử dụng cách tiếp cận ngữ nghĩa của:

<major>.<minor>.<patch>

Trong đó patchchỉ ra các sửa lỗi / khẩn cấp, minorchỉ ra các bản phát hành tương thích ngược và majorchỉ ra các phép tái cấu trúc lớn của API và / hoặc các thay đổi không tương thích ngược.

Theo như giao hàng ở đây là những gì tôi muốn: một nhà phát triển cam kết một số mã; điều này kích hoạt việc xây dựng môi trường QA / TEST. Một số thử nghiệm được chạy (một số tự động, một số thủ công). Nếu tất cả các thử nghiệm vượt qua, thì một bản dựng sản xuất sẽ xuất bản JAR cho repo nội bộ của chúng tôi. Đến thời điểm này, JAR phải được phiên bản chính xác và suy nghĩ của tôi là sử dụng build.numbercông cụ CI được tạo tự động và cung cấp để hoạt động như số bản vá.

Do đó, phiên bản thực sự sẽ là:

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

Một lần nữa, nơi build.numberđược cung cấp bởi công cụ CI.

Kiến trúc sư đã bác bỏ điều này, nói rằng sử dụng số xây dựng CI là một "lạm dụng" phiên bản ngữ nghĩa.

Câu hỏi của tôi là: điều này có đúng không, và nếu vậy, tại sao? Và nếu không, tại sao không?

Câu trả lời:


45

Số bản dựng của bạn sẽ không được đặt lại về 0, khi các phiên bản nhỏ và chính tăng, điều này vi phạm các phần 7 và 8 của thông số kỹ thuật :

Phiên bản nhỏ Y (xYz | x> 0) PHẢI được tăng nếu chức năng tương thích ngược, mới được đưa vào API công khai. Nó PHẢI được tăng lên nếu bất kỳ chức năng API công khai nào được đánh dấu là không dùng nữa. Nó có thể được tăng lên nếu chức năng hoặc cải tiến mới đáng kể được giới thiệu trong mã riêng. Nó có thể bao gồm thay đổi cấp độ bản vá. Phiên bản vá PHẢI được đặt lại về 0 khi tăng phiên bản nhỏ.

Phiên bản chính X (Xyz | X> 0) PHẢI được tăng lên nếu có bất kỳ thay đổi không tương thích ngược nào được đưa vào API công khai. Nó có thể bao gồm những thay đổi cấp độ nhỏ và vá. Bản vá và phiên bản nhỏ PHẢI được đặt lại về 0 khi tăng phiên bản chính.

Vì vậy, số phiên bản (chính, phụ, bản vá) phải được cung cấp theo cách thủ công, vì chúng được sử dụng để thông báo cho người dùng của bạn về những thay đổi ở một nơi mà không cần phải xem thay đổi của bạn hoặc một số tài liệu khác.

Nếu bạn muốn bao gồm số bản dựng của mình, thì bạn có thể nối thêm chúng sau +(phần 10):

Xây dựng siêu dữ liệu CÓ THỂ được biểu thị bằng cách nối thêm dấu cộng và một loạt các số nhận dạng được phân tách bằng dấu chấm ngay sau bản vá hoặc phiên bản tiền phát hành. Mã định danh PHẢI chỉ bao gồm chữ và số gạch ngang ASCII [0-9A-Za-z-]. Định danh PHẢI KHÔNG được để trống. Xây dựng siêu dữ liệu NÊN bỏ qua khi xác định ưu tiên phiên bản. Do đó, hai phiên bản chỉ khác nhau trong siêu dữ liệu xây dựng, có cùng mức độ ưu tiên. Ví dụ: 1.0.0-alpha + 001, 1.0.0 + 20130313144700, 1.0.0-beta + exp.sha.5114f85.


Theo dõi nhanh @Residuum (và BTW +1 cho câu trả lời): số phiên bản có phải luôn được lấy bằng tay không? Nếu không, công cụ nào có thể được sử dụng thay cho CI / số bản dựng?
herpylderp

1
@herpylderp hoàn toàn không phải, 'thông số kỹ thuật' của Tom Preston chỉ là ý kiến ​​của anh ấy, vô số các công ty khác có các tiêu chuẩn khác nhau (nói chung rất giống nhau). Trong hầu hết các số đó, một số được tạo tự động là một phần của phiên bản. Sử dụng số xây dựng CI là một điều hợp lý để làm.
gbjbaanb

Bạn vẫn có thể sử dụng công cụ CI, nếu công cụ cho phép bạn thực hiện số học trên các số bản dựng. Bất kỳ bản dựng nào bạn phát hành dưới dạng nâng cấp phiên bản chính hoặc phụ, hãy cắm số bản dựng đó vào biểu thức cho chuỗi phiên bản trừ vào số bản dựng CI hiện tại. Voila, bạn vừa đặt lại số bản dựng của mình về 0 cho phiên bản mới mà không thực sự đặt lại số bản dựng của mình.
KeithS

2
Đối với tôi, tôi chỉ sử dụng [chính]. [Nhỏ]. [Sửa đổi]. [Phiên bản SVN] cho DLL và [chính]. [Nhỏ]. [Phiên bản SVN] cho trình cài đặt. Số bản dựng CI chỉ dành cho sử dụng nội bộ, để hiển thị nơi bản dựng bị lỗi có thể được chạy lại với cùng một cơ sở mã sau khi thay đổi môi trường CI (cài đặt chứng chỉ khóa, thêm thư viện chung vào GAC, v.v.).
KeithS

1
@gbjbaanb et al.: Trong mọi cuộc thảo luận về "phiên bản ngữ nghĩa" mà tôi là một phần, định nghĩa từ semver.org là chủ đề. Tìm kiếm trên web cho "phiên bản ngữ nghĩa" và ít nhất trang đầu tiên xuất hiện những ưu / nhược điểm về định nghĩa từ semver.org . Bạn có thể tự do sử dụng các lược đồ phiên bản của riêng mình, nhưng đừng gọi đó là phiên bản ngữ nghĩa, vì thuật ngữ này được xác định rõ ràng.
Residuum

2

Một lý do là bản vá có thể yêu cầu một số bản dựng, vì vậy nếu bạn có phiên bản 5.7 và bạn muốn vá nó thành 5.7.1, nhưng 2 lỗi đầu tiên của bạn không thể xây dựng khi chúng được gửi đến hệ thống CI, thì bạn sẽ tại 5.7.3 trước khi bạn phát hành bản vá đầu tiên của mình!

Câu trả lời là chỉ cần sử dụng 4 chữ số (như các hệ thống của Microsoft có xu hướng). Số thứ 4 là số bản dựng và được sử dụng "chỉ cho thông tin". Nói chung, mọi người đặt số phiên bản kho lưu trữ ở đó (nếu họ sử dụng SVN hoặc TFS hoặc tương tự), điều này thực sự tốt khi bạn có thể xác minh cam kết chính xác nào đã được sử dụng để xây dựng các nhị phân. Nếu bạn không có một thứ như vậy, thì số bản dựng CI là một xấp xỉ hợp lý (vì bạn hy vọng hệ thống CI của bạn có thể nhớ các số bản dựng và gắn nó vào lịch sử repo, nhưng bạn không phụ thuộc vào CI hệ thống ghi nhớ chúng - bạn không bao giờ có thể xóa các bản dựng cũ).

Một điều cần lưu ý, Lược đồ Microsoft để tạo phiên bản sử dụng vị trí thứ 3 cho các số bản dựng. Chrome chỉ sử dụng 1 số. Ubuntu sử dụng ngày. Không có "tiêu chuẩn" để sử dụng , ngoại trừ tất cả các số phải tăng.


5
Mặc dù không có tiêu chuẩn nào được sử dụng hoặc thi hành phổ biến, câu hỏi dường như đặc biệt về phiên bản ngữ nghĩa có đặc điểm kỹ thuật.
Doval

Ngay cả khi nó bị hỏng trong trường, ví dụ, phiên bản NuGet của Microsoft sử dụng semver, theo cách bị hỏng (sử dụng kiểu phát hành trước cho số bản dựng) và Ruby sử dụng Major.minor.teeny.patch . Dù sao, vì số bản dựng có thể là một phần của semver, kiến ​​trúc sư đã nói chuyện với nhau (mặc dù phải thừa nhận, nó phải là + bản dựng, không phải ở vị trí thứ 3).
gbjbaanb

2
Thông số SemVer 2.0 là từ năm 2013 và thông số 1.0 là từ năm 2012 theo như tôi có thể nói. Có khả năng NuGet và Ruby đã tự làm việc của mình trước khi thông số kỹ thuật xuất hiện. Nó không giống như thông số SemVer là tiểu thuyết; nó chỉ chính thức hóa những gì mọi người đã và đang làm để cuối cùng chúng ta có thể đồng ý về một cách để làm điều đó thay vì hàng tá biến thể.
Doval

"bạn có phiên bản 5.7 và bạn muốn vá nó thành 5.7.1, nhưng 2 lỗi đầu tiên của bạn không được xây dựng khi chúng được gửi tới hệ thống CI, sau đó bạn sẽ ở phiên bản 5.7.3 trước khi bạn phát hành bản vá đầu tiên của mình ! " ok, nhưng vậy thì sao? Tôi không nhớ bất cứ điều gì trong học kỳ nói rằng các con số không được bỏ qua.
Andy
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.