Làm thế nào để bạn xử lý tích hợp mã từ nhiều chi nhánh / nhà phát triển mỗi lần chạy nước rút?


42

Vừa nhận được một cuộc gọi retro, nơi các nhà phát triển bày tỏ mối quan tâm xung quanh việc tích hợp các câu chuyện của họ vào nhánh chính mỗi lần chạy nước rút. Các nhà phát triển tất cả mã trong nhánh riêng của họ và đến cuối giai đoạn nước rút, tất cả họ hợp nhất thành một nhánh chính.

Sau đó, một nhà phát triển (thường là cùng một nhà phát triển) có nhiệm vụ đảm bảo mọi thứ được tích hợp tốt với mã của nhà phát triển khác (Hầu hết các thay đổi nằm trên cùng một trang. Ví dụ: câu chuyện hiển thị dữ liệu, câu chuyện lọc dữ liệu và một chỉ số SLA).

Làm thế nào chúng ta có thể giảm gánh nặng này và giúp mã của chúng ta dễ dàng hợp nhất với nhau hơn? Từ quan điểm của tôi, việc PO hoặc SM ưu tiên các câu chuyện theo cách hiệu quả hơn để chúng ta không có những loại phụ thuộc này trong cùng một lần chạy nước rút có thể giải quyết một số vấn đề. Làm thế nào để mọi người khác giải quyết điều này? Hay đây chỉ là một phần của quá trình?


18
Bạn không có một nhánh phát triển nơi tích hợp liên tục được thực hiện?
Kayaman

13
Tôi với Kayaman ở đây, cách tốt nhất để thực hiện là tích hợp liên tục.
RandomUs1r

27
Chúc mừng ngày hợp nhất! Bất cứ khi nào vấn đề của bạn quá giống với điều gì đó trên The Daily WTF, bạn sẽ biết mình đang gặp rắc rối.
dùng3067860

Hợp nhất sớm, hợp nhất thường xuyên: {viết mã kiểm tra nhỏ nhất sẽ thất bại (màu đỏ), viết mã sản xuất nhỏ nhất sẽ vượt qua (màu xanh lá cây), cấu trúc lại, kiểm tra lại, hợp nhất} trong khi chưa hoàn thành.
ctrl-alt-delor

1
Lần đăng ký đầu tiên! Không bao giờ là cuối cùng! :-)
ChuckCottrill

Câu trả lời:


88

Nếu bạn đang sử dụng Git, mỗi nhà phát triển sẽ kéo từ developchi nhánh vào nhánh tính năng của riêng họ để họ đảm bảo họ không đi quá xa đường cơ sở hiện tại. Họ có thể làm điều đó hàng ngày, để các nhiệm vụ mất hơn một vài ngày được đồng bộ hóa và các vấn đề hợp nhất được giải quyết trong khi chúng vẫn còn nhỏ.

Khi nhà phát triển hoàn thành công việc của họ, họ tạo một yêu cầu kéo . Khi được phê duyệt, điều đó sẽ được sáp nhập vào developchi nhánh.

Các developchi nhánh phải luôn luôn có mã làm việc, và sẵn sàng cho phát hành bất cứ lúc nào. Khi bạn thực sự phát hành, bạn hợp nhất developvào mastervà gắn thẻ nó.

Nếu bạn có Máy chủ tích hợp liên tục tốt, thì nó sẽ xây dựng từng nhánh khi các thay đổi được kiểm tra - đặc biệt đối với các yêu cầu kéo. Một số máy chủ xây dựng tích hợp với máy chủ Git của bạn để tự động phê duyệt hoặc từ chối yêu cầu kéo nếu quá trình xây dựng thất bại hoặc các thử nghiệm tự động không thành công. Đây là một cách khác để tìm lỗi tích hợp tiềm năng.


73
Phần quan trọng (chỉ được ngụ ý trong câu trả lời của bạn) là các chi nhánh nên được hợp nhất ngay khi chúng sẵn sàng, thường chỉ với 1 - 5 lần cam kết, và không chỉ ở cuối giai đoạn nước rút. Một nhánh cho mỗi tính năng / câu chuyện, không phải một nhánh cho mỗi nhà phát triển. Điều đó đòi hỏi rằng những câu chuyện thực sự rất nhỏ, tức là mất nhiều nhất hai ngày.
amon

@amon, đồng ý. Đã thêm từ "nhánh tính năng", nhưng cố gắng giữ câu trả lời này khá nhỏ. Có rất nhiều bài viết hay đi sâu vào quá trình này.
Berin Loritsch

