Làm thế nào để thoát khỏi nhánh phát triển cho luồng Git đơn giản hóa


20

Trong một dự án web được phát triển liên tục (không phải là sản phẩm), chúng tôi hiện có chiến lược phân nhánh sau, chủ yếu dựa trên luồng git :

  • phát triển chi nhánh: phiên bản làm việc mới nhất
  • nhánh chính: phiên bản sẽ được phát hành / phát hành phiên bản
  • nhánh tính năng: tính năng trong phát triển
  • Chi nhánh hotfix: lỗi khẩn cấp trong phiên bản phát hành

Master chỉ được đọc, cập nhật thông qua các yêu cầu kéo từ các nhánh phát triển hoặc hotfix . Mỗi bản cập nhật dẫn đến một ứng cử viên phát hành được xây dựng và triển khai cho hệ thống dàn. Ứng viên phát hành được triển khai để sản xuất sau khi phê duyệt thủ công.

Các nhánh tính năng được tạo dựa trên sự phát triển hoặc từ cam kết cuối cùng đã được hợp nhất thành chủ. Yêu cầu kéo từ nhánh tính năng để phát triển được xây dựng, triển khai đến hệ thống kiểm tra miễn phí nơi kiểm tra tích hợp và kiểm tra chấp nhận (tự động & thủ công) được thực thi. Khi được kiểm tra và xem xét thành công, PR sẽ được hợp nhất, do đó nó sẽ trở thành một phần của phiên bản tiếp theo (tức là hợp nhất từ ​​phát triển thành chủ).

Mục tiêu của tôi

Tôi muốn đơn giản hóa điều này và thoát khỏi nhánh phát triển. Chi nhánh phát triển có hầu hết các lý do lịch sử và vì nó luôn là phiên bản được thử nghiệm thành công, tôi nghĩ không cần thiết phải tách nó ra khỏi chủ. Loại bỏ nó cũng sẽ đơn giản hóa quá trình phát hành vì không còn hợp nhất nữa.

Tôi có các ràng buộc sau:

  • phát hành được lên lịch và không nên hoàn toàn tự động
  • trong khi các nhánh tính năng thường tồn tại trong thời gian ngắn, một số nhánh không được kết hợp trong vài tuần (ví dụ như thiết kế lại) nhưng cũng cần phải được thử nghiệm (hiện tại là các yêu cầu kéo mở để phát triển)
  • đôi khi một tính năng duy nhất nên được phát hành bên ngoài bản phát hành thông thường, thực sự biến nó thành một hotfix. Với chiến lược hiện tại, tôi có thể khởi động lại một nhánh tính năng và hợp nhất nó trực tiếp vào chủ
  • điều đó cũng xảy ra rằng chúng ta cần giữ lại các tính năng sau khi thử nghiệm chấp nhận với các hệ thống bên ngoài để dàn dựng không thành công

Nơi tôi không chắc chắn về quá trình chuyển đổi:

  • hiện tại tôi đang xây dựng các yêu cầu kéo để thử nghiệm và hợp nhất các cam kết cho các bản phát hành. Tôi có thể thống nhất điều này?
  • Làm thế nào để đối phó với các hotfix khi bản chính đi trước bản phát hành mới nhất. Tôi có nên xây dựng và triển khai các bản phát hành trực tiếp từ các chi nhánh hotfix không?
  • Có cách nào hợp lý để xử lý các tính năng cần loại trừ khỏi bản phát hành sau khi chúng đã được hợp nhất không? Là một nhánh phát triển riêng biệt thực sự là một lợi thế cho những trường hợp này? Hầu hết thời gian tôi kết thúc hoàn nguyên và hoàn nguyên các cam kết bằng mọi cách.

4
Có vẻ như một mặt, bạn nói rằng bạn không cần chi nhánh DEV, nhưng sau đó tiếp tục giải thích lý do tại sao bạn thực sự cần nó. Các nhánh tính năng sống trong nhiều tuần sẽ rất khó hợp nhất để thành thạo sau khi chuyển hướng trong thời gian dài đó. Bạn có chắc chắn muốn loại bỏ DEV?
Dave Swersky

@DaveSwersky câu hỏi hay! Tôi không chắc chắn, đó là lý do tại sao tôi hỏi ở đây :) Về các nhánh tính năng tồn tại lâu: khó khăn để hợp nhất là một vấn đề đã tồn tại và sẽ được chuyển đến một nơi khác. Và với sự hợp nhất thường xuyên trở lại từ chi nhánh chính, điều đó là có thể. Làm thế nào sẽ khó khăn hơn nếu chi nhánh chính là chủ?
Fabian Schmengler

