CI/CD là gì?
Dạo gần đây (thực ra cũng không gần lắm, vài năm rồi 😆), ở đâu cũng đọc/nghe được về CI/CD, vậy rốt cuộc nó là cái gì vậy nhỉ?
Có thể nói CI/CD là đại diện cho 1 phương thức phát triển phần mềm hiện đại ngày nay. Ý tưởng là dựa trên việc thực thi các script 1 cách tự động để hạn chế tối đa các sai xót xảy ra trong quá trình phát triển phần mềm. CI/CD yêu cầu rất ít thậm chí không có thao tác của con người từ lúc phát triển cho đến khi deploy(sure, con người là nguồn gốc của mọi tội lỗi 🤣)
CI đại diện cho Continuous Integration, trong khi CD có thể là Continuous Delivery hoặc Continuous Deployment
Continuous Integration
Hàng ngày các developer trong team code tính năng, fix bug sau đó commit và push lên repo, merge vào branch chính… Với các hành động này ta có thể setting để có thể tự động chạy test, quét sonar, đảm bảo rằng code mới sẽ không gây ra lỗi với app của mình. Cái khái niệm này chính là continuous integration.
Cần làm gì để có continuous integration:
- Cần phải viết code test cho mọi tính năng. Theo mình đây là trở ngại lớn nhất bởi đa số dev rất ngại viết code test
- Cần phải có 1 con server (nhiều khi là rất mạnh) để chạy các job của CI: build, test, sonar …
Lợi ích thu được:
- Để lọt ít bug hơn khi lên production (tất nhiên, có test mà)
- Các bug, issue được phát hiện sớm trong quá trình phát triển
- Giảm thiểu context switching, developer có thể fix bug ngay thay vì đi làm task khác rồi lại phải quay lại fix bug khi team QA báo bug
- Giảm effort của QA team, tăng cả performance nữa (máy chạy test thì chắc chắn chính xác và nhanh hơn người rồi)
Continuous Delivery
Là bước tiếp theo sau continuous integration. Khi đã chắc chắn rằng code của mình không có vấn đề gì ta có thể deploy nó lên server bằng cách bấm 1 cái button trên màn hình, sau đó thì có thể pha trà, coffee rồi đợi nó lên thôi. Mình đã làm nhiều kiểu deploy rồi, từ kéo file lên server, ssh lên server tự pull code về build hay chạy script build bằng tay (vâng, bằng tay nên vẫn có khả năng sai nhé) thì cái viễn cảnh trên thật là tươi đẹp 😍🥰😘
Thế thì chúng ta cần:
- Phần CI phải làm tốt, các test case phải cover được đủ nhiều
- Phần deploy phải được thực hiện tự động (cho dù trước đó bấm button bằng tay)
Đổi lại:
- Không cần quan tâm đến quá trình deploy nữa, sẽ không cần chuẩn bị kỹ càng mỗi đợt release (không release note, deploy step gì nữa hết)
Continuous Deployment
Nếu như ở continuous delivery bạn vẫn cần phải bấm button thì code mới được deploy lên server thì continuous deployment còn đi xa hơn thế, tất cả đều tự động. Sau khi pass các test case thì nó tự động deploy luôn, không cần con người tham gia tý nào luôn.
Tất nhiên, yêu cầu cũng cao hơn:
- Code test phải “hoàn hảo”, tất nhiên rồi, không có con người tham gia mà
- Việc cập nhật document phải bắt kịp tốc độ release
- Cần có feature flag, để enable/disable tính năng sao cho khớp với kế hoạch kinh doanh, marketing
Và lợi ích thu được cũng rất lớn:
- Tốc độ phát triển sẽ nhanh hơn, không cần chuẩn bị nhiều cho các đợt release nữa
- Rủi ro mỗi lần deploy cũng nhỏ hơn, do chỉ deploy 1 tính năng mỗi lần
- Khách hàng sẽ hài lòng hơn do nhìn thấy thay đổi trên hệ thống mỗi ngày, thay vì hàng tuần, hàng tháng như trước.
CI/CD flow
Tóm lại thì cả flow CI/CD có thể biểu diễn bằng cái hình sau:
CI/CD Tools
Nghe nói nãy giờ hay qúa, thế muốn làm CI/CD thì như nào?
Có rất nhiều tool để làm CI/CD, đây là 1 số cái tên mình biết nhé:
- Jenkins
- Gitlab CI (chỉ support Gitlab, tất nhiên)
- Github Actions (mới ra luôn, tất nhiên là Github only)
- Bitbucket Pipelines (Bitbucket only)
- Circle CI (Github, Bitbucket)
- Travis CI(Github only)
- Team City (hàng Jet Brains nhưng mà free)
References: