2023 Modern CI pipeline: Things to consider
Ngày nay việc xây dựng CI pipeline là thiết yếu khi bắt đầu một dự án phần mềm. Đâu là những kì vọng mới về các tính năng của CI pipeline, đâu là những thành phần phải có bên cạnh pipeline build truyền thống?
Giới thiệu
Các công cụ như GitLab, Jenkins đã được sử dụng rộng rãi và trở thành một phần quan trọng trong quá trình phát triển phần mềm. Tuy nhiên, để xây dựng một CI pipeline thực sự hiệu quả, việc chỉ sử dụng các công cụ này là chưa đủ mà thường cần đội ngũ phát triển tích hợp thêm theo nhu cầu của chính dự án. Ngày nay, developer ngày càng khó tính và đòi hỏi nhiều điều về tính năng của CI như:
- Graphical UI, Live debugging with Breakpoint
- Cloud Agnostic, native support for K8s, Helm, Docker
- Parallel, Modular for reusable
Ngoài ra để đảm bảo sản phẩm phần mềm sẽ có chất lượng, ngày nay chúng ta càng cần triệt để thực hiện shift-left khi xây dựng pipeline. Bài viết này sẽ giới thiệu các thành phần phải có trong một CI pipeline.
Một số công cụ để xây dựng CI pipeline
1. Kiểm thử tự động (Automation Testing)
Component không mới nhưng là câu chuyện muôn thuở cần thực hiện triệt để. Kiểm thử tự động là yếu tố quan trọng để đảm bảo chất lượng và sự ổn định của phần mềm trong suốt quá trình phát triển. Tích hợp các phương pháp kiểm thử khác nhau vào pipeline mang đến nhiều lợi ích:
- Phát hiện sớm các vấn đề, giúp giải quyết nhanh chóng và giảm chi phí
- Nâng cao độ bao phủ và độ tin cậy của kiểm thử (test coverage and reliability)
- Giảm thiểu lỗi con người trong quá trình kiểm thử
- Tạo ra vòng lặp phản hồi (feedback loop) nhanh chóng cho nhà phát triển
- Rút ngắn thời gian ra thị trường bằng cách tăng tốc chu kỳ phát triển
- Tăng cường sự hợp tác giữa nhóm phát triển, kiểm thử và vận hành
Các loại kiểm thử cần tích hợp vào CI pipeline:
- Unit Testing: Kiểm thử riêng lẻ các đơn vị mã nguồn (units of code), thường là các hàm (function). Sử dụng các công cụ như JUnit(Java), pytest (Python), Mocha (JavaScript),...
- Integration Testing: Kiểm tra tương tác giữa các thành phần hoặc module khác nhau của hệ thống. Sử dụng các công cụ như TestNG (Java), pytest (Python), Cypress (JavaScript),...
- Contract Testing: Kiểm tra tính nhất quán giữa các dịch vụ trong một hệ thống phân tán. Sử dụng các công cụ như Pact, Hoverfly,…
2. Phân tích chất lượng và bảo mật mã nguồn (Code Quality and Security Analysis)
Tích hợp các công cụ phân tích chất lượng và bảo mật mã nguồn vào CI pipeline là rất quan trọng để duy trì mã nguồn "sạch sẽ", an toàn và chuẩn mực. Các công cụ này mang đến nhiều lợi ích:
- Phát hiện sớm các vấn đề tiềm ẩn, giảm khả năng xuất hiện bug và lỗ hổng bảo mật
- Bắt buộc mã nguồn phải tuân theo các tiêu chuẩn và best practice nhằm cải thiện khả năng bảo trì và đọc hiểu của mã nguồn
- Giảm technical debt và công sức refactor
- Tinh gọn việc review code và hợp tác giữa các thành viên
- Tăng cường bảo mật tổng thể của phần mềm
Một số công cụ được sử dụng phổ biến:
- Static code analysis (SCA): Phân tích mã nguồn mà không cần thực thi (execute). Sử dụng các công cụ như: SonarQube, ESLint (JavaScript), Pylint (Python),...
- Static Application Security Testing (SAST): Phân tích mã nguồn tìm lỗi bảo mật. Sử dụng các công cụ như: Klocwork, Checkmarx,...
- Dynamic code analysis (DCA): Phân tích mã nguồn trong lúc thực thi. Sử dụng các công cụ như OWASP ZAP và Burp Suite,...
- Dynamic Application Security Testing (DAST): Phân tích ứng dụng tìm lỗi bảo mật. Sử dụng các công cụ như: AppScan, Rapid7, Invicti,...
- Dependency analysis: Đảm bảo dependencies up-to-date và không có lỗ hổng bảo mật. Sử dụng các công cụ như: Dependency-check (Java), npm audit (JavaScript), pipenv check (Python),...
3. Quét lỗ hổng và kiểm định theo chuẩn CIS (Vulnerability Scanning and CIS Benchmarking)
Trong bối cảnh containerization ngày càng trở nên phổ biến, việc đảm bảo bảo mật cho container image cũng như container orchestrator cũng ngày càng trở nên thiết yếu. Tích hợp quét lỗ hổng bảo mật vào CI pipeline đảm bảo cả phần mềm và hạ tầng đểu bảo mật và tuân thủ các quy chuẩn của ngành. Việc này mang lại những lợi ích:
- Chủ động phát hiện và khắc phục các rủi ro bảo mật, giảm khả năng bị xâm nhập hoặc khai thác
- Đảm bảo tuân thủ các best practices và tiêu chuẩn của ngành
- Liên tục giảm sát và đánh giá cấu hình hạ tầng để phát hiện các lỗ hổng tiềm ẩn
Trung tâm An ninh mạng (CIS) cung cấp một tập hợp các tiêu chuẩn bảo mật dành cho Docker và Kubernetes, một số công cụ thường dùng để kiểm định theo chuẩn CIS bao gồm:
- Aqua Docker Bench: Kiểm định theo chuẩn CIS cho Docker image
- Aqua kube-bench: Kiểm định theo chuẩn CIS cho Kubernetes cluster
4. Quản lý Artifact (Artifact Management)
Một giải pháp quản lý artifact mạnh mẽ là rất quan trọng để lưu trữ, tổ chức và phân phối hiệu quả các artifact được tạo ra trong vòng đời phát triển phần mềm. Lợi ích của việc tích hợp giải pháp quản lý artifact vào CI pipeline bao gồm:
- Quản lý tập trung và kiểm soát phiên bản (version control)
- Tăng khả năng truy vết và audit các artifact
- Kiểm soát hiệu quả dependencies và thư viện bên thứ ba, giảm các rủi ro bảo mật tiềm ẩn
- Tăng tốc build và deplooy thông qua caching
Một số công cụ thường được sử dụng:
- Nexus Repository
- JFrog Artifactory
- Azure Artifacts
Kết luận
Xây dựng CI pipeline vững chắc và hiệu quả cho phép cung cấp các ứng dụng chất lượng cao một cách nhanh chóng đồng thời vẫn giảm thiểu rủi ro. Bằng cách đưa các thành phần thiết yếu vào pipeline, đội ngũ phát triển có thể đảm bảo sản phẩm đạt đến tiêu chuẩn cao và thúc đẩy sự cải tiến liên tục để đem đến các sản phẩm ngày càng tốt hơn.