1. Jenkins là gì?
Jenkins là một công cụ tự động hóa mã nguồn mở, dùng để:
- Tự động hóa quá trình CI/CD
- Tích hợp và triển khai liên tục mà không cần thao tác thủ công
Jenkins giúp:
- Build (biên dịch, đóng gói mã nguồn)
- Test (chạy unit test, integration test)
- Deploy (triển khai lên các môi trường)
- Thông báo kết quả (qua email, slack,..)
Jenkins đươc viết bằng java, có thể chạy trên Windows, Linux, MacOS và hỗ trợ rất nhiều plugin để tích hợp với Git, Docker, Kubernetes, AWS, Azure,…
2. Các khái niệm trong Jenkins
|
Thành phần 2279_caa4b6-bc> |
Mô tả 2279_b4cb2b-01> | 2279_50bd0a-96> |
|
Job/ Project 2279_18c946-28> |
Là một tác vụ Jenkins thực hiện, ví dụ build code, test, deploy 2279_0228ef-04> | 2279_4b17e8-4c> |
|
Pipline 2279_118dc9-ff> |
Là chuỗi các bước (stages + steps) mô tả toàn bộ quy trình CI/CD bằng code (Jenkinsfile) 2279_548b42-7f> | 2279_1fd6a3-24> |
|
Plugin 2279_d488dd-8b> |
Là các thành phần mở rộng cho Jenkins (Git plugin, Doker plugin, SonarQube plugin,v..v..) 2279_3ae990-85> | 2279_7c9c06-73> |
|
Executor 2279_cbe99a-53> |
Là tiến trình thực thi job trên agent 2279_671507-a5> | 2279_8017fa-c7> |
|
Workspace 2279_7b74e5-a2> |
Thư mục nơi Jenkins lưu mã nguồn và kết quả build 2279_a68dc9-93> | 2279_6cb748-c9> |
|
Node 2279_abcad2-5b> |
Là bất kỳ máy (vật lý/ảo/container) nào Jenkins có thể dùng để chạy job 2279_d59108-03> | 2279_8d1125-70> |
3. Kiến trúc Jenkins Master/Agent
Jenkins có kiến trúc phân tán (distributed architecture) gồm 2 thành phần chính:
Jenkins Master (hoặc Jenkins Controller)
- Là trung tâm điều khiển toàn bộ hệ thống Jenkins
- Chịu trách nhiệm:
- Quản lý cấu hình và giao diện web
- Lên lịch và phân phối job tới các agent
- Lưu trữ kết quả build, logs
- Cài plugin và quản lý các credentials
Jenkins Agent
- Là node (vật lý, VM, container) được kết nối với node Master để thực thi các job build/test/deploy.
- Mỗi agent có thể cài đặt môi trường riêng: Java, Node.js, Maven, Docker,…
- Khi job được trigger, Master sẽ phân công cho 1 Agent khả dụng chạy job.
Mô hình hoạt động.

