Làm thế nào có thể quy mô tích hợp liên tục cho các dự án / nhóm rất lớn?


7

Theo truyền thống, các hệ thống CI chỉ giám sát chất lượng của mã trong một nhánh tích hợp, báo hiệu khi xảy ra hồi quy. Sự can thiệp của con người là cần thiết để sửa chữa.

Khi số lượng nhà phát triển làm việc trên cùng một chi nhánh làm tăng nguy cơ vỡ / tắc nghẽn tăng lên. Cuối cùng, một điểm đạt được trong đó trung bình vào thời điểm một sự cố được khắc phục, một điểm mới xuất hiện tiến bộ trên nhánh trở nên không đáng kể.

Việc chia thành nhiều nhóm, mỗi nhóm làm việc trên một nhánh tích hợp riêng biệt sẽ được sáp nhập vào một thời điểm sau đó có thể giúp ích, nhưng kéo dài đáng kể thời gian dự án, vì nó chỉ đơn giản là trì hoãn sự tích hợp cần thiết cho một thời điểm sau trong khi thêm bộ lọc / tiếng ồn / kỹ thuật liên quan đến sự tích hợp một phần từ sự hợp nhất chi nhánh cá nhân. Chi phí cũng tăng do thiết lập CI cho từng chi nhánh, mỗi chi nhánh có tài nguyên xây dựng / QA riêng, v.v. Và chất lượng tổng thể không nhất thiết phải tốt hơn.

Khả năng mở rộng là, tốt nhất, đáng ngờ.

Có một phương pháp để làm cho các dự án lớn như vậy thực sự quy mô?


1
Câu hỏi này, đối với tôi, giống như khá nhiều câu hỏi khác khiến tôi nghĩ như "tại sao đây thậm chí là một câu hỏi". Không phải đó là một câu hỏi tồi, mà là một điều gì đó mà trên thế giới tôi đến từ (máy tính lớn, tôi cá là bây giờ bạn biết ...) không thực sự là một câu hỏi nữa. Đó là những gì ở đó chúng tôi đang làm trong ít nhất một thập kỷ hoặc lâu hơn, và IMO nó hoạt động như một sự quyến rũ. Làm thế nào khác có thể giữ cho một hệ thống ngân hàng hoạt động. Tôi chỉ không biết có hợp lý không khi đăng câu trả lời khi nhìn vào nó bằng kính máy tính lớn. Bạn nghĩ sao?
Pierre.Vriens

1
Quy mô của dự án ở đây có nghĩa là quy mô và tốc độ của các thay đổi đối với hệ thống đang được thực hiện, không nhất thiết là kích thước của chính hệ thống (ví dụ, nếu dự án sẽ viết lại toàn bộ hệ thống hoặc xây dựng hệ thống từ đầu). Và bối cảnh là một nhánh duy nhất, tách ra trên các nhánh tính năng trong nhiều ngày / tuần / tháng tại một thời điểm không tích hợp liên tục. Không nói rằng điều đó không xảy ra tại địa điểm của bạn, chỉ nói rằng chính bối cảnh máy tính lớn không bao hàm sự tích hợp liên tục quy mô lớn. Hãy suy nghĩ hàng trăm cam kết mỗi ngày vào cùng một chi nhánh.
Dan Cornilescu

Câu hỏi này để lại cho tôi rất nhiều câu hỏi nữa - làm thế nào bạn kết thúc trong tình huống này? Tại sao nhiều nhà phát triển làm việc trên cùng một chi nhánh? Tại sao các tính năng chi nhánh cần môi trường QA riêng của họ? Tại sao các thay đổi được đẩy đến nhánh tích hợp phá vỡ bản dựng và tại sao vấn đề không được giải quyết thay vì mở rộng CI? Họ không thử nghiệm tại địa phương? Không hợp nhất từ ​​thượng nguồn trước khi họ hợp nhất với nó?
Adrian

1
Các chi nhánh @Adrian là xấu xa - họ mang theo Địa ngục Tích hợp với họ - rủi ro, chậm chạp, tốn kém. Đặc biệt là cho các đội lớn. Các chi nhánh có thể dễ dàng phân kỳ quá nhiều và làm cho việc hợp nhất trở nên không thực tế. Tra cứu các lợi thế CI. Sự phân nhánh có nghĩa là làm việc riêng rẽ - loại bỏ tất cả những lợi thế đó và mang lại những nhược điểm bổ sung. Vâng, các chi nhánh đã được sử dụng để vận chuyển sw thành công trong nhiều thập kỷ - không có sự thay thế nào. Nhưng bây giờ chúng tôi có CI. Tuy nhiên, nhiều người vẫn sử dụng các nhánh - họ đã quen với chúng, thậm chí không cảm thấy đau nữa hoặc chọn bỏ qua nó. Hoặc nhấn các vấn đề về khả năng mở rộng.
Dan Cornilescu

CI giải quyết một vấn đề hoàn toàn khác với các nhánh và được sử dụng một cách chính xác, các nhánh hoạt động với CI, không chống lại nó. Không sử dụng các nhánh cũng không tránh được sự tích hợp, điều đó còn tệ hơn: mọi người làm việc trong cùng một chi nhánh phải hợp nhất mỗi khi họ đẩy.
Adrian

Câu trả lời:


5

