Một ví dụ về CI với AWS, Docker, Jenkins, Ansible
Có bao giờ bạn muốn code của mình sau khi viết xong được kiểm tra ngay tức thời với hệ thống đang chạy trên các môi trường test, stagging, thậm chí là trên production ? Làm thế nào để tăng tốc quá trình phát triển ứng dụng thông qua việc phát hiện lỗi càng sớm càng tốt ? Nếu câu trả lời là có, xin mời bạn tiếp tục theo dõi bài viết.
Bài viết sẽ đưa ra 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. Tham khảo thêm ở đây và ở đây.
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. Tham khảo thêm tại đây.
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. Tham khảo thêm tại đây.
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. Tham khảo thêm tại đây.
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ả. Tham khảo thêm tại đây.
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.
Chi tiết từng bước sẽ được tác giả tiếp tục cập nhật ở các bài viết tiếp theo. Rất mong nhận được ý kiến của bạn đọc