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?


10

Theo truyền thống, các hệ thống CI chỉ thực hiện giám sát các mức chất lượng trong nhánh tích hợp, bằng cách thực hiện xác minh QA trên cơ sở mã nơi các thay đổi đã được cam kết, theo dõi hồi quy và gửi thông báo cho sự can thiệp của con người.

Nhưng khi các hồi quy này được phát hiện, chi nhánh đã gặp rắc rối ít nhất kể từ khi xác minh QA tương ứng bắt đầu và sẽ vẫn ở trạng thái như vậy (hoặc thậm chí trở nên tồi tệ hơn!) Cho đến khi tất cả các thủ phạm được xác định, sửa chữa cho chúng đã cam kết và xác minh QA mới xác nhận mức chất lượng chi nhánh đã được khôi phục. Chi nhánh có thể được coi là bị chặn để phát triển bình thường trong suốt thời gian này.

Có một công cụ CI nào có khả năng thực sự ngăn chặn các hồi quy như vậy xảy ra hay không, nó sẽ thực hiện xác minh QA trước khi cam kết và chỉ cho phép các cam kết khi mã cơ sở được cập nhật với các xác nhận tương ứng cũng sẽ vượt qua các xác minh QA đã cam kết trước đó, do đó đảm bảo tối thiểu Chi nhánh chất lượng?

Cập nhật: giả định là các xác minh QA tự động phù hợp với độ bao phủ phù hợp để có thể phát hiện các hồi quy tương ứng có sẵn để gọi (các) công cụ CI.


Tôi tiếp tục tự hỏi về cách chính xác để hiểu câu hỏi này (và đề nghị của riêng bạn trong câu trả lời của riêng bạn). Nếu tôi thay thế "giám sát" bằng "sau sự thật" và "ngăn chặn" bằng "ngăn chặn chúng xảy ra", thì điều đó ít nhiều sẽ là câu hỏi tương tự? Ngoài ra, có lẽ bạn có thể thêm một số kịch bản ví dụ để giải thích sự khác biệt?
Pierre.Vriens

@ Pierre.Vriens Điều này có tốt hơn không?
Dan Cornilescu

Câu trả lời:


6

Theo như tôi có thể nói, bạn đang tìm kiếm một công cụ sẽ từ chối các cam kết phá vỡ bản dựng, một công cụ CI có thể sẽ không thể ngăn chặn hồi quy bằng cách thực sự sửa mã của bạn, nhưng nó có thể ngăn bạn thêm mã xấu vào kho lưu trữ.

Atlassian có một vài ứng dụng thú vị của móc Git :

Các móc nhận trước phía máy chủ là một lời khen đặc biệt mạnh mẽ đối với việc tích hợp liên tục vì chúng có thể ngăn các nhà phát triển đẩy mã thành chủ, trừ khi mã đáp ứng một số điều kiện nhất định - như những người bảo vệ ninja ưu tú, bảo vệ nó khỏi mã xấu.

Nếu bạn đang sử dụng Git, các hook rất mạnh mẽ (và có các hook tương tự cho các hệ thống kiểm soát phiên bản SVN , Mercurial và các phiên bản khác) và bạn có thể thấy hữu ích khi sử dụng chúng để chạy kiểm tra trước khi xác nhận.

Tài liệu Git có một trang về việc tạo ra một cái móc để từ chối các cú đẩy nếu chúng không đáp ứng một tiêu chí nhất định có thể dễ dàng thích nghi với trường hợp sử dụng này.

Tuy nhiên, nhiều người sẽ tranh luận rằng từ chối các cam kết là một ý tưởng tồi đối với một featurechi nhánh, bạn sẽ chỉ lãng phí thời gian để chống lại hệ thống CI của mình khi bản dựng bị hỏng vì một lý do nào đó, thay vì thực sự sửa lỗi.

