Làm thế nào CI có thể được sử dụng cho các ngôn ngữ thông dịch?


23

Tôi chưa bao giờ sử dụng hệ thống Tích hợp liên tục (CI) trước đây. Tôi chủ yếu viết mã bằng MATLAB, Python hoặc PHP. Cả hai đều không có bước xây dựng và tôi không thấy CI có thể được sử dụng như thế nào cho công việc của tôi. Một người bạn trong một dự án lớn trong một công ty lớn nói với tôi rằng ngôn ngữ không thành vấn đề.

Tôi không thấy CI sẽ được sử dụng như thế nào nếu tôi không có bước xây dựng. Tôi có thể nghĩ về CI như một môi trường thử nghiệm sẽ chạy thử nghiệm đơn vị. Tui bỏ lỡ điều gì vậy?



14
Điều này có đúng hay không phụ thuộc vào những gì bạn cho là "bước xây dựng". Bạn dường như nghĩ về nó như chỉ là phần tổng hợp tối thiểu, để cung cấp cho bạn một cái gì đó có thể chạy được. Trong nhóm của tôi, chúng tôi coi việc xây dựng là biên dịch, phân tích tĩnh và kiểm tra đơn vị (có chỗ cho nhiều nhiệm vụ hơn). Định nghĩa này có lợi thế là một cam kết không thử nghiệm đơn vị không "xây dựng" và không được phép vào repo để bắt đầu.
Chris Hayes

Mở rộng theo quan điểm của Chris, một hệ thống CI có thể và nên kiểm tra bất kỳ và tất cả các thử nghiệm tự động - biên dịch và liên kết có thể được xem là một dạng thử nghiệm tự động. Nếu bạn có các hạn chế về tài nguyên, một số thử nghiệm chậm hơn chỉ có thể chạy trên các bản dựng hàng đêm hoặc thậm chí các bản dựng cuối tuần, nhưng CI sẽ chạy chúng. Hãy tự hỏi mình điều này: Tại sao bạn muốn tự động hóa các bài kiểm tra nhưng vẫn chạy các bài kiểm tra tự động bằng tay?
Peter - Unban Robert Harvey

Câu trả lời:


32

Tích hợp liên tục như một thuật ngữ đề cập đến hai ý tưởng riêng biệt.

Đầu tiên là một quy trình công việc: thay vì mọi người trong nhóm làm việc trong chi nhánh của chính họ và sau một vài tuần lập trình cố gắng hợp nhất các thay đổi của họ vào dòng chính, những thay đổi đó được tích hợp (gần như) liên tục. Điều này cho phép các vấn đề nổi lên sớm và tránh những thay đổi không tương thích. Tuy nhiên, điều đó đòi hỏi chúng ta có thể dễ dàng kiểm tra xem một thay đổi có hoạt động hay không.

Đây là nơi mà ý tưởng thứ hai xuất hiện, hóa ra phổ biến hơn nhiều. Máy chủ CI là một môi trường sạch, nơi các thay đổi được kiểm tra càng nhanh càng tốt. Môi trường sạch sẽ là cần thiết để xây dựng có thể tái sản xuất. Nếu nó hoạt động một lần, nó sẽ luôn hoạt động. Điều này tránh được nhưng nó đã giải quyết được các vấn đề về máy của tôi. Đặc biệt, máy chủ CI có giá trị khi phần mềm của bạn chạy trên các hệ thống khác nhau hoặc trong các cấu hình khác nhau và bạn cần chắc chắn mọi thứ đều hoạt động.

Việc thiếu một bước xây dựng là không liên quan. Tuy nhiên, CI chỉ có ý nghĩa nếu bạn có một bộ thử nghiệm. Bộ kiểm tra này phải tự động và không được có lỗi. Nếu các thử nghiệm thất bại, nhà phát triển phù hợp sẽ nhận được thông báo để họ có thể khắc phục sự cố mà họ đã giới thiệu (phá vỡ bản dựng, ngay cả khi không có bản dựng nào dưới dạng biên dịch).

