chiến lược gói và phiên bản trong môi trường đa kho


13

Chúng tôi là một công ty nhỏ với nhiều đội quản lý kho git của riêng họ. Đây là một nền tảng web và các đồ tạo tác của mỗi đội được triển khai vào cuối ngày để kiểm tra hàng đêm. Chúng tôi đang cố gắng chính thức hóa quy trình xung quanh phiên bản và bao bì.

Mỗi đội có một nhánh chính nơi họ phát triển hàng ngày. Các thành viên đảm bảo chất lượng của mỗi đội muốn các vật phẩm từ các thay đổi của đội của họ được triển khai thành giường thử nghiệm, nơi tất cả các thành phần được kết hợp bởi đầu bếp. Hiện vật là tarball nhưng tôi muốn chuyển đổi chúng thành RPM để chúng ta có thể suy nghĩ và suy luận về các phiên bản một cách chính xác.

Quá trình phát hành bao gồm việc cắt một nhánh phát hành khỏi nhánh phát triển (chủ trong hầu hết các trường hợp) của mỗi kho git. Điều này sau đó được trao cho đảm bảo chất lượng, những người chạy thử nghiệm và đăng xuất trên một bộ cổ vật.

Ví dụ: đây là kho lưu trữ git điển hình với các nhánh phát hành được liên kết:

 0-0-0-0-0-0-0-0-0-0 (master)
   |           |
   0           0
 (rel-1)       |
               0
            (rel-2)

Tôi bị mắc kẹt khi cố gắng tìm ra một kế hoạch để thực hiện phiên bản các gói đến từ các nhánh phát triển. Chúng tôi không muốn gắn thẻ quá mức cho nhánh chính của mỗi repo và hạn chế các thẻ chỉ phát hành các nhánh. Nhưng chúng ta sẽ có thể truy vấn các gói được triển khai trong các máy kiểm tra bằng cách sử dụng ngữ nghĩa yum / vòng / phút tiêu chuẩn. Các phiên bản phát triển sẽ trông như thế nào khi nhánh chính không có thẻ? Tôi hiểu rằng git describecó thể cung cấp cho tôi một đại diện hữu ích của phiên bản xây dựng nhưng hoạt động tốt khi các điểm phát hành khác nhau trên nhánh được gắn thẻ.

EDIT1: Đáp lại câu trả lời của @ Urban48

Tôi hình dung tôi nên giải thích quá trình phát hành của chúng tôi nhiều hơn một chút. Đối với mục đích của cuộc thảo luận này, giả sử chúng ta có chi nhánh mastertrong tất cả các kho lưu trữ. Các masterchi nhánh được coi là chi nhánh phát triển và được triển khai đến một tự động CI-CD kích hoạt môi trường QA. Đây là nơi một tập hợp các bài kiểm tra hàng đêm chạy để đảm bảo sự ổn định của chủ. Chúng tôi xem xét đường ống công việc này trước khi cắt một chi nhánh phát hành. Chi nhánh phát hành của chúng tôi là ngắn ngủi. Giả sử, sau khi cắt một nhánh phát hành (từ một bản gốc ổn định), một hồi quy đầy đủ được chạy, các bản sửa lỗi được thực hiện và triển khai để sản xuất. Điều này mất khoảng một tuần để làm. Chúng tôi phát hành gần như hai tuần một lần để sản xuất.

Các nhánh tính năng của chúng tôi luôn được cắt từ chủ và trải qua một số lượng thử nghiệm của nhà phát triển trước khi hợp nhất với chủ mà họ trải qua kiểm tra độ ổn định CI-CD.

Hotfix được thực hiện trên các nhánh hotfix (được cắt từ các nhánh phát hành) và được triển khai với thử nghiệm tác động tối thiểu vào sản xuất.

Chiến lược phiên bản của chúng tôi để phát hành và các nhánh hotfix theo sau semver. Thả chi nhánh trong QA chu kỳ đi qua các phiên bản như v2.0.0-rc1, v2.0.0-rc2và cuối cùng sau khi QA dấu-off trở thành v2.0.0.

Đôi khi chúng tôi thực hiện các bản phát hành chấm cho các tính năng nhỏ được hợp nhất để phát hành các nhánh (và sau đó thành chủ) nơi các phiên bản trở thành v2.1.0. Và hotfix giả định v2.1.1mô hình.

Tuy nhiên, câu hỏi không phải là về phiên bản các nhánh này. Tôi không muốn thay đổi hoàn toàn sơ đồ phiên bản này. Sự thay đổi duy nhất đến về nhánh phát triển tức là. bậc thầy. Làm thế nào tôi có thể chỉ ra một cách đáng tin cậy trong môi trường CI-CD phiên bản nào tồn tại trong bản phát hành trước đó vào sản xuất. Điều này lý tưởng sẽ được thực hiện thông qua gắn thẻ git thông minh nhưng một cái gì đó không gắn thẻ quá mức chi nhánh chính được ưa thích.