Các nhánh tồn tại lâu sẽ luôn là một thách thức, mặc dù có lẽ nhiều thách thức hợp nhất với chủ hơn là với nhánh DEV. Giải pháp cho vấn đề đó có thể là chia nhỏ công việc tốt hơn để giữ cho các nhánh đó tồn tại trong thời gian ngắn. Nếu bạn có thể ngăn các nhánh chủ đề / tính năng sống hơn 24-48 giờ, bạn có thể may mắn hơn khi loại bỏ DEV.
Dave Swersky

1
@FabianSchmengler Lý do thực sự bạn muốn xóa chi nhánh dev là gì? Nó thực sự có vẻ như bạn cần nó cho các trường hợp khi mọi thứ không đi theo kế hoạch.
avi

gọi nó là bậc thầy hoặc phát triển hoặc bất cứ điều gì bạn muốn, bạn sẽ cần một nhánh tích hợp nếu bạn muốn có CI thực sự hoặc nếu bạn ủy thác nó cho các nhánh tính năng, nó sẽ chỉ là sự tích hợp bên ngoài của chúng chống lại sự phát hành hiện tại.
18 giờ 48 phút

Câu trả lời:


6

IMHO những vấn đề bạn đang đối mặt chỉ là một tác dụng phụ của chiến lược kém chi nhánh bạn bắt đầu với: bạn đang có hiệu quả cày phát triển mới trên develop(tức là những gì hội tụ về phía tương lai mã sản xuất) thông qua các hiện mã sản xuất trên master. Điều này dẫn đến các yêu cầu và vấn đề mâu thuẫn vì điển hình là mã tương lai khác với mã hiện tại:

  • sự phát triển mới làm mất ổn định sản xuất - hồi quy được thấy sau khi sáp nhập developvàomaster
  • ổn định sản xuất làm chậm sự phát triển trong tương lai - bạn cần ổn định developđể làm cho nó đủ tốt để sáp nhập vàomaster

Thả developsẽ không giúp được gì (nhiều) - bạn không loại bỏ được vấn đề, bạn chỉ chuyển developphần cụ thể của vấn đề vào master.

Một cách tiếp cận tốt hơn sẽ là di chuyển sản xuất đằng sau sự phát triển hiện tại / tương lai, để ngăn chặn sự can thiệp vào sự phát triển cho các bản phát hành trong tương lai, như được minh họa trong hình ảnh này từ Mô hình phân nhánh của bạn là gì? :

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

Xin lưu ý rằng tôi chỉ đề cập đến các nhánh phát hành trong hình trên, không phải về những gì đang xảy ra trong thân cây.

Làm thế nào điều này sẽ làm việc cho bạn:

  • các developdissapears chi nhánh, như bạn mong muốn, hấp thụ vàomaster
  • các masterchi nhánh là thân của bạn, đây là nơi phát triển xảy ra không có giới hạn tốc độ (nó không bao giờ sáp nhập vào sản xuất).
  • sản xuất là / là một hoặc nhiều releasechi nhánh được kéo từ masternhãn / thẻ được coi là đủ gần với chất lượng sản xuất (một danh sách ngắn các mục việc cần làm còn lại có thể được giải quyết trong chi nhánh đó nếu cần). Các chi nhánh này chỉ có thể nhận các bản sửa lỗi nóng trực tiếp và / hoặc các bản sửa lỗi được chọn từ master, chúng không bao giờ được hợp nhất với masterhoặc các chi nhánh khác
  • hotfix là cam kết trực tiếp vào releasechi nhánh

Nếu một hotfix chỉ áp dụng cho một phiên bản sản xuất nhưng không áp dụng cho phiên bản masterđó được cam kết trực tiếp với releasechi nhánh. Nếu nó được áp dụng cho cả hai thì nó thường được cam kết masterđầu tiên và cam kết chọn / gấp đôi cho releasechi nhánh.

Bây giờ nhìn vào những gì đi vào master(đã qua điểm mà releasenhánh hiện tại bị kéo ra), bạn có 2 tùy chọn:

  • tiếp tục với các nhánh tính năng giống như bạn làm hôm nay, ngoại trừ chúng sẽ được dựa trên master, không develop. Chuyển đổi chúng thành các bản sửa lỗi nóng vẫn có thể - bạn chỉ cần khởi động lại chúng sang releasenhánh tương ứng thay vìmaster
  • chuyển sang tích hợp liên tục và gặt hái những lợi ích của nó (có thể được thực hiện bất cứ lúc nào trong tương lai), bao gồm cả theo cách thức tiến bộ - dần dần kéo các nhánh tính năng ngày càng ít đi.