Trên masternhánh, có thể có ý nghĩa để từ chối các hợp nhất bị hỏng, bởi vì bạn có thể muốn đảm bảo nó luôn được xây dựng. Đối với một featurechi nhánh, bạn chắc chắn sẽ phá vỡ mọi thứ và vì mã bây giờ không được sản xuất , nên cảnh báo bạn nhiều hơn là thực sự từ chối cam kết của bạn.


Chà, hình ảnh sw nào tốt mà xây dựng, nhưng DOA từ thử nghiệm triển vọng? Các nhà phát triển không thể kiểm tra các thay đổi mã của họ ngay cả khi họ xây dựng, vì vậy họ sẽ bị chặn. Vì vậy, nói chung tôi sẽ mở rộng từ chối cam kết đối với bất kỳ điều gì không kiểm tra QA tối thiểu, được chọn bằng cách cân bằng 2 yêu cầu mâu thuẫn: càng cao càng tốt để tối đa hóa số lượng nhà phát triển được bảo vệ khỏi bị chặn và càng thấp càng tốt để xác minh QA trì hoãn Làm chậm quá trình xuống quá nhiều.
Dan Cornilescu ngày

Một ví dụ về điều này có thể là mô hình yêu cầu kéo trong đó bạn có thể đặt ra một số hạn chế nhất định về việc liệu yêu cầu kéo có thể được hợp nhất hay không. Ví dụ: chúng tôi (công ty của tôi) sử dụng Máy chủ Bitbucket của Atlassian và có các tùy chọn để yêu cầu ít nhất N số lượng phê duyệt và số lần xây dựng vượt qua cho chi nhánh nhất định trước khi yêu cầu kéo được phép được hợp nhất. Điều này không hoàn toàn từ chối nó. Nhưng ngăn chặn sự hợp nhất ngẫu nhiên khi các thử nghiệm thất bại hoặc mắt khác chưa nhìn thấy mã.
Andy Shinn

@AndyShinn: Vâng, tôi thấy rằng GitHub khá hữu ích cũng cung cấp các nhánh được bảo vệ và kiểm tra các yêu cầu kéo , thường rất hữu ích.
Aurora0001

1
Một lập luận cho phép mã bị hỏng trong các nhánh tính năng là nó cho phép các nhà phát triển đẩy mã mà họ đang làm việc lên repo, ngay cả khi nó chưa hoàn toàn sẵn sàng. Điều này có thể hữu ích để chia sẻ mã với những người khác để đánh giá mã / kiến ​​trúc sớm trước khi mọi thứ sẵn sàng, giúp gỡ lỗi hoặc cho ai đó đang đi nghỉ để đặt công việc được thực hiện một phần nơi người khác có thể làm việc đó. Đối với các nhánh tính năng, tôi sẽ chỉ đặt những thứ như linters và như các hook pre-commit.
bradym

2

Không có công cụ nào có thể đảm bảo không có hồi quy - điều đó phụ thuộc nhiều vào các bài kiểm tra của bạn hơn là công cụ thực hiện chúng. Tuy nhiên, bạn có thể giúp ngăn chặn các hồi quy sẽ bị bắt khi tham gia vào nhánh tích hợp. Bạn có thể thực hiện việc này với các móc nối trước, nhưng thường dễ dàng hơn với các yêu cầu kéo (hy vọng bạn đã sử dụng để đánh giá mã ngang hàng).

Nếu một nhánh được cập nhật với dòng ngược của nó (nơi PR được hợp nhất) và các thử nghiệm của nó vượt qua, thì chúng vẫn sẽ vượt qua sau khi hợp nhất; trạng thái của nhánh đích sau khi hợp nhất sẽ khớp với trạng thái của nhánh nguồn trước khi hợp nhất.

Nhìn chung, điều này không đặc biệt khó khăn (tùy thuộc vào các công cụ được sử dụng) để chỉ ra cả liệu nhánh nguồn trong PR có được cập nhật với mục tiêu hay không và liệu nó có xây dựng CI không. Bạn có thể sử dụng điều này như một yêu cầu (theo chính sách và / hoặc được thi hành trong phần mềm) để hợp nhất yêu cầu kéo.