5
Đừng cô lập trên chi nhánh của riêng bạn. Đó là cách hợp nhất địa ngục bắt đầu. Sử dụng phát triển tuyến chính, cô lập tiến trình công việc đằng sau các tính năng bật hoặc cấu hình thời gian chạy khác.
Rob Crawford

3
@Zibbobz Nhóm của tôi sử dụng "Nhánh tính năng" rõ ràng cho những nhánh, được xử lý cơ bản giống như nhánh phát triển, nhưng chỉ cho các yêu cầu kéo và cam kết liên quan đến thay đổi đó. Nói chung, tùy thuộc vào khoảng thời gian phải duy trì riêng biệt, cứ sau vài ngày sẽ có người hợp nhất các thay đổi từ phát triển thành tính năng và giải quyết mọi vấn đề. Bằng cách đó, các nhánh càng giống nhau càng tốt khi đến lúc hợp nhất. Lưu ý, điều này chỉ dành cho những thay đổi thực sự lớn
thiệu lại vào

9
"cô lập tiến trình công việc đằng sau các tính năng bật hoặc cấu hình thời gian chạy khác" Thay vào đó, bạn vừa tránh được địa ngục hợp nhất bằng cách vào cấu hình địa ngục. "Hợp nhất địa ngục" chỉ là một vấn đề đối với một nhà phát triển tại một thời điểm và dễ dàng tránh được bằng cách đồng bộ hóa thường xuyên, có hàng tấn cấu hình phù du là địa ngục cho tất cả các nhà phát triển trong tương lai.
Khối

23

Tôi đã làm việc trong một nhóm mà chúng tôi phải vật lộn với cùng một vấn đề. Chúng tôi thấy rằng càng ít thời gian trước khi tích hợp, nó càng trở nên khó khăn hơn. Tôi biết hầu hết mọi người dạy tích hợp liên tục nói về việc cam kết cứ sau vài phút - chúng tôi có thể thực sự cam kết mỗi giờ hoặc lâu hơn.

Chúng tôi cũng thấy rằng chỉ cần xây dựng là không đủ. Chúng tôi cần một mức độ bao phủ thử nghiệm tốt để đảm bảo rằng chúng tôi không vô tình phá vỡ mã của nhau.


2
Đây là kinh nghiệm của tôi là tốt. Việc bạn cam kết thường xuyên không thực sự quan trọng, nhưng một khi đã cam kết nhanh chóng việc tích hợp / hợp nhất cam kết sẽ tiết kiệm rất nhiều nỗ lực. Tôi đã từng tham gia một dự án nơi chúng tôi có ba nhánh phát triển khác nhau, mỗi ngành có giá trị công việc hàng tháng. Hợp nhất chúng là không vui. Tôi đã học được rất nhiều từ sai lầm đó :)
amon

4
Có - đây là ý nghĩa của "tích hợp liên tục"! Bạn đang liên tục tích hợp các thay đổi của mình với các thay đổi của nhà phát triển khác!
Rob Crawford

@Rob, đồng ý. Tuyên bố của tôi không có nghĩa là đề xuất rằng tích hợp liên tục không, tốt, liên tục. Chỉ là chúng tôi đã không thực hiện lý tưởng và vẫn thấy rất nhiều lợi ích trong việc tiếp cận với nó.
Daniel

12
  • Giữ cho các chi nhánh của bạn tồn tại trong thời gian ngắn (có vẻ như bạn đã làm điều này).
  • Hãy để kết quả kiểm tra của bạn nói cho chính họ.
  • Đừng chờ kết thúc nước rút.

Bạn thậm chí không cần phải đăng ký TDD cho cái này. Tất cả những gì bạn cần là một số thử nghiệm chứng minh rằng các tính năng của nhà phát triển của bạn đang hoạt động chính xác. Chúng có thể bao gồm Kiểm tra đơn vị và Kiểm tra tích hợp nhưng lý tưởng nhất là một vài thử nghiệm tự động từ đầu đến cuối của các tính năng quan trọng. Tiêu chuẩn gói hồi quy.

Sau đó, khi việc hợp nhất của bạn đã được hoàn thành, bạn có thể kiểm tra báo cáo thử nghiệm tự động hóa cùng nhau và xác minh rằng mọi thứ đã được tích hợp thành công.