Nếu bạn thích cách tiếp cận này thì đây là cách bạn đến đó từ nơi bạn đang có ngày hôm nay:

  • thiết lập một chiến lược đặt tên phát hành:
    • bạn không thể có một nhánh phát hành liên tục có cùng tên
    • bạn không thể (thực sự không nên) rebase hoặc đồng bộ hóa một nhánh phát hành sản xuất
  • kéo một releaseXchi nhánh từ masterngay lập tức, theo chiến lược đặt tên đó
  • ngăn chặn các cam kết đi vào develop, họ sẽ sớm đi thẳng vào master.
  • hợp nhất developthànhmaster
  • hướng dẫn các nhà phát triển khởi động lại không gian làm việc của họ masterthay vì develop.
  • mở masterđể cam kết
  • xóa developnếu bạn muốn (hoặc để nó bị khóa vĩnh viễn / chỉ đọc để tham khảo)

Cảm ơn bạn đã gợi ý chi tiết. Tôi không chắc chắn nếu các nhánh phát hành là một ý tưởng tốt ngoài phát triển sản phẩm, nhưng tôi sẽ xem xét lại nó, nó có thể có ý nghĩa cho dự án này
Fabian Schmengler

Bạn cũng có giải pháp thay thế triển khai liên tục, đặt sự phát triển ở cùng một nơi với sản xuất (trái ngược với việc đẩy qua hoặc tiến hành trước nó), nhưng đối với đó bạn cần một sự thay đổi văn hóa (vì nó ngụ ý bỏ tất cả các nhánh tích hợp và tính năng).
Dan Cornilescu

Tôi nhận ra sơ đồ đó :)
paul_h

11

Giả sử bạn lấy ra nhánh chính (bạn có thể đổi tên phát triển thành chủ để gây nhầm lẫn cho nhóm của mình nếu bạn muốn sau này) và chỉ cần sử dụng thẻ để phát hành trên các nhánh phát triển hoặc hotfix. Bạn đã lấy ra một nhánh, nhưng sự khác biệt chỉ là thay đổi cú pháp. Thay đổi vì lợi ích thay đổi.

Bây giờ hãy nói rằng bạn thực sự phát triển với việc giữ nhánh chính bị khóa. Điều gì sẽ xảy ra là việc tích hợp mã sẽ chậm lại, nó sẽ sống tách biệt lâu hơn trong các nhánh tính năng, đặc biệt là gần với ngày phát hành. Điều này sẽ tăng khó khăn cho việc hợp nhất mỗi lần và làm chậm quá trình.

Trong các ràng buộc bạn đã đặt ra, tôi không thấy bất kỳ tác động tích cực nào của việc thực hiện thay đổi đó. Nó sẽ yêu cầu thư giãn các ràng buộc, đặc biệt là cái đầu tiên.


5

Bạn đã xây dựng và kiểm tra mã trên mỗi nhánh yêu cầu kéo và sửa lỗi nóng. Điều này có nghĩa là tổng hợp, tổng của tất cả các chi nhánh đang chờ xử lý theo yêu cầu kéo là developchi nhánh ảo của bạn .

Bạn có thể tạo một hệ thống khi trong môi trường thử nghiệm, một số yêu cầu kéo được chọn vào một nhánh tạm thời không được xuất bản lên kho lưu trữ chính. Nhánh này được sử dụng để tích hợp một môi trường thử nghiệm bao gồm mastervà một số yêu cầu kéo bổ sung, nhưng một khi thử nghiệm được thực hiện, nhánh này không còn khả dụng ở bất cứ đâu.

Khi bạn tạo một bản phát hành từ master, bạn thường sẽ tạo một thẻ trên bản phát hành đó. Các hotfix sau này có thể sử dụng thẻ đó để tạo một nhánh hotfix mới mà từ đó việc triển khai sẽ được thực hiện, mặc dù các cạnh của masterđã ở phía trước. Trên nhánh hotfix này, có lẽ bạn cũng sẽ gắn thẻ một bản phát hành nhỏ và đảm bảo rằng các thay đổi đã được hợp nhất vào master.

Loại bỏ các tính năng hợp nhất từ ​​một bản phát hành khá khó thực hiện với git. Cơ chế tốt nhất cho việc này sẽ là sử dụng git reverttrên cam kết hợp nhất. Nhưng điều đó khiến cho hầu như không thể lấy lại các tính năng / thay đổi này và lịch sử trở nên rối rắm.

Một cách tốt hơn nhiều để xử lý phân tách để triển khai mã và phát hành các tính năng, là các cờ tính năng . Nếu nhà phát triển của bạn có thể ẩn các tính năng của họ đằng sau một số điều kiện trong chính mã, bạn có thể triển khai mã của họ, nhưng tắt tính năng này. Đây là một chủ đề riêng biệt, nhưng có rất nhiều thông tin về vấn đề này tồn tại (bao gồm cả câu hỏi và trả lời về devops.SE).


2

Vâng @ dan-cornilescu nói rằng nó phù hợp với vấn đề cụ thể của bạn, nhưng trường hợp tổng quát hơn cho Phát triển dựa trên Trunk (được đề cập trong Giao hàng liên tục, Lean Enterprise và Cẩm nang DevOps) được thực hiện tại đây: https://trunkbaseddevelopment.com/

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.