Tích hợp liên tục – Continuous Integration (CI) – Phần 1

By | 25 December, 2018

Trong hướng dẫn này, bạn sẽ tìm hiểu về tất cả mọi thứ Tích hợp liên tục, (CI) cách nó liên kết với Triển khai liên tục (Continuous Deployment) và Phân phối liên tục (Continuous Delivery), cách bắt đầu với chúng. Khi bạn biết về nó, tôi sẽ nói chi tiết hơn về thực tiễn và quy trình công việc tốt nhất và sẽ cung cấp một danh sách kỹ lưỡng các nguồn tham khảo ở cuối.

Tích hợp liên tục là gì?

Tích hợp liên tục (CI) là quá trình tự động hóa việc xây dựng và kiểm tra code mỗi khi thành viên trong nhóm thực hiện các thay đổi đối với nơi quản lý code của họ (git, svn …). CI khuyến khích các nhà phát triển chia sẻ code và kiểm tra từng đơn vị của họ bằng cách hợp nhất các thay đổi của họ vào kho lưu trữ code dùng chung sau mỗi lần hoàn thành nhiệm vụ nhỏ. Commit code kích hoạt một hệ thống xây dựng tự động để lấy code mới nhất từ kho lưu trữ được chia sẻ, sau đó tiến hành build, test và xác thực code với toàn bộ nhánh chính (còn được gọi là trunk hoặc main).

Một trong những lợi ích chính của việc tích hợp thường xuyên là bạn có thể phát hiện lỗi nhanh chóng và xác định vị trí dễ dàng hơn. Vì mỗi thay đổi nhỏ, việc xác định chính xác thay đổi cụ thể đã gây ra lỗi có thể được phát hiện nhanh chóng.

Trong những năm gần đây, CI đã trở thành một best practice để phát triển phần mềm và được hướng dẫn bởi một bộ các nguyên tắc chính. Trong số đó là kiểm soát sửa đổi, xây dựng tự động hóa và thử nghiệm tự động.

Ngoài ra, Triển khai liên tục (CI) và phân phối liên tục (CD) đã được phát triển như là cách tốt nhất để giữ cho ứng dụng của bạn có thể triển khai tại bất kỳ thời điểm nào hoặc thậm chí tự động đẩy base code của bạn vào production bất cứ khi nào có thay đổi mới. Điều này cho phép nhóm của bạn phát triển nhanh trong khi vẫn giữ các tiêu chuẩn chất lượng cao có thể được kiểm tra tự động.

Tích hợp liên tục không loại bỏ các lỗi, nhưng nó giúp chúng dễ dàng tìm thấy và gỡ bỏ hơn.

– Martin Fowler , Nhà khoa học tại ThinkWorks

Sự khác biệt giữa Tích hợp liên tục, Triển khai liên tục & Phân phối liên tục là gì?

Tích hợp liên tục (Continuous Integration)

Là việc tích hợp các thay đổi từ các nhà phát triển khác nhau trong nhóm vào nhánh chính càng sớm càng tốt, trong trường hợp áp dụng tốt nhất vài lần một ngày. Điều này đảm bảo code nhà phát triển cá nhân làm việc không lãng phí quá nhiều thời gian. Khi bạn kết hợp quy trình với kiểm tra tự động, tích hợp liên tục có thể cho phép code của bạn trở lên đáng tin cậy.

Triển khai liên tục (Continuous Deployment)

Liên quan chặt chẽ đến Tích hợp liên tục và đề cập đến việc giữ cho ứng dụng của bạn có thể triển khai tại bất kỳ thời điểm nào hoặc thậm chí tự động phát hành đến môi trường thử nghiệm hoặc sản xuất nếu phiên bản mới nhất vượt qua tất cả các thử nghiệm tự động. Quá trình deploy lên production được thực hiện tự động hoàn toàn.

Phân phối liên tục (Continuous Delivery)

Là quá trình giữ cho code base của bạn có thể triển khai tại bất kỳ thời điểm nào. Ngoài việc đảm bảo ứng dụng của bạn vượt qua các bài kiểm tra tự động, nó phải cần tất cả các cấu hình cần thiết để đẩy nó vào production. Nhiều team sau khi thực hiện các thay đổi đẩy vượt qua các thử nghiệm tự động vào môi trường thử nghiệm hoặc production ngay lập tức để đảm bảo vòng lặp phát triển nhanh. Quá trình triển khai lên production được thực hiện thủ công.

phân phối liên tục-so với liên tục-triển khai

Phần 1: Hướng dẫn cho người mới bắt đầu tích hợp liên tục

Bạn nên tập trung vào việc thiết lập quy trình Tích hợp liên tục đơn giản càng sớm càng tốt.Nhưng đó không phải là nơi mọi thứ nên kết thúc. Mặc dù Tích hợp liên tục (CI) rất quan trọng, đó chỉ là bước đầu tiên trong quy trình. Bạn cũng muốn thiết lập Triển khai liên tục (CD), quy trình làm việc tự động hóa việc triển khai phần mềm của bạn và cho phép bạn tập trung vào việc xây dựng sản phẩm của mình.

