Giải thích đơn giản về tích hợp liên tục


32

Làm thế nào bạn có thể xác định Tích hợp liên tục và máy chủ CI chứa những thành phần cụ thể nào?

Tôi muốn giải thích với ai đó trong bộ phận tiếp thị về Tích hợp liên tục là gì. Họ hiểu kiểm soát nguồn - tức là họ sử dụng Subversion. Nhưng tôi muốn giải thích cho họ biết CI là gì. Bài viết Wikipedia không bao giờ định nghĩa chính xác nó, bài viết của Martin Fowler chỉ đưa ra những điều sau đây, về cơ bản là một tautology theo sau là một lời giải thích mơ hồ về 'tích hợp':

Tích hợp liên tục là một thực tiễn phát triển phần mềm trong đó các thành viên của nhóm tích hợp công việc của họ thường xuyên, thường là mỗi người tích hợp ít nhất mỗi ngày - dẫn đến nhiều tích hợp mỗi ngày. Mỗi tích hợp được xác minh bằng bản dựng tự động (bao gồm kiểm tra) để phát hiện lỗi tích hợp nhanh nhất có thể.

Cập nhật : Tôi đã gửi cho họ hình ảnh này, tôi không thể tìm thấy một hình ảnh đơn giản hơn.

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

Cập nhật 2 : Phản hồi từ chap tiếp thị (trong thời gian có 3 câu hỏi):

Tôi thực sự thích cả 3 câu trả lời - vì những lý do khác nhau. Tôi cảm thấy như đăng nhập chỉ để cảm ơn tất cả!

Rõ ràng là anh ta không thể - vì vậy cảm ơn thay mặt anh ta :)

Cập nhật 3 : Tôi đã nhận ra khi xem bài viết trên Wikipedia rằng nó có chứa các nguyên tắc , khi bạn chỉ lấy tiêu đề, là một danh sách khá hay:

  1. Duy trì kho lưu trữ mã
  2. Tự động hóa việc xây dựng
  3. Tự xây dựng bản thử nghiệm
  4. Mọi người đều cam kết cơ bản mỗi ngày
  5. Mỗi cam kết (theo đường cơ sở) nên được xây dựng
  6. Giữ cho xây dựng nhanh
  7. Thử nghiệm trong một bản sao của môi trường sản xuất
  8. Làm cho nó dễ dàng để có được giao hàng mới nhất
  9. Mọi người đều có thể xem kết quả của bản dựng mới nhất
  10. Tự động triển khai

3
oO Bộ phận tiếp thị của bạn sử dụng Subversion? Bị cám dỗ bỏ phiếu để đóng là "Quá cục bộ" ... ;-)
Jeroen

@Jeroen Yep, thực sự, cho các tập tin trên trang web. Tôi đã làm cho chúng một nút lớn màu đỏ đẹp trên một trang web có nội dung 'Thực hiện' để cập nhật lật đổ trên máy chủ. :)
icc97

Câu trả lời:


27

Khi ai đó thay đổi các tệp tạo nên sản phẩm phần mềm và sau đó cố gắng kiểm tra chúng (nói cách khác, cố gắng tích hợp các thay đổi vào mã sản phẩm chính), bạn muốn đảm bảo rằng sản phẩm phần mềm vẫn có thể được xây dựng thành công.

Thường có một hệ thống bên ngoài, được gọi là máy chủ CI , theo định kỳ hoặc trên mỗi thay đổi, sẽ lấy các tệp nguồn từ kiểm soát phiên bản và cố gắng xây dựng sản phẩm (biên dịch / kiểm tra / gói). Nếu máy chủ CI có thể thực hiện xây dựng thành công, các thay đổi đã được tích hợp thành công.

Máy chủ CI cũng phải có khả năng phát nếu quá trình xây dựng thất bại hoặc thành công, vì vậy các hệ thống như Jenkins (một trong những máy chủ CI được sử dụng nhiều nhất hiện nay) sẽ có cách để gửi email / văn bản cũng như giao diện web giống như bảng điều khiển với rất nhiều thông tin về các bản dựng hiện tại và quá khứ, những người đã đăng ký mã, khi mọi thứ bị hỏng, v.v. (Trên hình ảnh của bạn ở trên, đây sẽ là Cơ chế phản hồi .)

