CI/CD là gì? Sự khác biệt giữa CI và CD


Ngoài việc tham khảo bài viết CI/CD là gì, bạn có thể dành thời gian xem video về chủ đề này do Ms. Châu Vũ, speaker đến từ Cruise (một startup trị giá $30 tỷ đô tại Mỹ) chia sẻ tại Technical Event #03: CI Common Practices & Monorepo Development.







Buổi chia sẻ về CI Practice và Monorepo sáng thứ 7, 08/01









CI/CD là gì?





CI/CD là một phương pháp giúp việc cung cấp ứng dụng cho khách hàng được liên tục, bằng cách áp dụng tự động hóa vào các giai đoạn phát triển ứng dụng.





Các khái niệm chính được gán cho CI / CD là tích hợp liên tục (Continous Integration), phân phối liên tục (Continuous Delivery) và triển khai liên tục (Continous Deployment).





CI / CD là giải pháp cho các vấn đề tích hợp mã mới có thể gây khó khăn cho đội ngũ phát triển và vận hành (hay còn gọi là “địa ngục tích hợp”).





Cụ thể, CI / CD áp dụng tính năng tự động hóa liên tục và giám sát liên tục trong suốt vòng đời của ứng dụng, từ giai đoạn tích hợp và kiểm thử đến phân phối và triển khai.





Các phương pháp kết nối này thường được gọi là quy trình CI/CD (pipeline) và được hỗ trợ bởi các đội ngũ phát triển và vận hành làm việc cùng nhau một cách linh hoạt với một DevOps hoặc một SRE (Kỹ sư quản lý độ tin cậy – Site Reliability Engineering).





CI/CD Pipeline
CI/CD Pipeline




Khác biệt giữa CI và CD là gì?





Từ viết tắt CI/CD có một số ý nghĩa khác nhau.





Quy trình CI/CD
Quy trình CI/CD




1.) CI trong CI/CD nghĩa là tích hợp liên tục (continuous integration), là một quá trình tự động hóa cho các nhà phát triển.





CI thành công có nghĩa là các thay đổi mã của một ứng dụng thường xuyên được xây dựng, kiểm tra và tích hợp vào một kho lưu trữ được chia sẻ (shared repository).





Đó là giải pháp cho vấn đề có quá nhiều nhánh của một ứng dụng được phát triển cùng lúc và có thể xung đột với nhau.





2.) CD trong CI/CD nghĩa là phân phối liên tục (continuous delivery) và / hoặc triển khai liên tục (continuous deployment), là những khái niệm liên quan đôi khi được sử dụng thay thế cho nhau.





Cả hai đều nhằm mục đích tự động hóa các giai đoạn tiếp theo của quy trình, nhưng đôi khi chúng được sử dụng riêng biệt để minh họa mức độ tự động hóa đang diễn ra.





Phân phối liên tục thường nghĩa là các thay đổi của nhà phát triển đối với ứng dụng sẽ tự động được kiểm lỗi và tải lên kho lưu trữ (như GitHub hoặc container registry), nơi đội ngũ vận hành đưa chúng vào môi trường sản xuất trực tiếp (live production).





Đó là câu trả lời cho vấn đề về khả năng hiển thị (visibility) và giao tiếp kém giữa đội ngũ phát triển và đội ngũ kinh doanh.





Vì vậy, mục đích của phân phối liên tục là đảm bảo rằng việc triển khai mã mới sẽ tốn ít công sức nhất.





Còn Triển khai liên tục đề cập đến việc tự động phát hành các thay đổi của nhà phát triển từ kho lưu trữ sang production, nơi khách hàng có thể sử dụng được.





Nó giải quyết vấn đề quá tải của đội ngũ vận hành với các quy trình thủ công làm chậm quá trình phân phối ứng dụng. Nó được xây dựng dựa trên những lợi ích của việc phân phối liên tục bằng cách tự động hóa giai đoạn tiếp theo trong quy trình.





