Hướng dẫn Setup Jenkins cho hệ thống Monolith - Bài 10: Xây dựng Pipeline hoàn chỉnh đầu tiên: Build và Package mã nguồn Monolith
Sau 9 bài học chuẩn bị hạ tầng và các mảnh ghép rời rạc, giờ là lúc chúng ta xây dựng một đường ống (Pipeline) khép kín đầu tiên: tự động kéo mã nguồn từ Git, cài đặt các thư viện phụ thuộc, biên dịch mã nguồn và đóng gói thành một tệp thực thi hoàn chỉnh (Artifact) lưu trữ ngay trên Jenkins.
1. Luồng hoạt động của Pipeline đóng gói Monolith
Khác với kiến trúc Microservices phải chia nhỏ hàng chục pipeline, hệ thống Monolith hội tụ mọi thứ vào một luồng duy nhất. Một quy trình chuẩn ở giai đoạn Build & Package gồm 4 bước cốt lõi:
-
Checkout SCM: Kéo đúng nhánh mã nguồn (
mainhoặcdevelop) thông qua SSH Key bảo mật. -
Prepare Environment: Khởi tạo các biến môi trường, tạo tệp cấu hình (
.envhoặcapplication.properties) từ Jenkins Credentials. -
Compile & Build: Chạy công cụ biên dịch (Maven, Composer, NPM hoặc Go build) để kiểm tra lỗi cú pháp và gom các thư viện.
-
Package & Archive Artifact: Đóng gói toàn bộ mã nguồn đã build thành một tệp nén duy nhất (
.jar,.war,.tar.gz, hoặc binary) và lưu trữ lại để chuẩn bị cho bước Deploy sau này.
2. Cấu hình hoàn chỉnh trong Jenkinsfile
Dưới đây là mẫu Jenkinsfile thực chiến đặt tại thư mục gốc của dự án Monolith (minh họa cho cả 2 trường phái phổ biến: ứng dụng cần biên dịch ra binary/package như Java/Golang và ứng dụng dạng script/bundle như PHP Laravel/Node.js):
Groovy
pipeline {
agent any
options {
// Giữ lại tối đa 10 bản build gần nhất để tránh đầy ổ cứng server
buildDiscarder(logRotator(numToKeepStr: '10', artifactNumToKeepStr: '5'))
// Hủy pipeline nếu treo quá 30 phút
timeout(time: 30, unit: 'MINUTES')
// Hiển thị thời gian thực thi ở từng dòng log
timestamps()
}
environment {
APP_NAME = "monolith-core-system"
BUILD_VERSION = "v1.0.${env.BUILD_NUMBER}"
}
stages {
stage('1. Checkout Source Code') {
steps {
echo "=== Kéo mã nguồn phiên bản ${BUILD_VERSION} ==="
checkout scm
}
}
stage('2. Inject Configuration') {
steps {
echo "=== Tạo file cấu hình môi trường an toàn ==="
// Lấy nội dung file .env đã lưu trong Jenkins Secret File đưa vào workspace
withCredentials([file(credentialsId: 'monolith-env-staging', variable: 'ENV_FILE')]) {
sh 'cp $ENV_FILE .env'
}
}
}
stage('3. Install & Compile Monolith') {
steps {
echo "=== Bắt đầu cài đặt dependencies và biên dịch ==="
script {
// Tùy thuộc vào ngôn ngữ của Monolith, bạn mở comment dòng tương ứng:
// --- Ví dụ 1: Đối với PHP / Laravel + Frontend ---
sh '''
composer install --no-interaction --prefer-dist --optimize-autoloader --no-dev
npm ci
npm run build
'''
// --- Ví dụ 2: Đối với Java Spring Boot (Maven) ---
// sh 'mvn clean package -DskipTests'
// --- Ví dụ 3: Đối với Golang Monolith ---
// sh 'CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -o bin/monolith-app ./cmd/main.go'
}
}
}
stage('4. Package Artifact') {
steps {
echo "=== Đóng gói mã nguồn thành bản phân phối (Artifact) ==="
// Nén toàn bộ mã nguồn đã build (loại bỏ thư mục .git nặng nề) thành 1 file duy nhất
sh "tar --exclude='.git' --exclude='node_modules' -czf ${APP_NAME}-${BUILD_VERSION}.tar.gz ."
}
}
}
post {
success {
echo "=== Lưu trữ gói Artifact lên Jenkins Server ==="
// Lưu trữ file nén để có thể tải về hoặc dùng cho các job Deploy ở Giai đoạn 3
archiveArtifacts artifacts: "${APP_NAME}-${BUILD_VERSION}.tar.gz", fingerprint: true
}
always {
echo "=== Dọn dẹp các tệp nhạy cảm trong Workspace ==="
sh 'rm -f .env'
}
}
}
3. Tạo Pipeline Job trên giao diện Jenkins để chạy Jenkinsfile
Sau khi bạn đã commit và push tệp Jenkinsfile ở trên lên kho chứa Git của dự án Monolith, hãy kết nối nó với Jenkins:
-
Từ màn hình chính của Jenkins, chọn New Item.
-
Nhập tên Job:
monolith-production-pipeline, chọn loại Pipeline và bấm OK. -
Cuộn xuống phần Pipeline ở cuối trang:
-
Definition: Chọn
Pipeline script from SCM. -
SCM: Chọn
Git. -
Repository URL: Nhập địa chỉ SSH Git của dự án Monolith.
-
Credentials: Chọn khóa SSH đã tạo ở Bài 5 (
jenkins-git-ssh-key). -
Branch Specifier: Điền
*/main(hoặc nhánh chứaJenkinsfile). -
Script Path: Giữ nguyên mặc định là
Jenkinsfile.
-
-
Bấm Save và nhấn Build Now để tận hưởng thành quả.
4. Kiểm tra kết quả sau khi chạy xong
Khi toàn bộ các ô Stage chuyển sang màu xanh lá trên giao diện Stage View:
-
Bạn sẽ thấy ngay tại trang chính của Job xuất hiện mục Last Successful Artifacts chứa tệp
monolith-core-system-v1.0.1.tar.gz. -
Kể từ giây phút này, mỗi lần đội ngũ phát triển cập nhật code, bạn đã có một gói sản phẩm hoàn chỉnh, sạch sẽ và đồng nhất 100%, sẵn sàng đưa qua khâu kiểm thử tự động hoặc đẩy lên máy chủ bất cứ lúc nào.
All rights reserved