Series Jenkins Docker Hub #3: Tuyệt kỹ Docker Agent – Biến ảo môi trường build trong nháy mắt
1. Docker Agent là gì?
Hãy nhớ lại khái niệm Master - Node. Thông thường, bạn phải chuẩn bị sẵn những con Node (Agent) cài sẵn các công cụ cần thiết để Master giao việc.
Nhưng với Docker Agent (được hỗ trợ bởi plugin Docker Pipeline - thường cài mặc định), tư duy sẽ thay đổi hoàn toàn:
- Jenkins Master nhận code từ GitHub.
- Đọc file Jenkinsfile, thấy yêu cầu môi trường Golang.
- Master gọi Docker Engine (thông qua cái ống docker.sock mà ta đã map ở Bài 2): "Ê, lên Docker Hub kéo cho tôi cái image golang:1.21-alpine, bật nó lên thành container, ném đống code này vào đó, chạy lệnh go test xong thì... giết cái container đó đi cho sạch!"
Bùm! Bạn có một môi trường build sinh ra chỉ để phục vụ đúng 1 tác vụ, sau đó tự hủy không để lại một hạt bụi. Máy chủ Jenkins của bạn không cần cài thêm bất cứ ngôn ngữ lập trình nào.
2. Cú pháp khai báo biến ảo
Trong Declarative Pipeline, thay vì khai báo agent any (dùng bất cứ con server nào đang rảnh) ở đầu file, chúng ta có thể khai báo agent riêng cho từng stage cụ thể.
Cú pháp cực kỳ đơn giản:
stage('Chạy Test Golang') {
agent {
docker {
image 'golang:1.21-alpine'
// Có thể thêm args để mount cache giúp tải thư viện nhanh hơn
args '-v $HOME/.cache/go-build:/root/.cache/go-build'
}
}
steps {
sh 'go version'
sh 'go test ./...'
}
}
3. Thực chiến: Pipeline kết hợp Docker Agent & DooD
Bây giờ, chúng ta sẽ áp dụng nó vào quy trình CI/CD cho service Backend xử lý giao dịch AFC. Quy trình chuẩn mực sẽ có 3 bước:
- Kéo code.
- Test Code (Dùng Docker Agent): Mượn môi trường Golang từ Docker Hub để chạy Unit Test.
- Đóng gói (Dùng DooD): Dùng trực tiếp Docker CLI của Jenkins Master để build ra file Image cuối cùng và đẩy lên Registry.
Anh em xem kỹ đoạn Jenkinsfile dưới đây:
pipeline {
// Tắt agent mặc định ở cấp cao nhất để ép từng stage phải tự định nghĩa môi trường
agent none
environment {
APP_NAME = "afc-transaction-service"
IMAGE_TAG = "v${env.BUILD_NUMBER}"
}
stages {
stage('1. Kéo mã nguồn') {
// Stage này chỉ cần kéo code, dùng luôn Jenkins Master (built-in)
agent { label 'built-in' }
steps {
echo "Đang kéo code từ nhánh main..."
git branch: 'main', url: 'https://github.com/YourUsername/afc-transaction-service.git'
}
}
stage('2. Kiểm tra chất lượng (Unit Test)') {
// Dùng một container Golang tạm thời (Dynamic Agent)
agent {
docker {
image 'golang:1.21-alpine'
// Jenkins sẽ tự động mount workspace hiện tại vào bên trong container này
}
}
steps {
echo "Đang chạy Unit Test trong môi trường Golang sạch..."
sh 'go version'
// Tải thư viện và chạy test
sh 'go mod download'
sh 'go test -v ./...'
}
}
stage('3. Đóng gói & Triển khai (Build Image)') {
// Quay lại dùng con Jenkins Master đã được "độ" Docker CLI ở Bài 2
agent { label 'built-in' }
steps {
echo "Code đã pass Test. Tiến hành đóng gói Image Production..."
// Lệnh này xài Docker-out-of-Docker (DooD)
sh "docker build -t ${APP_NAME}:${IMAGE_TAG} ."
sh "docker rm -f running-afc-service || true"
sh "docker run -d --name running-afc-service -p 8080:8080 ${APP_NAME}:${IMAGE_TAG}"
}
}
}
}
4. Đẳng cấp của sự "Sạch sẽ"
Khi anh em chạy Pipeline này, nếu theo dõi kỹ Console Output, anh em sẽ thấy một luồng ma thuật diễn ra:
- Jenkins tự động kéo image golang:1.21-alpine từ Docker Hub về.
- Nó tự động khởi chạy container, và quan trọng nhất: Nó tự động map cái thư mục chứa code (Workspace) của Jenkins vào bên trong container Golang đó.
- Các lệnh go test sẽ được chạy hoàn hảo vì môi trường đã có sẵn Go.
- Chạy xong, dòng log cuối cùng của stage đó sẽ là docker stop và docker rm. Mọi thứ tan biến, chỉ để lại một trạng thái xanh mướt báo hiệu code không có bug.
Tóm tắt
Với sức mạnh của việc kết hợp Jenkins Docker Hub, kỹ thuật DooD (Bài 2) và tính năng Docker Agent (Bài 3), anh em đã có trong tay một hệ thống CI/CD "độc cô cầu bại".
Hệ thống của anh em giờ đây không ngán bất kỳ dự án nào. Đưa code Node.js? Nó tự gọi container Node. Đưa code PHP? Nó tự gọi container PHP. Tất cả đều diễn ra mượt mà trên cùng một máy chủ Jenkins duy nhất mà không lo xung đột thư viện hay rác hệ thống.
All rights reserved