CI/CD có thể chỉ xác định các phương thức được kết nối là tích hợp liên tục và phân phối liên tục hoặc cũng có thể là cả 3 phương thức được kết nối là tích hợp liên tục, phân phối liên tục và triển khai liên tục. Phức tạp hơn, đôi khi “phân phối liên tục” được sử dụng theo cách bao gồm cả các quá trình triển khai liên tục.





Tuy nhiên, để không sa lầy vào những ngữ nghĩa này — bạn chỉ cần nhớ CI/CD là một quá trình, thường được hình dung như một đường ống (pipeline), liên quan đến việc thêm vào mức độ tự động hóa cao và giám sát liên tục khi phát triển ứng dụng .





Trong từng trường hợp, điều mà thuật ngữ này đề cập còn phụ thuộc vào mức độ tự động hóa đã được tích hợp vào CI / CD pipeline.





Nhiều doanh nghiệp bắt đầu bằng cách thêm CI, và sau đó làm dần theo hướng tự động hóa phân phối và triển khai, chẳng hạn như một phần của các ứng dụng cloud-native.





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





Trong phát triển ứng dụng hiện đại, mục tiêu là có nhiều nhà phát triển làm việc đồng thời trên các tính năng khác nhau của cùng một ứng dụng.





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




Tuy nhiên, nếu một tổ chức được thiết lập để hợp nhất tất cả mã nguồn phân nhánh lại với nhau vào một ngày (được gọi là “ngày hợp nhất”), thì công việc thu được có thể tẻ nhạt, thủ công và tốn nhiều thời gian.





Đó là bởi vì khi một nhà phát triển làm việc độc lập thực hiện thay đổi đối với một ứng dụng, thì có khả năng nó sẽ xung đột với các thay đổi khác được thực hiện đồng thời bởi các nhà phát triển khác.





Vấn đề này có thể phức tạp hơn nữa nếu mỗi nhà phát triển đã điều chỉnh môi trường phát triển tích hợp cục bộ (IDE – integrated development environment) của riêng họ, thay vì nhất trí sử dụng một IDE chạy trên đám mây.





Tích hợp liên tục (CI) giúp các nhà phát triển hợp nhất các thay đổi mã của mình về một nhánh được chia sẻ, hoặc “thân cây”, thường xuyên hơn — đôi khi là mỗi ngày.





Sau khi hợp nhất các thay đổi của nhà phát triển vào ứng dụng, những thay đổi đó sẽ được xác thực bằng cách tự động xây dựng ứng dụng và chạy các kiểm thử tự động (automated testing) với các mức độ khác nhau, thường là kiểm thử đơn vị và kiểm thử tích hợp, để đảm bảo các thay đổi không làm hỏng ứng dụng.





Nghĩa là kiểm tra mọi thứ, từ các lớp và chức năng đến các mô-đun khác nhau trên toàn bộ ứng dụng.





Nếu kiểm thử tự động phát hiện ra xung đột giữa mã mới và mã hiện thời, CI sẽ giúp bạn dễ dàng sửa những lỗi đó nhanh chóng và thường xuyên.





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





Sau quá trình tự động hóa các bản dựng, kiểm thử đơn vị và kiểm thử tích hợp trong CI, phân phối liên tục sẽ tự động hóa việc phát hành mã đã được kiểm tra đó vào kho lưu trữ.





Continuous Delivery - Phân phối liên tục
Continuous Delivery – Phân phối liên tục




Nên để có một quy trình phân phối liên tục hiệu quả, điều quan trọng là CI phải được tích hợp sẵn trong quy trình phát triển của bạn.





Mục tiêu của phân phối liên tục là có một cơ sở mã (codebase) luôn sẵn sàng để triển khai tới môi trường sản xuất.





Trong phân phối liên tục, mọi giai đoạn — từ việc hợp nhất các thay đổi mã đến phân phối các bản dựng cho sản xuất — đều liên quan đến tự động hóa kiểm thử (automation testing) và tự động phát hành mã.