tại sao không thêm -rc. <build_number> vào các bản dựng từ các nhánh phát triển và một khi được phát hành từ nhánh chính / phát hành chỉ cần sử dụng xyz?
Đô thị48

Điều gì sẽ đứng trước rchậu tố? Điều đó sẽ ra lệnh cho major.minorphiên bản phát triển. rcvà số lượng xây dựng có thể được lấy chỉ dựa trên đó. Ngoài ra rctrên chủ không có ý nghĩa bởi vì chúng tôi không bao giờ phát hành từ chủ. Chúng tôi gắn thẻ các ứng cử viên phát hành của chúng tôi ngày hôm nay trên các nhánh phát hành như một phần của chu kỳ phát hành
tsps

Tôi hiểu rồi, những gì về việc không phát hành từ nhiều chi nhánh, nhưng tính năng hoàn chỉnh của cherry-pick cho một nhánh phát hành duy nhất, nơi bạn có thể sử dụng thẻ. các gói phiên bản (vòng / phút hoặc deb) sẽ trở nên dễ dàng hơn, mọi thứ không nằm trong nhánh phát hành sẽ có rchậu tố.
Đô thị48

Câu trả lời:


3

Hmm, tôi có một ví dụ .net có thể là bất khả tri về công nghệ.

Tôi sẽ chỉ làm một bản tóm tắt nhanh chóng.

  • git repo mỗi thành phần với chiến lược phân nhánh gitflow

  • tất cả các cam kết để phát triển kích hoạt xây dựng thành phố đội

  • xây dựng teamcity sửa đổi phiên bản với chính phụ thủ công + số bản dựng trong AssociationInfo.cs tức là 1.1.hotfix.build

  • teamcity kích hoạt bao bì nuget bằng cách sử dụng cùng số phiên bản cho các thư viện được xuất bản nuget

  • bạch tuộc triển khai xây dựng thành qa để thử nghiệm thủ công (giả sử tất cả các thử nghiệm vượt qua)

  • nếu mọi thứ đều tốt, hãy triển khai phiên bản thủ công để sản xuất qua bạch tuộc.

Bây giờ điều này không có nghĩa là bạn nhận được RẤT NHIỀU gói phiên bản nổi. Chúng tôi đã thử nghiệm sử dụng cờ -prerelease nhưng điều này đòi hỏi một gói di chuyển thủ công hơn nữa từ bước phát hành trước đến 'bình thường' và yêu cầu xây dựng lại các thành phần phụ thuộc vào chúng.

Điều quan trọng là phiên bản mỗi bản dựng duy nhất thông qua một số quy trình trung tâm.

Sau đó, bạn đang ở trong tình huống 'hmm tôi muốn phiên bản nào' hơn là 'omg, tôi đã có phiên bản nào ??'

Chỉnh sửa: bình luận lại.

Chỉ cần nhấn mạnh điều quan trọng đó thực sự. Quyết định chi nhánh nào cấu thành phần mềm hoàn chỉnh và phiên bản TẤT CẢ cam kết với nó. chỉ triển khai phần mềm phiên bản từ chi nhánh này.

Quan điểm của tôi là bạn cần giải quyết chiến lược phân nhánh của mình.

  • không phiên bản tính năng (hoặc bất kỳ dev) chi nhánh.
  • làm chủ phiên bản
  • chỉ sử dụng các gói từ chủ

1
Tôi đã khám phá git-Flow nhiều lần trong quá khứ và không may không thể đẩy nó qua. Thay đổi chiến lược phân nhánh và bất kỳ quy trình công việc git nào của các nhà phát triển là một vấn đề khó giải quyết. Chúng tôi muốn thay đổi chiến lược phiên bản để các con số có ý nghĩa khi được triển khai về phát triển, thử nghiệm và sản xuất.
tsps

Ngoài ra, chúng tôi có phiên bản trên các nhánh phát triển ngày nay. Chỉ là chúng ta phải gắn thẻ mọi cam kết, đôi khi hai lần để phiên bản theo cách này. Tôi muốn cung cấp một cái nhìn rõ ràng hơn về sự phát triển bằng cách chỉ ra rằng phiên bản hiện tại sắp ra mắt là v next+ buildstương tự như cáchgit describe
tsps

tốt, bạn vẫn có thể xây dựng và phiên bản cam kết thành thạo. họ thậm chí không sử dụng các nhánh tính năng?
Ewan

nếu bạn không muốn làm chủ phiên bản. sau đó bạn phải cập nhật thủ công phiên bản nhỏ trên nhánh phát hành. có nghĩa là tự cấu hình các bản dựng của bạn mỗi khi bạn tạo bản phát hành mới h
Ewan

Các nhánh tính năng tồn tại và tôi cũng cần áp dụng các phiên bản cho chúng. Không phản đối việc thêm thẻ / phiên bản trên master, chỉ là nó được thực hiện quá mức ngày hôm nay. Bất kỳ chiến lược nào chỉ ra điểm mà tôi có thể gắn thẻ nhánh chính và chỉ ra rằng đó là phiên bản phát triển trái ngược với các phiên bản trên nhánh phát hành đều hữu ích
tsps

