CI/CD
Duy Văn | 10/02/2024
CI/CD hay Continuos Integration (tích hợp liên tục) và Continuous Delivery (Triển khai liên tục)
CI
CI là phương pháp phát triển phần mềm mà các nhà phát triển thường sẽ tích hợp code của mình vào một kho chung nhiều lần mỗi ngày. Mỗi lần tích hợp sẽ được build tự động thành sản phẩm và được tự động đưa qua các bài test nhằm phát hiện lỗi tại chỗ.
Đứng từ góc độ của dev, khi một dev làm việc và commit code lên repo (có thể là github), bất kỳ thay đổi nào về code sẽ trigger một vòng đời CI, thông thường sẽ là theo:
- developer commit code lên repo
- CI server vì đang giám sát repo và kiểm tra thay đổi theo chu kỳ (1 phút 1 lần chẳng hạn), khi có commit, CI phát hiện repo có thay đổi, nó pull code từ repo về và build, chạy unit test và integration test
- CI server sẽ trả ra các feedback và gửi về cho các thành viên của project
- Tiếp tục ở trạng thái chờ
Vì thế ở cương vị dev, các dev khi làm việc cần phải tự build một bản local và kiểm tra cẩn thận và comit code lên repo chỉ khi đã thấy ổn. Bước này thường xuyên xảy ra và có thể xảy ra bật kỳ lúc nào. Nó các thay đổi này chưa được merge thì cũng sẽ không dẫn đến build tích hợp.
Và thường thì mỗi một branch sẽ có một CI riêng, và khi merge vào branch chính thì sẽ trigger CI chính
Lợi ích của CI:
- Giảm rủi ro lâu dài do phát hiện lỗi và feedback sớm nhờ tự động test và inspect code (code review)
- Giảm các quy trình thủ công (build css,js, migrate, test,…) thay vì đó là build tự động và test tự động
- Sinh ra một build có thể được deploy bất kỳ lúc nào (nếu một build đã qua test và đạt yêu cầu)
CD
Nếu CI là quy trình để build và test tự động ở phía dev thì CD - Continuous Delivery (chuyển giao liên tục) nâng cao hơn bằng cách triển khai tất cả thay đổi về code đến môi trường testing hoặc staging. CD cho phép dev tự động hoá phần tester bên cạnh việc sử dụng unit test, kiểm thử phần mềm qua nhiều bước test từ UI test, load test, integration test, API test, chung quy là test functional
CD được thực hiện bằng cách sử dụng deployment pipeline, deployment pipeline chia quy trình chuyển giao phần mềm ra thành nhiều giai đoạn, mỗi giai đoạn có mục tiêu xác minh chất lượng từ các góc độ khác nhau. Pipeline sẽ cung cấp phản hồi cho nhóm project về chất lượng phần mềm khi cung cấp các tính năng mới. Ở góc độ trừu tượng hơn thì deployment pipeline là quy trình để đưa phần mềm từ version control đến tay người dùng.

Deployment Pipeline
Áp dụng CI/CD vào Automation Test
Để áp dụng CI/CD vào Automation Test, chúng ta sẽ đi qua các bước bao gồm:
- Continuous Integration
- Continuous Testing
- Continuous Deployment
Continuous Integration
- Khi có sự thay đổi trong mã nguồn, CI/CD tự động kích hoạt quy trình kiểm thử
- Hệ thống CI/CD (ví dụ như Jenkins) tự pull mã nguồn mới từ repo và build
- Các bước build bao gồm compile, cài đặt dependencies, rồi build phần mềm
Continuous Testing
Sau khi build xong, CI/CD sẽ tự động chạy các kịch bản kiểm thử tự động, hãy lấy ví dụ với Selenium.
- Các bài test kiểm thử tự động được script bằng ngôn ngữ tương ứng
- Trong môi trường của server CI/CD, Selenium sẽ mở trình duyệt, chạy các bài test và ghi lại kết quả test, đẩy ra ngoài dưới danh nghĩa feedback
Continuous Deployment
Nếu các test cases tự động thành công, CI/CD sẽ tự động triển khai ứng dụng lên môi trường test hoặc staging, hay production
Giới hạn
Chúng ta cũng cần hiểu giới hạn của CI/CD. Nếu nói từ khía cạnh test, chúng ta không thể nhét toàn bộ các bài test vào CI/CD, vì bản chất sẽ có những test cases theo test plan chưa hoặc không thể automate bằng script.
Tiếp theo nữa các test cases tự động này cùng với framework của nó cần phải hoạt động được trên môi trường CI/CD, thường là Linux hoặc có thể nâng cao và sử dụng Docker để chạy trên môi trường CI/CD windows hoặc MacOS
Thực hiện
Đầu tiên, chuẩn bị môi trường:
- Đảm bảo đã cài đặt và cấu hình các công cụ cần thiết bao gồm:
- Một hệ thống quản lý phiên bản như Git
- Framework Automation Test như Selenium, Playwright,… để thực hiện các test scripts
- Máy chủ CI/CD như Jenkins
Tiếp theo, thiết lập quy trình CI/CD:
- Tạo repository Git cho dự án kiểm thử tự động
- Thiết lập Jenkins và cấu hình kết nối với repo Git
- Thiết lập Jenkins để theo dõi các thay đổi trong repo và tự động kích hoạt quy trình CI/CD khi có commit mới
- Cấu hình Jenkins để xây dựng ứng dụng từ mã nguồn, cài đặt dependencies và build
Đến khâu tự động hoá kiểm thử:
- Tạo các test scripts để test các tính năng cần test, thông thường sẽ tạo theo các suite, ví dụ như smoke test
- Đảm bảo các test cases chạy độc lập và không phụ thuộc vào nhau
- Cấu trúc lại project để các test scripts nằm gọn gàng
Tiếp theo, cấu hình Jenkins:
- Cấu hình Jenkins để chạy các test scripts sau khi build thành công, chúng ta sẽ cần viết một file config Jenkinsfile để Jenkins biết cách chạy test scripts. Hoặc có thể sử dụng GUI của Jenkins để cấu hình
- Đảm bảo Jenkins được cấu hình để chạy kịch bản kiểm thử trên một môi trường tách biệt sử dụng Docker
Cuối cùng, xử lý kết quả kiểm thử, bao gồm:
- Thông báo lại kết quả theo dạng feedback
- Lưu trữ kết quả kiểm thử
Nếu có bao gồm deploy thì chúng ta sẽ:
- Cấu hình Jenkins để triển khai sau khi kiểm thử thành công
- Có thể đẩy lên staging hoặc test để tiếp tục thực hiện các test còn lại