Tôi đồng ý với một trong những câu trả lời khác mà tác giả đã nêu Git PRs sẽ giải quyết vấn đề này bằng cách khiến mỗi nhà phát triển hợp nhất công việc của họ.

Một điểm khác mà tôi tin là đủ quan trọng để lại cho đến đoạn cuối cùng. Tôi đề nghị bạn nên chạy thử nghiệm thủ công qua các bản dựng hàng đêm của mình, thay vì chờ đến khi kết thúc nước rút. Các nhà phát triển nên hợp nhất ngay khi tính năng hoàn tất để có thể tích hợp, triển khai và thử nghiệm càng sớm càng tốt.


6

Đừng

Tùy thuộc vào ngôn ngữ của bạn và những tệp bạn đang chỉnh sửa, có thể không có ý nghĩa đối với mỗi nhà phát triển để chỉnh sửa chúng trên nhánh của họ. Ví dụ: trong C # tôi đã thấy tốt nhất chỉ một người có thể chỉnh sửa bất kỳ tệp thiết kế UI nào tại một thời điểm. Đây là các tệp được tạo tự động và do đó mã đôi khi được di chuyển xung quanh mà không có lý do rõ ràng - và điều này tàn phá hầu hết các công cụ hợp nhất.

Điều này có nghĩa là một số câu chuyện có thể chặn các câu chuyện khác cho đến khi hoàn thành công việc UI. Và / Hoặc, một câu chuyện mới được tạo ra để chỉ bố trí UI, với các câu chuyện khác thực hiện chức năng. Hoặc, có thể một nhà phát triển thực hiện tất cả UI hoạt động trong khi những người khác thực hiện chức năng của UI đó.

Trên một lưu ý liên quan, nếu bạn biết nhiều câu chuyện sẽ chạm vào cùng một tệp, bạn có thể chỉ muốn tránh làm việc trên tất cả chúng cùng một lúc. Đừng kéo tất cả chúng vào cùng một lần chạy nước rút, hoặc đừng bắt đầu làm việc với tất cả chúng cho đến khi một hoặc nhiều việc được thực hiện.


Thành thật mà nói, công cụ kiểm soát phiên bản đang sử dụng rất quan trọng để phân nhánh và sáp nhập thành công. Ngay cả với mã C # và mã WinForms hoặc WebForms có lẽ bạn phải làm việc với thường không thay đổi nhiều như vậy . Nếu có, có lẽ bạn cần thực hiện một số mockup trước khi chơi với mã. Các giao diện người dùng dựa trên XAML ổn định như mã thông thường và mã trung gian không được kiểm tra.
Berin Loritsch

2
@BerinLoritsch Mã nhà thiết kế WinForms thực sự có thể thay đổi rất nhiều, ngay cả với những thay đổi nhỏ về thị giác. Tôi đã thấy rằng các dòng mã là như nhau, nhưng thứ tự rất khác nhau - đặc biệt là khi nhiều nhà phát triển đang thực hiện chỉnh sửa cùng một lúc. Có thể đó là sự cố của công cụ VCS (chúng tôi đã sử dụng một số, có thể chúng tôi chỉ sử dụng sai), nhưng đối với chúng tôi, việc thay đổi quy trình của chúng tôi đơn giản hơn nhiều.
mmathis

2
@BerinLoritsch Tôi phải đến mmathis thứ hai ở đây ít nhất là cho các hình thức giành chiến thắng (không bao giờ sử dụng các hình thức web). Trình thiết kế giao diện người dùng winforms thích sắp xếp lại ngẫu nhiên tất cả các mã trong tệp trình thiết kế để đáp ứng với một thay đổi nhỏ ở đâu đó trên biểu mẫu. Trừ khi bạn hoàn tác thủ công sắp xếp lại trước mỗi lần xác nhận (điều gì đó có thể dễ dàng là 10 hoặc 15 phút trên một biểu mẫu phức tạp), lịch sử của tệp thiết kế hoàn toàn vô dụng và nếu 2 người đang làm việc trên giao diện người dùng của biểu mẫu cùng một lúc sẽ dẫn đến một cuộc xung đột hợp nhất từ ​​địa ngục. Khóa nói chung là một lựa chọn tồi tệ, nhưng với winforms thực sự là ít tệ nhất.
Dan Neely