– Developer đẩy code lên Git (Github, Gitlab, Bitbucket, …)
– Jenkin phát hiện sử thạy đổi thông qua webhook hoăc polling
– Node master kích hoạt job/pipeline
– Master phân bố job cho agent khả dụng
– Agent nhận lệnh, clone source code, chạy build/test/deploy theo script trong Jenkinsfile
– Agent gửi kết quả về Master
– Master lưu kết quả và hiện thị trên Jenkins Dashboard hoạc gửi thông báo email/Slack,…
4. Các kiểu Agent phổ biến
| Loại Agent | Mô tả |
|---|---|
| Static Agent | Là máy cố định (vật lý hoặc ảo) được cấu hình sẵn. |
| Dynamic Agent | Tạo tự động khi có job (ví dụ trong Docker, Kubernetes, AWS EC2). |
| Inbound Agent (JNLP) | Agent kết nối ngược lại với Master (thường dùng khi Agent ở ngoài mạng nội bộ). |
| SSH Agent | Master chủ động kết nối tới Agent qua SSH. |
| Docker Agent | Mỗi job chạy trong container độc lập. |
5. Lợi ich của mô hình Master – Agent
– Tăng tốc độ build (Chạy song song nhiều job)
– Tách biệt môi trường build (Agent khác nhau cho từng công nghệ)
– Dễ mở rộng (scalable) – thêm agent khi cần
– Ổn định và an toàn – Nếu một agent lỗi, master và các agent khác không bị ảnh hưởng.
– Tích hợp đa nền tảng – Build code Java, Node.js, Python trên các agent tương ứng.
6. Cài đặt Jenkins
Xem ở đây
7. Jenkins Pipline
Jenkins Pipeline không chỉ là tập hợp các bước tự động hóa, mà còn được quản lý dưới dạng mã nguồn (as Code) — nghĩa là quy trình CI/CD được lưu trữ cùng với code của dự án, có thể version control, review và rollback như bất kỳ phần mềm nào khác.
Jenkins Pipeline được khai báo trên một tập tin được gọi là Jenkinsfile thường được lưu ở thư mục gốc của repository. Jenkins sẽ tự động đọc và thực thi file này khi có commit mới hoặc khi pipeline được trigger thủ công. Jenkins Pipeline được viết dựa trên cú pháp của ngôn ngữ Groovy.
pipeline {
agent any
environment {
BUILD_SCRIPTS='mypipeline'
BUILD_HOME='/var/lib/jenkins/workspace'
}
stages {
stage('Build') {
steps {
echo 'Building the project...'
}
}
stage('Test') {
steps {
echo 'Running tests....'
}
}
stage('Deploy') {
steps {
echo 'Deploying application ....'
}
}
}
post {
always {
clean()
}
}
}
Nội dung trong Jenkinsfile gồm
- Trường
pipeline{}là thành phần bắt buộc dùng để khai báo pipeline trongJenkinsfile. - Trường
agentdùng để khai báo môi trường sẽ thực hiện. Nếu cấu hình là “any” thì Jenkins sẽ sử dụng bất kỳ agent nào hiện có trên hệ thống. - Trường
environment{}dùng để khai báo các biến môi trường cần thiết. - Trường
stages{}dùng để khai báo các “giai đoạn” (stage) con bên trong pipeline.- Trường
stage('Build') {}sẽ thực hiện việc build, test, deploy. - Trường
steps: các lệnh cụ thể cần thực hiện trong mỗi giai đoạn.
- Trường
- Trường
post{}sẽ được thực thi sau khi các stage hoàn tất các công việc được chỉ định. TrongJenkinsfiletrên, sau khi các stage đã thực hiện (kể cả không thành công), workspace sẽ được xóa để tránh Jenkins bị lỗi trong lần thực thi pipeline tiếp theo.
Pipeline Declarative vs Scripted
Jenkins hỗ trợ 2 loại cú pháp:
- Declarative Pipeline: Dễ đọc, có cấu trúc rõ ràng, phù hợp cho hầu hết các dự án thực tế
- Scripted Pipeline: Dựa trên groovy, linh hoạt hơn, thích hợp khi cần logic phức tạp.
| Tiêu chí | Declarative Pipeline | Scripted Pipeline |
|---|---|---|
| Ngôn ngữ | Cú pháp DSL (Domain-Specific Language) mở rộng của Jenkins | Groovy thuần |
| Cấu trúc | Rõ ràng, có khuôn mẫu bắt buộc (pipeline { }, stages { }, steps { }) | Linh hoạt, có thể dùng bất kỳ cú pháp Groovy nào |
| Độ dễ đọc | Dễ đọc, dễ bảo trì, thân thiện với người mới | Khó đọc hơn, đòi hỏi hiểu biết Groovy |
| Tính năng hỗ trợ sẵn | Có nhiều keyword tiện dụng như agent, environment, post, tools | Phải tự khai báo hoặc xử lý bằng code |
| Khả năng mở rộng / logic phức tạp | Hạn chế hơn | Rất linh hoạt, có thể viết điều kiện, vòng lặp, hàm tùy ý |
| Khuyến nghị sử dụng | Hầu hết dự án thực tế, CI/CD chuẩn | Khi cần xử lý logic tùy biến, nâng cao |
Ví dụ:
Declarative Pipeline:
pipeline {
agent any
stages {
stage('Build') {
steps {
echo 'Building...'
}
}
stage('Test') {
steps {
echo 'Testing...'
}
}
stage('Deploy') {
steps {
echo 'Deploying...'
}
}
}
}
Scripted Pipeline:
node {
stage('Build') {
echo 'Building...'
}
stage('Test') {
echo 'Testing...'
}
stage('Deploy') {
echo 'Deploying...'
}
}