Nó chỉ ra rằng một máy chủ như vậy có giá trị không chỉ là thử nghiệm. Trên thực tế, hầu hết các phần mềm CI thực sự rất nhảm khi chạy thử nghiệm ở các cấu hình khác nhau, nhưng giỏi trong việc quản lý tất cả các loại công việc. Ví dụ, ngoài các bài kiểm tra đơn vị liên tục, có thể có một bài kiểm tra đầy đủ như một bản dựng hàng đêm. Phần mềm có thể được kiểm tra với nhiều phiên bản Python, các phiên bản thư viện khác nhau. Một trang web có thể được kiểm tra các liên kết chết. Chúng tôi có thể chạy phân tích tĩnh, kiểm tra kiểu, công cụ kiểm tra phạm vi, vv qua mã. Tài liệu có thể được tạo ra. Khi tất cả các bộ kiểm tra vượt qua, quy trình đóng gói có thể được bắt đầu để bạn sẵn sàng phát hành phần mềm của mình. Điều này hữu ích trong cài đặt nhanh, nơi bạn muốn có một sản phẩm có thể triển khai (và có thể demo) mọi lúc. Với sự phát triển của các ứng dụng web, cũng có ý tưởng triển khai liên tục: Nếu tất cả các thử nghiệm vượt qua, chúng tôi có thể tự động đẩy các thay đổi vào sản xuất. Tất nhiên, điều này đòi hỏi bạn phải thực sự tự tin trong bộ thử nghiệm của mình (nếu không, bạn có vấn đề lớn hơn).


3
"CI chỉ có ý nghĩa nếu bạn có bộ kiểm thử" - lưu ý rằng đối với ngôn ngữ được biên dịch, chính trình biên dịch là bộ kiểm tra thô sơ bắt được nhiều lỗi phổ biến.
dùng253751

@immibis Tôi nghĩ rằng đó không phải là về biên dịch so với diễn giải, mà là về việc gõ tĩnh. Một ngôn ngữ với hệ thống kiểu tĩnh có thể tự động chứng minh các thuộc tính chính xác nhất định. Điều này thậm chí còn tốt hơn các bài kiểm tra chỉ hoạt động bằng các ví dụ. Vấn đề phổ biến duy nhất được tìm thấy bởi máy chủ CI khi thực hiện biên dịch là một nhà phát triển quên không cam kết một tệp mới; trong tất cả các trường hợp khác, chúng tôi không thực sự cần máy chủ CI và chỉ có thể biên dịch cục bộ để kiểm tra lỗi.
amon

1
@amon Không đúng. Nó không phải là đặc biệt hiếm khi thực hiện một thay đổi vào phút cuối và sau đó quên kiểm tra trình biên dịch trước khi cam kết. Nó cũng bắt gặp sự cố khi bạn thêm phụ thuộc vào thứ gì đó bạn đã cài đặt toàn cầu nhưng không được cài đặt ở bất kỳ nơi nào khác.
jpmc26

24

Đúng, bạn không có nhu cầu đặc biệt về hệ thống CI để thực hiện các bản dựng và kiểm tra xem các bản dựng đó có đúng không, nhưng đó chỉ là một phần của những gì CI hướng đến.

Mục đích của CI là phát hiện lỗi càng sớm càng tốt, vì nói chung, lỗi càng sớm thì càng rẻ để sửa. Cuối cùng, trong trường hợp không cần bước xây dựng, hệ thống CI vẫn có thể tự động hóa việc sử dụng các công cụ phân tích mã, triển khai đến môi trường thử nghiệm, đơn vị / tích hợp / hồi quy / thử nghiệm khác mà bạn có thể tự động hóa và bất kỳ bước nào khác bạn có thể tự động thực hiện để kiểm tra lỗi.


8
Tôi muốn thêm: cách rõ ràng nhất để kiểm tra hệ thống một cách tự nhiên là tự động thực thi nó. Ví dụ: bạn có thể kiểm tra một trang web bằng các công cụ như JMeter hoặc Selenium.
Revierpost

7

Tích hợp liên tục thực hiện nhiều hơn một biên dịch mã. Nếu đó là tất cả những gì nó đã làm, thì chúng ta sẽ không cần quá nhiều công cụ cho nó!

Một số nhiệm vụ khác tôi có thể nghĩ ra rằng một đường ống tích hợp liên tục thường thực hiện:

  • Thực hiện kiểm tra tự động. (Python có rất nhiều thư viện kiểm thử tự động và PHP có ít nhất một số. Tôi không thể nói chuyện với MATLAB.)
  • Gói phần mềm để phân phối. Bằng cách tự động hóa quá trình này, bạn đảm bảo rằng nó được thực hiện theo cách chính xác, nhất quán, có thể lặp lại mỗi lần. Không có bước nào sẽ bị lãng quên; tạo ra một gói phân phối như vậy mất tối đa một cú nhấp chuột. (Gói ứng dụng Python của bạn dưới dạng bánh xe là một ý tưởng tuyệt vời!)
  • Gắn thẻ mốc cam kết. Bất cứ khi nào bạn xây dựng một gói để sản xuất, bạn có thể muốn gắn thẻ nó.
  • Số phiên bản tự động tăng. Thông thường, đây chỉ là số "bản dựng" chứ không phải là phần có ý nghĩa hơn, nhưng thật tuyệt khi xác định duy nhất một bản dựng cụ thể, vì vậy bạn biết những gì được triển khai ở đâu.