@DanNeely, Đó chỉ là một trong những lý do khiến nhóm của chúng tôi di chuyển khỏi mã WinForms. Một lý do khác là nhà thiết kế rất mỏng manh và một số hình thức phức tạp của chúng tôi không thể được chỉnh sửa bằng mắt. Chúng tôi cuối cùng đã phải thực hiện các thay đổi trực tiếp trong cơ sở mã hóa - có lẽ tại sao tôi không nhớ lại quá nhiều biến động ở đó. Điều đó và người dùng của chúng tôi làm việc với màn hình mật độ cao thực sự đã đẩy chúng tôi đến WPF. Một quá trình đau đớn với một đường cong học tập cao, nhưng một phần thưởng tốt đẹp ở cuối của nó. Hầu hết các câu chuyện trong hồ sơ tồn đọng là cho các phần khác nhau của ứng dụng.
Berin Loritsch

@BerinLoritsch giống nhau ở đây. Các hình thức giành chiến thắng đã trả một phần lớn các hóa đơn của tôi trong hầu hết một thập kỷ tại công việc trước đây của tôi, nhưng tôi sẽ rất vui khi không bao giờ chạm vào nó một lần nữa trong tương lai.
Dan Neely

2

Một cách tiếp cận khả thi khác để tránh các sự hợp nhất muộn và lớn là các cờ tính năng : bạn bảo vệ các thay đổi của mình bằng một cờ có thể định cấu hình (lý tưởng nhất là động) để ngăn chúng hoạt động trước khi dự định.

Điều này cho phép bạn hợp nhất các thay đổi của bạn sớm trở lại vào một trong hai masterhoặc nhánh phát triển chung của bạn mà không phá vỡ bất cứ điều gì. Các nhà phát triển khác sau đó có thể hợp nhất các thay đổi này trở lại vào các nhánh tính năng của họ (hoặc khởi động lại các nhánh của họ theo đó).

Như các câu trả lời khác đã chỉ ra điều này nên được kết hợp với một giải pháp tích hợp liên tục.

Cờ tính năng có các lợi ích bổ sung (ví dụ: chúng giúp bạn dễ dàng thực hiện các thử nghiệm A / B). Xem bài viết này của Martin Fowler để biết thêm thông tin.


0

Chúng tôi đang theo cách tiếp cận của nhánh phát triển riêng cho từng tính năng và sau đó chúng tôi sẽ hợp nhất các nhánh với nhánh QA để thử nghiệm trong môi trường thử nghiệm tích hợp.

Sau khi hoàn thành kiểm tra hồi quy và tích hợp, chúng tôi dễ dàng di chuyển các tính năng đã sẵn sàng để chuyển sang nhánh phát hành.

Nếu mọi việc suôn sẻ, chúng tôi hợp nhất nhánh phát hành trở lại nhánh chính.


0

Nói một cách đơn giản, cam kết và sáp nhập thường làm giảm cửa sổ cơ hội cho các xung đột hợp nhất và sẽ giảm đáng kể xung đột. Phần khác thực sự được lên kế hoạch bởi người lãnh đạo, điều này có thể đảm bảo hơn nữa công việc trôi chảy.

Các câu trả lời khác cung cấp một số hiểu biết sâu sắc liên quan đến các thực tiễn tốt nhất cho các cam kết và chỉ cần làm theo những điều đó có thể sẽ làm giảm phần lớn các vấn đề hợp nhất của bạn. Nhiều sự hợp nhất gần như chắc chắn là một điều cần thiết, nhưng đối với một nhóm nhỏ hơn, cách tiếp cận chi nhánh của mỗi người có thể hoạt động đủ tốt. Tất nhiên, mặc dù không có nhiều thực hành mở rộng hơn!

Tuy nhiên, dường như không ai đã giải quyết một trong những câu hỏi quan trọng nhất của bạn - phải làm gì khi tất cả các bạn đều chạm vào cùng một khu vực mã. Đây là nơi hữu ích khi có một người dẫn đầu quen thuộc với cơ sở mã và có thể nhận ra sự phụ thuộc của các nhiệm vụ khác nhau. Nếu họ không sắp xếp thời gian làm việc và cam kết, bạn có thể sẽ kết thúc bằng xung đột hợp nhất và giải quyết theo từng dòng. Tổ chức các nhiệm vụ \ thời gian khó khăn hơn nhiều với một nhóm lớn hơn, nhưng với một nhóm nhỏ có thể xác định các nhiệm vụ xung đột này. Người dẫn đầu thậm chí có thể chuyển tất cả các nhiệm vụ liên quan sang cùng một kỹ sư, để tránh xung đột hoàn toàn.

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.