Tích hợp liên tục (CI) so với triển khai liên tục (CD)

Như tôi đã chỉ ra trước đây, Triển khai liên tục có liên quan chặt chẽ với Tích hợp liên tục và đề cập đến việc giữ cho ứng dụng của bạn có thể triển khai tại bất kỳ thời điểm nào hoặc thậm chí tự động phát hành vào production nếu phiên bản mới nhất vượt qua tất cả các thử nghiệm tự động.

Nếu bạn muốn phát hành sản phẩm của mình thật nhanh, bạn nên tự động hóa toàn bộ quy trình làm việc của mình, không chỉ là thử nghiệm. Có một giải pháp Triển khai liên tục (CD) được thiết kế tốt và chạy trơn tru sẽ là chất kết dính giữa các công cụ bạn sử dụng, đặc biệt là giữa nhà cung cấp / máy chủ SCM (Quản lý kiểm soát nguồn) và môi trường lưu trữ bạn đang sử dụng. Điều này cũng sẽ giúp bạn tham gia vào nhóm mới và phát triển ngay cùng với nhóm của bạn vì họ đã dựa vào quy trình hoàn toàn tự động ngay từ ngày đầu.

Công cụ hoặc dịch vụ tích hợp và triển khai liên tục tốt nhất là gì? Làm thế nào để tôi chọn giữa chúng?

Có nhiều giải pháp ngoài kia. Nếu bạn chỉ muốn có một danh sách các công cụ, bạn có thể xem Codeship, TravisCI, SemaphoreCI, CircleCI, Jenkins, Bamboo, Teamcity hoặc nhiều công cụ khác.Bạn cũng có thể tìm thấy nhiều bài viết và thảo luận về chủ đề này với thông tin có giá trị như  bài này trên Quora . Có những cơ hội gần như vô tận ngoài kia. Nhưng rồi câu hỏi lại nổi lên: Làm thế nào để chọn giữa những thứ này?

Lựa chọn của bạn sẽ phụ thuộc vào:

  • Theo yêu cầu của bạn.
  • Trên nền tảng công nghệ mà bạn có.
  • Cách bạn xử lý công việc hàng ngày của bạn.

Như Moritz Plassnig, CEO của Codeship chỉ ra trên Quora , điều này thường giúp đưa ra một vài câu hỏi đơn giản trước và trả lời chúng trước khi chọn bất kỳ giải pháp nào. Điều này sẽ giúp bạn xác định giải pháp nào sẽ phù hợp nhất với bạn.

Tự vận hành so với các giải pháp được vận hành

Một trong những quyết định đầu tiên bạn phải đưa ra là liệu bạn muốn giải pháp Phần mềm dưới dạng dịch vụ (SaaS) được vận hành hay giải pháp tự vận hành.

Nếu bạn thích một giải pháp tự vận hành, bạn cần quản trị máy chủ của riêng bạn. Giải pháp SaaS không yêu cầu điều này, nhưng nó có thể hạn chế hơn trong trường hợp bạn yêu cầu một số tính năng khác. Nếu bạn tình cờ sử dụng GitHub, Bitbucket, Heroku hoặc các dịch vụ đám mây khác, thì rất có thể bạn muốn có giải pháp SaaS vì nó sẽ phù hợp với quy trình làm việc hiện có của bạn.

Nếu bảo mật dữ liệu là rất quan trọng, thì máy chủ tự vận hành có thể là lựa chọn tốt hơn cho bạn. Các giải pháp SaaS thường  cho phép bạn tập trung nhiều hơn vào sản phẩm cốt lõi của mình vì bạn không phải dành thời gian cho việc duy trì cơ sở hạ tầng và giữ cho tất cả các phụ thuộc được cập nhật với chi phí linh hoạt.

Kiểm tra mã nguồn mở và phần mềm độc quyền

Nếu bạn có các dự án nguồn mở, bạn có thể kiểm tra chúng bằng một trong hai giải pháp. Có thể là một máy chủ được vận hành hoặc một máy chủ tự vận hành. Cả hai đều có ưu và nhược điểm của nó. Như đã đề cập, giải pháp lưu trữ (SaaS) bạn không mất nhiều thời gian bảo trì và vận hành, điều này sẽ khiến bạn có nhiều thời gian hơn để làm việc / code trên sản phẩm của mình.

Phần lớn các giải pháp SaaS tuân theo mô hình GitHub và bạn có thể kiểm tra các dự án nguồn mở của mình miễn phí. Một số dự án nguồn mở đòi hỏi nhiều quyền kiểm soát đối với cơ sở hạ tầng xây dựng mặc dù chúng có thể đang thử nghiệm các phần của hệ điều hành không thể truy cập được trong một giải pháp lưu trữ. Trong trường hợp này, bất kỳ máy chủ CI nguồn mở hiện tại nào cũng sẽ hoạt động tốt, mặc dù có thêm chi phí bảo trì cần thiết.