Đi xa hơn một chút đến đường biên giới của "hội nhập liên tục" theo nghĩa chặt chẽ, bạn cũng có thể thực hiện những điều sau:

  • Có một quy trình tự động để thiết lập một hệ điều hành và cài đặt các phụ thuộc của bạn.
  • Tự động triển khai các bản sao của phần mềm (chủ yếu hữu ích cho các ứng dụng web hoặc phần mềm được phân phối bởi người quản lý gói). Một số nhóm thực sự sử dụng điều này để triển khai để sản xuất (phân phối liên tục), nhưng ngay cả khi bạn không, bạn vẫn có thể tận dụng điều này để triển khai các bản sao mã không sản xuất thêm. Đối với một số dự án nơi tôi làm việc, chúng tôi có một bản sao để các nhà phát triển kiểm tra mã của họ trước khi cung cấp cho QA, bản sao cho QA để kiểm tra và bản sao "ổn định" hơn cho mục đích demo.

Vấn đề chỉ đơn giản là thế này: có những nhiệm vụ bạn phải định kỳ thực hiện trong quá trình phát triển phần mềm bên cạnh việc chỉ viết mã. Bằng cách tự động hóa các tác vụ này và để chúng chạy trên máy chủ, bạn sẽ có được

  • Quy trình nhất quán (Bạn sẽ không có Stan và Sally làm những việc khác nhau.)
  • Kiến thức về các quy trình được ghi trong mã (Bất kỳ ai có thể đọc các tập lệnh đều có thể tìm hiểu các bước liên quan đến việc triển khai, thay vì Sally là người duy nhất thực hiện hoặc biết cách.)
  • Sao chép đơn giản các quy trình (Đơn giản để triển khai nhiều bản sao của trang web: bạn chỉ cần cung cấp một cấu hình mới!)
  • Kiểm tra kỹ lưỡng hơn (Bob chỉ kiểm tra trang của anh ấy, nhưng những thay đổi của anh ấy đã phá vỡ trang của Sally. Sally quên cam kết một tệp. Stan đã thêm một phụ thuộc mới phải được cài đặt cùng với ứng dụng nhưng không nhận ra vì nó được IDE tự động cài đặt . Tôi đã thấy tất cả những thứ này ở dạng này hay dạng khác.)

Và có lẽ một số lợi ích khác thậm chí không xuất hiện trong tâm trí.


Cảm ơn bạn đã trả lời. Các ví dụ rất tuyệt. Tôi ước tôi có thể bỏ phiếu nhiều hơn một câu trả lời như được chấp nhận: - /
Lord Loh.

@LordLoh. Đừng lo lắng. Tôi chỉ vui mừng vì tôi có thể giúp đỡ. =) Cảm ơn đã cho tôi biết.
jpmc26

1
Nâng cao, trả lời xuất sắc. Giống như bất cứ điều gì, nếu thực hiện kém, bạn có thể không gặt hái được những lợi ích được quảng cáo. Tính nhất quán của EG, kiến ​​thức về quy trình, sự đơn giản đều có thể bị ảnh hưởng nếu bạn tập luyện quá sức. Vì vậy, ... đánh giá nhu cầu của bạn một cách thực tế và Godspeed!
brian_o

1

Bạn có thể không cần biên dịch các giải pháp, nhưng CI vẫn có thể giúp bạn bằng cách thay đổi các tệp cấu hình / đường dẫn thư mục, v.v. và nếu bạn ở trong một nhóm thúc đẩy các thay đổi thành trạng thái prod và triển khai chúng

Giả sử bạn triển khai mã Python của mình đến 5 máy chủ QA khác nhau và cần nó trỏ đến các cơ sở dữ liệu QA khác nhau, sau đó khi chạy thử tự động (được kích hoạt bởi CI), thúc đẩy xây dựng để sản xuất và triển khai nó ở đó với các thay đổi cấu hình phù hợp cho mọi máy chủ sản xuất .

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.