CI rất quan trọng, vì nó đảm bảo rằng trên cơ sở liên tục, bạn có một sản phẩm hoạt động. Điều này rất quan trọng đối với tất cả các nhà phát triển đang làm việc trên sản phẩm phần mềm cũng như cho tất cả những người muốn có quyền truy cập vào các bản phát hành hàng ngày của sản phẩm phần mềm, như QA.


1
Tích hợp liên tục quan tâm đến tình trạng xây dựng, nhưng cũng về các bài kiểm tra.
Quentin Pradet

1
và triển khai, nó không đủ để biên dịch và chạy thử nghiệm, nhưng bạn cũng nên gửi các nhị phân đến một môi trường để nó có thể được kiểm tra bởi mọi người (hoặc các công cụ tự động).
gbjbaanb

1
Vì câu hỏi yêu cầu một lời giải thích đơn giản, tôi đã bỏ qua nhiều chi tiết (hầu hết thời gian của dự án / nhóm cụ thể) có thể đi vào hệ thống CI.
c_maker

Điều này có phụ thuộc vào sự phát triển dựa trên thử nghiệm không? Mã biên dịch không phải lúc nào mã cũng hoạt động đúng không? Nếu không có kiểm tra thất bại khi mã chưa sẵn sàng, làm thế nào hệ thống CI sẽ biết liệu mã có thực sự được tích hợp thành công không?
mowwwalker

1
@ user828584: Trong câu trả lời của tôi, tôi ngụ ý rằng 'thử nghiệm' là một phần của bản dựng. Và như một lưu ý phụ, TDD khác với việc kiểm tra chất lượng. Là một tác dụng phụ của TDD, bạn sẽ có các bài kiểm tra viết tốt, nhưng bạn có thể có các bài kiểm tra mà không cần thực hiện bất kỳ TDD nào cả.
c_maker

33

Tôi đoán đối với bộ phận tiếp thị của bạn, việc CI hoạt động như thế nào không quan trọng , nhưng CI có ý nghĩa gì đối với các bản phát hành mới của phần mềm của bạn .

CI sẽ lý tưởng có nghĩa là bạn có thể sản xuất một phiên bản phần mềm mới có khả năng phát hành hàng ngày, sẵn sàng để được trình bày hoặc bán cho khách hàng của bạn, với một số tính năng, chức năng hoặc sửa lỗi mới được thêm vào. Điều đó không có nghĩa là bạn phải cung cấp phiên bản mới mỗi ngày, nhưng bạn có thể nếu bạn muốn.

Ví dụ: nếu bạn có một bộ tính năng mới dự kiến ​​được phát hành chính thức cho phiên bản "2015" của phần mềm và bạn có các phần của bộ tính năng đó đã được mã hóa và tích hợp ngay hôm nay, những người tiếp thị có thể lấy phiên bản hiện tại của bạn phần mềm và hiển thị nó - ít nhiều an toàn - tại hội nghị tiếp theo vào năm 2013. Không có CI, họ phải yêu cầu nhóm của bạn đóng băng mã không có kế hoạch, mọi thành viên trong nhóm phải tích hợp tính năng nửa nướng mà anh ta đang làm việc vào sản phẩm, họ có thể không có đủ các thử nghiệm tự động sẵn sàng và đoán xem điều gì sẽ xảy ra tại hội nghị - "phiên bản alpha" của phiên bản 2015er của bạn sẽ có nguy cơ bị sập cao hơn nhiều, đặc biệt là khi các tính năng mới được trình diễn.


4
+1 để tiếp cận nó từ góc độ lợi ích mà nó cung cấp.
chọc

17