1

Hãy để tôi cung cấp quy trình công việc thay thế, có thể giải quyết vấn đề phiên bản của bạn hoặc chỉ giúp bạn nghĩ ra nhiều cách hơn để giải quyết.

Một chút triết lý đầu tiên ..
(Tôi đang đưa ra một vài giả định về quy trình làm việc của bạn, vui lòng sửa cho tôi nếu tôi sai)

  1. Các xét nghiệm được chạy hồi tố :

    Nhánh ngoài masertính năng nhánh, sau đó biến nó thành một vật phẩm để thử nghiệm bởi QA.
    vấn đề là : nếu các bài kiểm tra thất bại, thì mastercó thể bị hỏng!

    phản ứng phụ:

    • Nó làm cho các nhà phát triển không tin tưởng master

    • Vì bạn phân nhánh từ chủ để phát hành chi nhánh, điều gì xảy ra nếu bản phát hành trước bị hỏng? nó dừng tích hợp tính năng mới của bạn cho đến khi bản gốc được sửa lại.

    • khi lỗi được sửa trong nhánh phát hành, hợp nhất trở lại để mastercó thể tạo xung đột hợp nhất. (và chúng tôi không thích xung đột)

  2. mã nhỏ hợp nhất và sửa lỗi :

    Thật khó để theo dõi tất cả các mã được hợp nhất master, như các sửa chữa nhỏ hoặc thay đổi không phải là một phần của một tính năng nhất định.

    phản ứng phụ:

    • Nhà phát triển không chắc chắn liệu anh ta có nên sửa lỗi nhỏ này ngay bây giờ hay không.

    • Tôi nên phiên bản sửa chữa nhỏ mới này là tốt?

    • Tại bất kỳ thời điểm nào, nó không rõ trạng thái của masterchi nhánh và mã nào đang trôi nổi trong đó

    • một cái gì đó đã phá vỡ bản dựng, đó không phải là một phần của tính năng mới. và thật khó để theo dõi nó đến từ đâu

Ý tưởng của tôi cho luồng công việc git như sau:

nhập mô tả hình ảnh ở đây

chi nhánh ra masterđể phát triển tính năng mới như bạn đã làm. nhưng bây giờ thay vì phát hành từ chi nhánh mới được tạo này, hãy sử dụng tính năng này được chọn và nhập vào releasechi nhánh.

Bây giờ bạn có quyền kiểm soát tốt hơn đối với những gì đang đi vào một bản phát hành nhất định.
Bây giờ nó thực sự dễ dàng để cô lập các phiên bản phát triển và các phiên bản ổn định.

Bạn có thể tiếp tục xây dựng các đồ tạo tác từ các nhánh tính năng cho QA.
Nếu mọi thứ đều ổn, hãy hợp nhất tính năng đó trở lại mastervà chọn tính năng này / sửa lỗi / sửa lỗi nóng vào nhánh phát hành.

phiên
bản Phiên bản nhánh tính năng có thể sử dụng một số quy ước tên như1.2.3-rc.12345

các phiên bản trong releasechi nhánh sẽ chỉ sử dụng 1.2.3 ( 1.2.3> 1.2.3-rc.12345cũng là một điều ít phải lo lắng hơn)

Quy trình công việc này khắc phục các sự cố được đề cập ở trên và hơn thế nữa.
Nó cũng đề xuất chiến lược phiên bản lành mạnh, và hầu hết chu kỳ phát hành này có thể được tự động hóa.

Tôi hy vọng nó sẽ giúp bạn theo một cách nào đó, tôi sẽ vui lòng thảo luận về bất kỳ trường hợp cạnh nào bạn có thể đưa ra.

ps:
Tôi xin lỗi vì tiếng Anh của tôi, nó không phải là ngôn ngữ chính của tôi.


Cảm ơn câu trả lời chi tiết của bạn. Tôi sẽ trả lời trong bài viết gốc dưới dạng EDIT vì thanh bình luận không cho phép đủ văn bản.
tsps

0

Quá trình của bạn có vẻ rất phức tạp và việc có được một số lượng thẻ dường như là không thể tránh khỏi.

Hai ý tưởng nảy ra trong đầu:

  1. Bạn coi nhánh "chính" là những gì chúng ta thường có trong nhánh "phát triển". Điều này gây ô nhiễm chi nhánh tin nhắn rất nhiều.

  2. Khi QA kết thúc công việc của họ, bạn có thể có máy chủ build / CI để tạo báo cáo (ví dụ: tệp văn bản) với các thẻ của tất cả các repos đang sử dụng. Bây giờ bạn sẽ có một tệp với các phiên bản có thể được đăng lên repo. Sau đó, bạn chỉ gắn thẻ chi nhánh với phiên bản phát hành và nếu bạn muốn kiểm tra các phiên bản của từng thành phần riêng lẻ, bạn có thể kiểm tra báo cáo.

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.