Vào cuối quá trình đó, đội ngũ vận hành có thể triển khai ứng dụng vào sản xuất một cách nhanh chóng và dễ dàng.





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





Giai đoạn cuối cùng của một CI/CD pipeline hoàn thiện là triển khai liên tục.





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




Đây là phần mở rộng của phân phối liên tục, nghĩa là tự động hóa việc phát hành bản dựng sẵn cho sản xuất vào kho lưu trữ mã (code repository), triển khai liên tục sẽ tự động hóa việc phát hành ứng dụng vào sản xuất.





Do không có thực hiện thủ công ở giai đoạn của pipeline trước khi sản xuất, nên việc triển khai liên tục chủ yếu dựa vào các bài kiểm thử tự động được thiết kế tốt.





Trên thực tế, triển khai liên tục có nghĩa là thay đổi của nhà phát triển đối với ứng dụng có thể xuất hiện trong vòng vài phút sau khi viết mã (giả sử nó vượt qua kiểm thử tự động).





Điều này giúp việc liên tục nhận và điều chỉnh từ phản hồi của người dùng trở nên dễ dàng hơn.





Cùng nhau, tất cả các phương pháp CI/CD này giúp việc triển khai ứng dụng ít rủi ro hơn, nhờ đó việc phát hành các thay đổi đối với ứng dụng theo từng phần nhỏ dễ dàng hơn thay vì cùng một lúc.





Tuy nhiên, cũng cần đầu đáng kể trước đó vì các bài kiểm thử tự động cần được viết cho phù hợp với nhiều giai đoạn kiểm thử và phát hành trong quy trình CI/CD.





Một số công cụ CI/CD phổ biến





Các công cụ CI/CD có thể giúp đội ngũ tự động hóa việc phát triển, triển khai và kiểm thử của mình.





Công cụ CI/CD
Công cụ CI/CD




Một số công cụ dành cho phía tích hợp (CI), một số ở phía phát triển và triển khai (CD), và những công cụ khác chuyên về kiểm thử liên tục hoặc các chức năng liên quan.





Một trong những công cụ mã nguồn mở được biết đến nhiều nhất cho CI/CD là máy chủ tự động hóa Jenkins. Jenkins được thiết kế để xử lý mọi thứ từ một máy chủ CI đơn giản đến một trung tâm CD hoàn chỉnh.





Tekton Pipelines là CI/CD framework cho nền tảng Kubernetes, cung cấp trải nghiệm CI/CD cloud-native tiêu chuẩn với các container.





Ngoài Jenkins và Tekton Pipelines, các công cụ CI/CD mã nguồn mở khác mà bạn có thể tìm hiểu, bao gồm:





  • Spinnaker, nền tảng CD được xây dựng cho môi trường multicloud.
  • GoCD, máy chủ CI/CD tập trung vào mô hình hóa và hình ảnh hóa.
  • Concourse
  • Screwdriver, nền tảng xây dựng được thiết kế cho CD.




Bạn cũng có thể xem xét các giải pháp CI/CD từ nhiều nhà cung cấp khác nhau. Các nhà cung cấp đám mây cộng đồng lớn đều cung cấp các giải pháp CI/CD, cùng với GitLab, CircleCI, Travis CI, Atlassian Bamboo và nhiều giải pháp khác.





Ngoài ra, bất kỳ công cụ nào nền tảng cho DevOps đều có thể là một phần của quy trình CI/CD.





Các công cụ tự động hóa cấu hình (chẳng hạn như Ansible, Chef và Puppet), container runtimes (chẳng hạn như Docker, rkt và cri-o) và điều phối vùng chứa (Kubernetes) hoàn toàn không phải là công cụ CI/CD, nhưng chúng sẽ có mặt trong quy trình CI/CD.





Nguồn: redhat.com