Thứ Năm, 27 tháng 10, 2016

Continuous Integration

Với nhiều bạn khái niệm Continuous Integration (Tích hợp liên tục - CI) là một cái gì đó xa lạ. Hôm nay mình sẽ giúp các bạn hiểu thế nào là CI và vận dụng nó vào trong công việc phát triển phần mềm.

CI là gì?

Tích hợp liên tục (CI) là phương pháp phát triển phần mềm đòi hỏi các thành viên trong nhóm tích hợp công việc thường xuyên. Mỗi ngày, các thành viên đều phải theo dõi và phát triển công việc của họ ít nhất một lần. Việc này sẽ được một nhóm khác kiểm tra tự động, nhóm này sẽ tiến hành kiểm thử truy hồi để phát hiện lỗi nhanh nhất có thể. Cả nhóm thấy rằng phương pháp tiếp cận này giúp giảm bớt vấn đề về tích hợp hơn và cho phép phát triển phần mềm gắn kết nhanh hơn — Thư viện phát triển phần mềm của IBM
Continuous IntegrationVòng đời phát triển phần mềm theo phương pháp CI

Tại sao nên dùng CI ?

Sử dụng phương pháp CI giúp cho hệ thống luôn đảm bảo là build được và chạy đúng (do phải pass qua toàn bộ test case). Mặt khác các công đoạn test sẽ được hệ thống CI server thực hiện tự dộng giúp cho ta có thể dễ dàng biết được tình trạng của một branch, một commit nào đó và không cần lấy source về test thử. Do đó tốc độ phát triển được tăng lên. Đây cũng là lý do mà nhiều team phát triển theo mô hình Agile lựa chọn phương pháp này.

Một ví dụ tổng quát về việc sử dụng các công cụ, dịch vụ phối hợp với nhau để thực hiện Continous Integration (CI) trong quá trình phát triển phần mềm.

Mô hình tổng quan gồm có những gì ?

CloudFormation : một dịch vụ của AWS hỗ trợ việc quản lý, xây dựng các tài nguyên trên Amazon Web Service (AWS) một cách tự động thông qua các APIs và Json templates.
Chức năng : cung cấp các tài nguyên cần thiết trên AWS cho dự án, trong ví dụ này chúng ta sẽ cần :
    01 EC2 instance để cài đặt Jenkins (CI server)
    01 ELB xử lý việc cân bằng tải
    01 RDS instance cho lưu trữ dữ liệu
    01 ECS cluster để chạy, điều phối các docker containers
    01 ECR registry để lưu trữ các docker images


Ansible : một công cụ, ngôi sao đang lên, trong việc quản lý cấu hình tự động cho các machines.
Chức năng : cung cấp việc cài đặt và thiết lập môi trường cũng như các packages cần thiết cho CI server :

    Nginx với chức năng reverse proxy cho jenkins
    Jenkins với chức năng CI server
    Docker với chức năng build docker image
    Aws CLI tương tác với ECS, ECR qua dòng lệnh
Jenkins : CI server, một sản phẩm mã nguồn mở giúp tự động hóa các công việc building, deploying các phần mềm, dự án.
Chức năng : cung cấp hõ trợ cấu hình chạy unit test, build, deploy cho dự án.

Docker : một công cụ giúp đóng gói và phân phối ứng dụng dễ dàng, đa nền tảng. 
Chức năng : đóng gói và phân phối các ứng dụng thông qua các docker images.

ECS : EC2 Container Service. Một dịch vụ của AWS thực hiện việc điều phối, quản lý, liên kết các docker container để làm việc hiệu quả.
Chức năng : cung cấp việc vận hành và điều phối các docker containers.

ECR : EC2 Container Registry. Một dịch vụ của AWS để lưu trữ các docker images, chức năng tương tự như DockerHub. Từ đấy các hệ thống có thể lấy docker image theo yêu cầu.

Vậy các bộ phận trên phối hợp với nhau như thế nào ?


    1. Engineer push code tới git repository
    2. Jenkins định kỳ kiểm tra và pull code mới về
    3. Jenkins chạy Unit test
    4. Jenkins chạy docker build để đóng gói ứng dụng vào docker image
    5. Jenkins pushs docker image tới ECR
    6. Jenkins trigger deploy tới ECS để lấy docker image mới từ ECR
Các bước trên được thực hiện tuần tự cho tới khi tất cả các bước được hoàn thành tạo nên một chu trình khép kín CI.

Như vậy chúng ta đã có một mô hình tổng quát về CI tích hợp các công cụ có sẵn AWS, Docker, Jenkins, Ansible. Việc tích hợp CI sẽ đẩy nhanh quá trình phát hiện lỗi thông qua việc tự động hóa. Giúp cho người viết mã có thể sớm sửa lỗi, góp phần tăng tốc quá trình đưa những cập nhật mới của ứng dụng tới người dùng.


Không có nhận xét nào:

Đăng nhận xét