Bài viết này giới thiệu mô hình tự động hoá trong việc phát triển phần mềm bằng cách sử dụng Jenkins và Docker
I. Giới thiệu chung
1.1. Tích hợp liên tục (Continuous Integration)
Continuous Integration là phương pháp phát triển phần mềm yêu cầu các thành viên của team tích hợp công việc của họ thường xuyên, mỗi ngày ít nhất một lần. Mỗi tích hợp được "build" tự động (bao gồm cả test) nhằm phát hiện lỗi nhanh nhất có thể. Cả team nhận thấy rằng cách tiếp cận này giảm thiểu vấn đề tích hợp và cho phép phát triển phần mềm nhanh hơn.
Một kịch bản CI bắt đầu bằng việc developer commit code lên repository (github chẳng hạn). Bất kỳ thay đổi nào cũng sẽ trigger một vòng đời CI. Các bước trong một kịch bản CI thường như sau:
- Đầu tiên, developer commit code lên repo.
- CI server giám sát repo và kiểm tra xem liệu có thay đổi nào trên repo hay không (liên tục, chẳng hạn mỗi phút 1 lần)
- Ngay khi commit xảy ra, CI server phát hiện repo có thay đổi, nên nó nhận code mới nhất từ repo và sau đó build, chạy unit và integration test
- CI server sẽ sinh ra các feedback và gửi đến các member của project
- CI server tiếp tục chờ thay đổi ở repo
Mỗi lần developer làm xong task, họ phải chạy một private build (tức là chạy phần mềm trên local trước), check cẩn thận và commit code lên repo khi đã thấy ổn. Bước này xảy ra thường xuyên và ở bất kỳ thời điểm nào trong ngày. Việc build tích hợp sẽ không xảy ra khi những thay đổi này chưa ảnh hưởng đến repo.
Lợi ích của việc sử dụng CI là:
- Giảm thiểu rủi ro nhờ việc phát hiện lỗi và fix sớm, tăng chất lượng phần mềm nhờ việc tự động test và inspect (đây cũng là một trong những lợi ích của CI, code được inspect tự động dựa theo config đã cài đặt, đảm bảo coding style, chẳng hạn một function chỉ được dài không quá 10 dòng code ...)
- Giảm thiểu những quy trình thủ công lặp đi lặp lại (build css, js, migrate, test...), thay vì đó là build tự động, chạy test tự động
- Sinh ra phần mềm có thể deploy ở bất kì thời gian, địa điểm
1.2. Jenkins
Jenkins là một phần mềm tự động hóa, mã nguồn mở và viết bằng Java. Jenkins giúp tự động hóa các quy trình trong phát triển phần mềm, hiện nay được dùng trong Tích hợp liên tục, và còn được dùng đến trong việc Phân phối liên tục.
Jenkins hỗ trợ hầu hết các phần mềm quản lý mã nguồn phổ biến hiện nay như Git, Subversion, Mercurial, ClearCase... Jenkins cũng hỗ trợ cả các mã lệnh của Shell và Windows Batch, đồng thời còn chạy được các mã lệnh của Apache Ant, Maven, Gradle... [wiki-site]
Plugin là các phần mở rộng trong Jenkins, hỗ trợ các dự án không dùng ngôn ngữ Java. Plugin có thể tích hợp hầu hết các hệ thống quản lý mã nguồn và cơ sở dữ liệu vào Jenkins. Nhiều công cụ build có plugin riêng. Plugin cũng có thể thay đổi giao diện hoặc thêm chức năng mới cho Jenkins. Nhiều plugin dành riêng cho các mục đích khác nhau.
1.3. Docker
Docker là một phần mềm cung cấp môi trường ảo hóa chứa đầy đủ cài đặt cần thiết cho project. Docker giúp tăng tốc độ xây dựng project và giảm thiểu lỗi khi chuyển giao. Hiện nay docker đang trở nên rất phổ biến.
Các vấn đề cần tìm hiểu:
-Image
-Container
-Registry
-Repository
-Docker hub
1.4. Mô hình cơ bản
Mô tả:
- Khi dev push code lên Gitlab, Gitlab sẽ gọi một webhook thông báo cho Jenkins biết có sự kiện push code.
- Jenkins bắt được sự kiện này và chạy pipeline. Pipeline được mô tả những công việc mà Jenkins cần thực hiện được chỉ ra bởi dev.
- Trong mô hình này, pipeline sẽ thực hiện 4 công việc sau:
- Pull code từ server
- Đóng gói project
- Build Docker Image, gắn tag
- Publish Image lên 1 registry
- Sau khi hoàn tất việc publish image lên Docker registry thì pipeline sẽ kết thúc. Kết quả trả thu được là:
- Image mới trên Registry
- Image trên máy cài đặt Docker
II. Các bước cài đặt
Phần này mình sẽ giới thiệu ở bài tiếp theo nhé.