Kiến trúc của Jenkins được thiết kế dựa trên mô hình client-server bao gồm hai thành phần chính: Jenkins Master và Jenkins Agent (hoặc Jenkins Slave). Mô hình này giúp Jenkins quản lý các tác vụ phức tạp, phân tán công việc và dễ dàng mở rộng quy mô.
1. Jenkins Master (Master Node)
Jenkins Master là thành phần trung tâm của hệ thống Jenkins, thực hiện các chức năng chính sau:
- Quản lý giao diện người dùng: Cung cấp giao diện đồ họa để người dùng tương tác với Jenkins, bao gồm cấu hình các jobs, pipeline và quản lý các tác vụ CI/CD.
- Lên lịch công việc: Quản lý và lên lịch các công việc CI/CD cho hệ thống. Khi một job mới được kích hoạt (ví dụ khi có thay đổi mã trên hệ thống quản lý phiên bản), Jenkins Master sẽ kiểm tra và sắp xếp các job cần thiết.
- Phân phối công việc đến các Jenkins Agents: Jenkins Master không trực tiếp thực thi các tác vụ mà phân phối chúng đến các Jenkins Agents để thực thi.
- Quản lý plugin: Quản lý các plugin tích hợp với các công cụ DevOps khác (Git, Docker, Maven,…).
- Kiểm tra trạng thái và thông báo: Theo dõi trạng thái của các jobs, cung cấp log và gửi thông báo khi một job hoàn thành hoặc gặp lỗi.
2. Jenkins Agent (Agent Node)
Jenkins Agent là các nút (node) được cấu hình để thực hiện các công việc (job) do Jenkins Master phân phối. Agent có thể được cấu hình để thực thi một số công việc cụ thể hoặc được sử dụng linh hoạt tùy vào tài nguyên. Vai trò của Jenkins Agent bao gồm:
- Thực thi job: Khi Jenkins Master phân phối công việc, Jenkins Agent sẽ thực thi công việc đó trên môi trường của mình (chẳng hạn như build, test, deploy).
- Hỗ trợ đa nền tảng: Các Agent có thể chạy trên nhiều hệ điều hành khác nhau (Windows, macOS, Linux), cho phép phân phối công việc trên nhiều môi trường.
- Hỗ trợ tính năng “Node Labeling”: Giúp xác định và phân loại các Agent dựa trên loại công việc (ví dụ: chỉ định một Agent để xử lý các công việc liên quan đến Docker hoặc một loại kiểm thử cụ thể).
3. Plugin Architecture
Jenkins sử dụng kiến trúc plugin linh hoạt, cho phép tích hợp với rất nhiều công cụ và nền tảng DevOps khác nhau. Mỗi plugin có thể mở rộng chức năng của Jenkins, chẳng hạn như:
- Tích hợp hệ thống quản lý mã nguồn: Các plugin cho Git, GitHub, Bitbucket, SVN,… cho phép Jenkins truy cập mã nguồn trực tiếp.
- Tích hợp công cụ kiểm thử: Các plugin cho phép Jenkins thực hiện kiểm thử tự động (JUnit, Selenium, TestNG…).
- Tích hợp với Docker, Kubernetes: Giúp tạo và quản lý các container hoặc triển khai ứng dụng lên các cụm Kubernetes.
- Thông báo và báo cáo: Các plugin giúp Jenkins gửi thông báo qua email, Slack hoặc lưu báo cáo kết quả kiểm thử vào hệ thống khác.
4. Pipeline as Code (Jenkinsfile)
Jenkins hỗ trợ định nghĩa các pipeline dưới dạng mã (Pipeline as Code), thường được lưu trong tệp Jenkinsfile
. Đây là một tệp văn bản mô tả các bước CI/CD của dự án, bao gồm:
- Declarative Pipeline: Định nghĩa các bước trong pipeline bằng cú pháp rõ ràng, dễ hiểu.
- Scripted Pipeline: Pipeline có thể được viết dưới dạng script (Groovy), linh hoạt và có thể thực hiện các thao tác phức tạp.
5. Cơ chế phân phối công việc
Jenkins Master phân phối các công việc tới các Agent dựa trên các tiêu chí như nhãn của Agent, yêu cầu tài nguyên và tính sẵn sàng của Agent. Điều này giúp hệ thống phân tán tải, tối ưu hóa thời gian xử lý và tận dụng hiệu quả tài nguyên.