Có, nhưng đó là bằng cách ngăn chặn những điều bạn đề cập trong câu hỏi của bạn càng nhiều càng tốt. Bạn đúng rằng chỉ có rất nhiều nhà phát triển có thể làm việc trên cùng một mã trước khi mọi thứ trở nên không thể quản lý được. Bạn cần ai đó hoặc một cái gì đó có cái nhìn tổng quan về tất cả các thay đổi và đảm bảo tích hợp hoạt động tốt và hồi quy không xảy ra. Điều này khó mở rộng nếu mọi thứ xảy ra trong một kho lưu trữ.

Trước khi bắt đầu bất kỳ công việc nào, bạn cần tách chức năng theo cách sao cho mọi thứ có thể được tích hợp sau này với ít hoặc không cần nỗ lực. Điều này có nghĩa là bạn muốn chia chức năng thành các phần độc lập hoặc ít nhất có ít phụ thuộc nhất có thể. Làm thế nào bạn làm điều này phụ thuộc rất nhiều vào sản phẩm bạn đang phát triển. Trước đây, chức năng phân tách được thực hiện bằng cách tạo các thư viện khác nhau. Nhược điểm của việc này là bạn cần một phương pháp tốt để quản lý các thư viện đó. Các phiên bản cũ của Windows chẳng hạn có một hệ thống quản lý thư viện tồi tệ gây ra DLL Hell khét tiếng . Ngày nay, các dịch vụ vi mô là (trở thành) một cách phổ biến để làm điều này, mặc dù điều này cũng có nhược điểm (ví dụ: chi phí liên lạc, nhiều dịch vụ hơn để giám sát)

Nếu việc phân tách dựa trên chức năng là khó khăn, một lựa chọn khác có thể là tách thời gian phát triển. Thay vì nhiều nhóm làm việc đồng thời trên nhiều tính năng khác nhau, bạn có 1 nhóm chỉ hoạt động trên 1 hoặc một vài tính năng.

Khi không thể tách công việc, bạn sẽ cần các công cụ và bài kiểm tra để đảm bảo mọi thứ phù hợp. Đơn vị tự động và kiểm thử tích hợp có thể là một trợ giúp lớn ở đây, nhưng cuối cùng sẽ có giới hạn về mức độ lớn của một dự án hoặc nhóm để có thể thực hiện được.


4

Khi số lượng nhà phát triển làm việc trên cùng một chi nhánh làm tăng nguy cơ vỡ / tắc nghẽn tăng lên. Cuối cùng, một điểm đạt được trong đó trung bình tại thời điểm một sự cố được cố định, một điểm mới xuất hiện

Trong khi phần đầu của câu có lẽ đúng về mặt thống kê, tôi không đồng ý với phần thứ hai.

CI và các nhánh tích hợp không thể đánh bại GIGO (rác trong rác) Nếu các nhà phát triển không có kỷ luật thì bạn sẽ kết thúc trong một nhánh bị tạm dừng, nhưng các thử nghiệm nhánh tích hợp chỉ nên đóng vai trò là rào cản lat, chứ không phải đầu tiên.

Các nhà phát triển nên sử dụng các tiêu chuẩn mã hóa phù hợp, đánh giá mã, kiểm tra đơn vị địa phương và có thể kiểm tra nhánh trước tích hợp để làm cho các xung đột ít xảy ra hơn.

Tôi đang làm việc hàng ngày trên một hệ thống như vậy với hàng trăm người đóng góp và thật ngạc nhiên khi thấy nó bị treo.

Tôi không có đủ dữ liệu nhưng có thể đúng là chi phí cao, mặt khác, rất khó để đánh giá chi phí thay thế của tích hợp muộn và lỗi.


0

Một cách tiếp cận khác là chuyển sang một hệ thống CI phi truyền thống khác, có khả năng ngăn chặn hồi quy bằng cách xác định và từ chối các thay đổi ứng viên vi phạm trước khi cam kết thay vì phát hiện hồi quy và chờ phục hồi trong khi phát triển trên chi nhánh bị chặn. Tôi thích gọi hệ thống như vậy là hệ thống CI không chặn .

Đơn giản chỉ cần tăng các yêu cầu xác minh trước cam kết do nhà phát triển thực hiện trong nỗ lực giảm hồi quy chi nhánh là không đủ để đảm bảo như vậy. Nó thực sự có thể gây ra sự gia tăng tốc độ hồi quy : thời gian xác minh lâu hơn => số lượng thay đổi được xác minh đồng thời cao hơn (do đó không tính toán lẫn nhau) => nguy cơ xung đột và can thiệp chức năng cao hơn. Tôi đang giải thích điều này chi tiết hơn một chút trong phần Mở rộng phạm vi xác minh trước khi cam kết sẽ làm tăng huyền thoại ổn định chi nhánh của chúng tôi .

Tất nhiên, công cụ CI cũng cần có khả năng hoạt động ở quy mô. Và các công cụ như vậy tồn tại, xem Có công cụ CI nào đảm bảo không có hồi quy ở mức chất lượng chi nhánh không?

Tiết lộ: Tôi liên kết với công ty được đề cập trong các liên kết trên.


Bạn có phiền nếu tôi làm lại "từ chối trách nhiệm" của bạn một chút (nếu bạn không thích nó, chỉ cần thực hiện quay lại)?
Pierre.Vriens

Không có gì, xin vui lòng làm.
Dan Cornilescu

1
Xong ... IMO tương đương với phiên bản của bạn, tuân thủ các yêu cầu SE (để thêm tiết lộ) và phông chữ phù hợp hơn (ít gây nhiễu hơn). Hãy thoải mái làm lại hoặc rollback nếu bạn muốn.
Pierre.Vriens
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.