"Nếu một chi nhánh được cập nhật với thượng nguồn của nó (nơi PR được hợp nhất) và các thử nghiệm của nó vượt qua, thì chúng vẫn sẽ vượt qua sau khi hợp nhất" - Tại sao? Hợp nhất là một sự gián đoạn, nó mang lại những điều chưa biết. Giống như xung đột - mã thậm chí có thể không được xây dựng cho đến khi chúng được giải quyết. Bạn cần chạy thử nghiệm và xác nhận rằng chúng vượt qua cho bất kỳ hợp nhất chi nhánh. Tôi muốn nói ngay cả đối với một người chuyển tiếp nhanh, nếu bạn muốn chơi nó an toàn. Xem apartsw.com/insights/2016/11/16/ cường
Dan Cornilescu

Ừm, vâng, đảm bảo như vậy là có thể, kiểm tra câu trả lời của tôi. Vâng, có lẽ tôi nên làm rõ: bằng hồi quy, ý tôi là kết quả tồi tệ hơn là kết quả cơ sở của chi nhánh (và bỏ qua khả năng dương tính giả, những điều đó cần được giải quyết vì chúng có thể làm lệch đường cơ sở, làm hỏng toàn bộ sự việc và cần có sự can thiệp của con người). Tiêu cực sai liên tục chỉ là một phiền toái, làm chậm mọi thứ, nhưng có thể được xử lý.
Dan Cornilescu

Bạn không thể đảm bảo không có hồi quy, bạn chỉ có thể đảm bảo không có hồi quy được phát hiện. Nếu một thay đổi gây ra hồi quy không bị bắt bởi một bài kiểm tra, thì đó là một hồi quy mà công cụ CI không thể đảm bảo. Và trong khi hợp nhất hai bộ thay đổi không mang lại ẩn số, bạn có thể chọn thực hiện điều đó trong nhánh tính năng (bằng cách hợp nhất ngược dòng vào) trước khi hợp nhất hướng khác. Nếu nguồn được cập nhật với mục tiêu, đó là một sự hợp nhất đơn giản (chuyển tiếp nhanh) và sau đó trạng thái đích sẽ giống hệt với trạng thái nguồn trước khi hợp nhất, do đó nếu các thử nghiệm được thông qua trước, chúng sẽ vượt qua sau đó.
Adrian

Tách lông. Công cụ CI có thể được cấu hình với một bài kiểm tra để phát hiện và do đó bảo vệ chống lại bất kỳ hồi quy nào bạn quan tâm. Tôi sẽ không tranh luận quá nhiều về việc sáp nhập - mục tiêu của tôi là tránh chúng càng nhiều càng tốt, chúng chỉ là rắc rối chung :)
Dan Cornilescu

Quan điểm của tôi là nó không phải là công cụ CI cung cấp sự bảo vệ đó, đó là bạn, bằng cách viết các bài kiểm tra. Công cụ CI không thể cung cấp bất kỳ đảm bảo nào ngoài các thử nghiệm bạn cung cấp.
Adrian

1

Các công cụ tích hợp liên tục thực sự (trái ngược với chỉ kiểm tra liên tục) như Reitveld và Zuul có thể giúp ích, mặc dù chúng chỉ tốt như các bài kiểm tra bạn viết và đánh giá mã bạn làm.


Nhưng Reitveld dường như là một công cụ đánh giá mã hợp tác, không phải là công cụ CI, tôi có thiếu điều gì không? Đây là những gì tôi đã xem: github.com/rietveld-codereview/rietveld
Dan Cornilescu

Zuul dường như thực sự có liên quan, tôi sẽ nghiên cứu kỹ hơn.
Dan Cornilescu ngày

Nó không thực hiện kiểm tra nhưng nó xử lý một số khía cạnh của quản lý chi nhánh, hoạt động như một hệ thống người gác cổng, đây là cách tốt nhất để giữ mã xấu không xâm nhập bằng cách chặn hợp nhất.
coderanger ngày