Bạn không thể biết CI là gì trừ khi bạn biết chúng ta đã từng làm gì. Hãy tưởng tượng một hệ thống có 3 phần. Có một UI thu thập dữ liệu và đưa nó vào cơ sở dữ liệu. Có một hệ thống báo cáo tạo báo cáo từ cơ sở dữ liệu. Và có một số loại máy chủ theo dõi cơ sở dữ liệu và gửi thông báo qua email nếu các tiêu chí nhất định được đáp ứng.

Từ lâu điều này sẽ được viết như sau:

  1. Đồng ý về lược đồ cho cơ sở dữ liệu và các yêu cầu - việc này sẽ mất vài tuần vì nó phải hoàn hảo vì bạn sẽ sớm thấy tại sao
  2. Chỉ định 3 nhà phát triển hoặc 3 nhóm nhà phát triển độc lập cho 3 phần
  3. Mỗi nhà phát triển sẽ làm việc trên mảnh của họ và kiểm tra mảnh của họ bằng cách sử dụng bản sao cơ sở dữ liệu của họ, trong nhiều tuần hoặc nhiều tháng.

Trong thời gian này, các nhà phát triển sẽ không chạy mã của nhau, cũng không thử sử dụng phiên bản cơ sở dữ liệu đã được tạo bởi mã của người khác. Người viết báo cáo sẽ chỉ cần thêm một loạt các dữ liệu mẫu. Người viết cảnh báo sẽ thêm các bản ghi mô phỏng các sự kiện báo cáo. Và người viết GUI sẽ nhìn vào cơ sở dữ liệu để xem GUI đã thêm gì. Theo thời gian, các nhà phát triển sẽ nhận ra thông số kỹ thuật bị sai theo một cách nào đó, chẳng hạn như không chỉ định chỉ mục hoặc có độ dài trường quá ngắn và "sửa" điều đó trong phiên bản của họ. Họ có thể nói với những người khác, những người có thể hành động, nhưng thường thì những điều này sẽ được đưa vào danh sách sau.

Khi cả ba phần được mã hóa hoàn toàn và được kiểm tra bởi các nhà phát triển của họ và đôi khi thậm chí được kiểm tra bởi người dùng (hiển thị cho họ một báo cáo, màn hình hoặc thông báo email) sẽ đến giai đoạn "tích hợp". Điều này thường được ngân sách ở một vài tháng nhưng vẫn sẽ đi qua. Sự thay đổi độ dài trường theo dev 1 sẽ được phát hiện ở đây và sẽ yêu cầu dev 2 và 3 thực hiện các thay đổi mã lớn và có thể cả UI cũng thay đổi. Chỉ số bổ sung đó sẽ tàn phá chính nó. Và như vậy. Nếu một trong những nhà phát triển được người dùng yêu cầu thêm một trường và đã làm, thì bây giờ sẽ là lúc hai người kia cũng phải thêm nó.

Giai đoạn này rất đau đớn và không thể dự đoán được. Vì vậy, mọi người bắt đầu nói "chúng ta phải hòa nhập thường xuyên hơn." "Chúng tôi phải làm việc cùng nhau ngay từ đầu." "Khi một trong số chúng tôi đưa ra yêu cầu thay đổi [đó là cách chúng tôi đã nói chuyện] thì những người khác phải biết về nó." Một số nhóm bắt đầu thực hiện các bài kiểm tra tích hợp trước đó trong khi tiếp tục làm việc riêng. Và một số đội bắt đầu sử dụng mã của nhau và xuất ra mọi lúc, ngay từ đầu. Và điều đó đã trở thành tích hợp liên tục.

Bạn có thể nghĩ rằng tôi đang phóng đại câu chuyện đầu tiên đó. Tôi đã làm một số công việc cho một công ty một lần khi liên hệ của tôi nhai tôi để kiểm tra một số mã bị lỗi sau:

  • một màn hình mà anh ta không làm việc có một nút chưa làm gì cả
  • không có người dùng nào đã đăng xuất trên thiết kế màn hình (màu sắc và phông chữ chính xác; sự tồn tại của màn hình, khả năng của nó và những nút nào có trong thông số 300 trang.)