Lợi ích và lợi thế của việc tích hợp và triển khai liên tục

Tích hợp liên tục có nhiều lợi ích. Một thiết lập CI tốt sẽ tăng tốc quy trình làm việc của bạn và khuyến khích nhóm thúc đẩy mọi thay đổi mà không sợ phá vỡ bất cứ điều gì. Có nhiều lợi ích hơn là chỉ làm việc với quy trình phát hành phần mềm tốt hơn. Tích hợp liên tục mang lại lợi ích kinh doanh tuyệt vời.

Giảm rủi ro

Nếu bạn kiểm tra và triển khai code thường xuyên hơn, nó sẽ giảm mức độ rủi ro của dự án bạn đang thực hiện vì bạn có thể phát hiện lỗi và lỗi code trước đó. Điều này có nghĩa là chúng dễ sửa hơn và bạn có thể sửa chúng sớm hơn, giúp sửa chúng không mất nhiều công sức. Điều này sẽ tăng tốc cơ chế phản hồi và làm cho giao tiếp của bạn mượt mà hơn rất nhiều, như được đề cập trong bài viết này của Darragh Curran:  Giao hàng là nhịp đập của công ty bạn .

Giao tiếp tốt hơn

Khi bạn có một quy trình CI được đặt vào quy trình phân phối liên tục, thật dễ dàng để chia sẻ code của bạn thường xuyên. Việc chia sẻ code này giúp đạt được khả năng trao đổi và hợp tác nhiều hơn giữa các thành viên trong nhóm. Cuối cùng, điều này làm tăng tốc độ và hiệu quả liên lạc trong tổ chức của bạn vì mọi người đều ở trên cùng một điểm, luôn luôn như vậy.

Lặp lại nhanh hơn

Khi bạn phát hành code thường xuyên, khoảng cách giữa ứng dụng trong production và ứng dụng mà nhà phát triển đang làm việc sẽ nhỏ hơn nhiều. Suy nghĩ của bạn về cách phát triển các tính năng có thể sẽ thay đổi. Vì mọi thay đổi nhỏ sẽ được kiểm tra tự động và toàn bộ nhóm có thể biết về những thay đổi này mà bạn sẽ muốn thực hiện đối với các thay đổi nhỏ, tăng dần khi phát triển các tính năng mới. Điều này dẫn đến ít giả định hơn khi bạn có thể xây dựng các tính năng nhanh hơn và kiểm tra và triển khai chúng tự động để người dùng của bạn thấy càng sớm càng tốt, do đó thu được phản hồi có giá trị từ họ nhanh hơn.

Phản hồi nhanh hơn về các quyết định kinh doanh

Có một quy trình CI không chỉ có lợi cho các nhà phát triển phần mềm, mà còn cho các nhà quản lý của họ. Cả hai bên có thể thu thập thông tin phản hồi có giá trị và đạt được thông tin chi tiết nhanh hơn nhiều. Khi bạn đẩy code thường xuyên hơn, bạn có sẵn nhiều dữ liệu hơn mà bạn có thể phân tích để kiểm tra xem sản phẩm có đang đi đúng hướng hay không. Luồng dữ liệu liên tục này và dòng thời gian của các số liệu (như phụ thuộc,  kiểm tra đơn vị , độ phức tạp và  code smell ) cũng có thể giúp phản ánh tiến trình của dự án thường xuyên hơn cho phép các quyết định kinh doanh và công nghệ nhanh hơn.

Một số lợi ích khác của việc sử dụng CI và CD

  • Giảm chi phí trong suốt quá trình phát triển và triển khai
  • Giảm thời gian và nỗ lực để tích hợp các thay đổi mã khác nhau
  • Cho phép cơ chế phản hồi nhanh về mọi thay đổi
  • Cho phép phát hiện sớm và ngăn ngừa khuyết tật
  • Giúp cộng tác giữa các thành viên trong nhóm để mã gần đây luôn được chia sẻ
  • Giảm nỗ lực kiểm tra thủ công
  • Xây dựng các tính năng tăng dần giúp tiết kiệm thời gian ở phía gỡ lỗi để bạn có thể tập trung vào việc thêm các tính năng
  • Bước đầu tiên để tự động hóa hoàn toàn toàn bộ quá trình phát hành
  • Ngăn chặn sự phân kỳ trong các ngành khác nhau vì chúng được tích hợp thường xuyên
  • Nếu bạn có một tính năng phát triển dài hạn mà bạn đang làm việc, bạn có thể liên tục tích hợp nhưng giữ lại bản phát hành theo các version .

Trên đây là tôi đã nói qua về khái niệm và những lợi ích của Tích hợp liên tục (CI). Nếu bạn có bất cứ thắc mắc phản hồi góp ý xin để lại bình luận.