Tôi hiểu ý bạn là gì. Chà, nó có thể giúp với chất lượng mã tổng thể, nhưng bản thân nó không mang lại bất kỳ sự đảm bảo nào. Hai thay đổi hoàn toàn tốt vượt qua tất cả các xác minh QA một cách độc lập vẫn có thể gây ra sự cố khi chúng gặp nhau trong chi nhánh.
Dan Cornilescu ngày

1

Sử dụng GitLAB, bạn có thể đặt trong cài đặt dự án để chỉ cho phép hợp nhất khi đường ống thành công, do đó, có thể có Tích hợp liên tục thực sự, kết hợp với việc thêm QA của bạn vào danh sách phê duyệt hợp nhất và với Môi trường động, bạn có thể đảm bảo chất lượng trước khi bạn hợp nhất với chủ.


Điều đó hoạt động nhưng chỉ khi bạn không cho phép hợp nhất thứ 2 để bắt đầu kiểm tra QA trước khi hợp nhất trước đó được hoàn thành, nếu không, hợp nhất thứ 2 sẽ không nhìn thấy hợp nhất thứ nhất, để lại chỗ cho hồi quy. Nói cách khác, các sự hợp nhất (bao gồm cả kiểm tra QA của họ) phải được tuần tự hóa hoàn toàn, không quy mô cho các đội lớn.
Dan Cornilescu

0

ApartCI là một hệ thống CI được thiết kế chính xác để ngăn chặn hồi quy, do đó đảm bảo mức chất lượng phẳng hoặc tăng chi nhánh. Vẫn đang trong giai đoạn thử nghiệm.

Nó phối hợp xác minh tiền cam kết tập trung theo cách để đảm bảo rằng thay đổi chỉ được thực hiện sau khi được xác minh, cùng với tất cả các thay đổi khác được cam kết trước đó, để đáp ứng hoặc vượt quá mức chất lượng chi nhánh mới nhất.

Đây là điểm khác biệt chính so với các xác minh trước cam kết do nhà phát triển truyền thống, thường được thực hiện song song, để lại chỗ cho các hồi quy gây ra bởi việc can thiệp các thay đổi không bao giờ được thử nghiệm cùng nhau.

Công cụ này cũng được thiết kế để dễ dàng mở rộng quy mô - có khả năng duy trì tỷ lệ thay đổi ứng viên đến rất cao và hỗ trợ 100/1000 nhà phát triển làm việc trong cùng một nhánh tích hợp.

Tuyên bố miễn trừ trách nhiệm: Tôi là tác giả của công cụ và người sáng lập công ty cung cấp nó. Xin lỗi cho quảng cáo.


Thật tốt khi bạn thêm từ chối trách nhiệm, nhưng cá nhân tôi xem xét việc đặt câu hỏi và tự trả lời bằng cách quảng cáo công ty hoặc sản phẩm của riêng bạn là một dạng thư rác.
THelper

Tôi đã hỏi một câu hỏi về meta liệu điều này có được phép hay không: meta.devops.stackexchange.com/q/59
THelper

SnapCI cũng đã làm điều này. YÊN NGHỈ.
paul_h

@paul_h, trừ khi tôi thiếu một cái gì đó SnapCI và GoCD thay thế được đề xuất của nó đều dựa trên các xác minh sau cam kết (được kích hoạt bằng cách bỏ phiếu SCM), vì vậy chúng vẫn chỉ theo dõi. Ngoại trừ có thể đối với kiểm tra PR, nhưng trừ khi các kiểm tra này được đăng tuần tự hoàn toàn, họ chỉ có thể giảm tỷ lệ xảy ra hồi quy, nhưng không loại bỏ hoàn toàn.
Dan Cornilescu

Dan, không bỏ phiếu không, móc. Và đến một nhánh PR tồn tại trong thời gian ngắn chưa được sáp nhập vào thân cây / chủ - trunkbaseddevelopment.com/game-changers/ trộm
paul_h
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.