Đó là ý kiến ​​của anh ấy rằng bạn không đặt công cụ vào kiểm soát nguồn cho đến khi nó là XONG. Anh ấy thường làm một hoặc hai lần đăng ký một NĂM. Chúng tôi đã có một chút khác biệt về triết lý :-)

Ngoài ra, nếu bạn cảm thấy khó tin rằng các nhóm sẽ bị ngắt kết nối xung quanh một tài nguyên được chia sẻ như cơ sở dữ liệu, bạn thực sự sẽ không tin (nhưng đó là sự thật) rằng cách tiếp cận tương tự đã được thực hiện để mã hóa. Bạn sẽ viết một chức năng tôi có thể gọi? Thật tuyệt, hãy tiếp tục và làm điều đó, tôi sẽ chỉ mã hóa những gì tôi cần trong lúc này. Nhiều tháng sau tôi sẽ "tích hợp" mã của mình để nó gọi API của bạn và chúng tôi sẽ phát hiện ra nó sẽ nổ tung nếu tôi vượt qua null, tôi sẽ nổ tung nếu nó trả về null (và nó rất nhiều) nó trả về những thứ quá lớn đối với tôi, nó không thể xử lý năm nhuận và hàng ngàn thứ khác. Làm việc độc lập và sau đó có một giai đoạn tích hợp là bình thường. Bây giờ nghe có vẻ điên rồ.


2
Chúng tôi đã có một câu chuyện tương tự trong đó chúng tôi đã nâng cấp một ứng dụng tùy chỉnh được xây dựng trên SP 2003 lên SP 2007. Sử dụng VSS (vâng, VSS :), mỗi nhà phát triển đã kiểm tra một phần tệp của họ, được mã hóa trong một và hai tuần, sau đó khi chúng tôi tích hợp mã của chúng tôi, bùng nổ, rằng khi vấn đề bắt đầu kể từ khi mã của chúng tôi sai lệch đáng kể. Chúng tôi đã khắc phục vấn đề tích hợp trong một tháng và dự án đã thuê một khách sạn để chứa những người sống rất xa vào các ngày trong tuần. Vào ngày đó, tôi đã học cách tích hợp mã hàng ngày :-)
OnesimusUnbound

@OnesimusUnbound Tôi nhớ đã bị va chạm từ VSS đến Clearcase ... ra khỏi chảo. Nhiều năm sau khi trở lại cùng một công ty để uống, tôi nhớ ai đó đã cười nhạo một nhà phát triển đồng nghiệp vì đã đề cập đến kiểm soát nguồn mới này có tên là 'Git', "Chúng ta cần một hệ thống kiểm soát nguồn khác để làm gì ??".
icc97

1
Cảm ơn bạn - tôi đã cố gắng hiểu CI trước đây đơn giản vì tôi không biết phương án thay thế là gì
Rhys

Hấp dẫn. Đối với tôi, điều này nghe giống như so sánh CI với thác nước. Nhưng bạn có thể sử dụng một phương pháp không thác nước để tránh những vấn đề này (như phát triển lặp) và không sử dụng CI.
Dan Mould

@DanMoulding nếu tôi nhanh nhẹn và lặp đi lặp lại và không có gì trong phần lớn hơn của tôi không được tích hợp với những gì người khác đang làm, tôi không làm CI. Heck, bạn có thể thác nước và CI. Thiết kế tất cả, mã hóa tất cả, kiểm tra tất cả nếu bạn muốn - nếu mọi người đều sử dụng bố cục mã / lược đồ / tệp của mọi người mọi lúc, đó là CI ngay cả khi bạn đang sử dụng thác nước. Kết nối là không có CI, bạn sống và chết bởi BDUF vì đó là hy vọng duy nhất của bạn (và hóa ra đó là một hy vọng mờ nhạt) về việc có một giai đoạn tích hợp có độ dài hợp lý. Việc thông qua CI cho phép chúng tôi từ bỏ BDUF.
Kate Gregory
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.