0

Hướng dẫn Setup Jenkins cho hệ thống Monolith - Bài 9: Quản lý biến môi trường (Environment Variables) và Credentials an toàn trong Jenkins

Trong quá trình vận hành hệ thống Monolith, ứng dụng của bạn chắc chắn cần kết nối đến Database (MySQL/PostgreSQL), Redis, gọi API thanh toán, hoặc cấu hình domain. Nếu bạn viết thẳng các thông tin này vào mã nguồn (application.yml, .env) rồi đẩy lên Git, rủi ro lộ lọt thông tin là cực kỳ cao. Jenkins cung cấp cơ chế quản lý biến môi trường và kho lưu trữ mật khẩu mã hóa rất chặt chẽ.

1. Phân loại biến môi trường trong Jenkins Pipeline

Khi viết Jenkinsfile cho ứng dụng Monolith, bạn có thể khai báo biến môi trường ở 3 cấp độ khác nhau:

  1. Global Environment (Cấp toàn cục): Áp dụng cho toàn bộ pipeline, khai báo ngay dưới khối pipeline.

  2. Stage Environment (Cấp từng Stage): Chỉ có tác dụng bên trong một stage cụ thể nào đó.

  3. Credentials Binding (Cấp bảo mật mật khẩu): Lấy trực tiếp các chuỗi thông tin nhạy cảm từ kho lưu trữ mã hóa của Jenkins (Credentials Store) và gán tạm vào biến môi trường khi build.

2. Hướng dẫn lưu trữ thông tin nhạy cảm vào Jenkins Credentials

Trước khi gọi được vào Jenkinsfile, bạn phải lưu chúng vào kho chứa an toàn của Jenkins:

  1. Trên giao diện Jenkins, vào Dashboard -> Credentials -> System -> Global credentials (unrestricted).

  2. Bấm Add Credentials ở menu bên trái.

  3. Chọn các loại phù hợp với nhu cầu của Monolith:

    • Secret text: Dùng cho API Key, JWT Secret, Token truy cập dịch vụ ngoài.

    • Username with password: Dùng cho tài khoản đăng nhập Database, Docker Hub, hoặc Private Git Registry.

  4. Nhập giá trị thực tế vào ô Secret, đặt một mã định danh dễ nhớ tại ô ID (ví dụ: monolith-db-password hoặc production-jwt-secret), rồi bấm Create.

3. Cấu hình biến môi trường và Credentials trong Jenkinsfile

Dưới đây là đoạn mã mẫu minh họa cách tích hợp linh hoạt các biến môi trường và bảo mật Credentials trong một Jenkinsfile của hệ thống Monolith:

Groovy

pipeline {
    agent any

    // 1. Khai báo biến môi trường toàn cục (Dành cho thông tin không nhạy cảm)
    environment {
        APP_ENV = "production"
        APP_PORT = "8080"
        // Gọi Credentials dạng Secret Text thông qua hàm credentials()
        API_TOKEN = credentials('monolith-api-token')
    }

    stages {
        stage('1. Build với Biến môi trường') {
            steps {
                echo "Đang build ứng dụng Monolith cho môi trường: ${env.APP_ENV}"
                sh 'mvn clean package -DskipTests'
            }
        }

        stage('2. Deploy với Thông tin bảo mật (Credentials)') {
            steps {
                // 2. Sử dụng khối withCredentials để bọc lấy thông tin nhạy cảm tạm thời
                withCredentials([usernamePassword(credentialsId: 'monolith-db-credentials', 
                                                  usernameVariable: 'DB_USER', 
                                                  passwordVariable: 'DB_PASS')]) {
                    script {
                        echo "Kết nối tới Database với tài khoản: ${DB_USER}"
                        // Thực thi lệnh deploy, truyền biến môi trường an toàn vào script nội bộ
                        sh "./deploy-script.sh --user ${DB_USER} --pass ${DB_PASS} --token ${API_TOKEN}"
                    }
                }
            }
        }
    }
    
    post {
        success {
            echo "Đã xóa sạch các biến môi trường tạm thời sau khi hoàn tất."
        }
    }
}

4. Những nguyên tắc "vàng" về bảo mật cho Monolith CI/CD

  • Tuyệt đối không hardcode: Không bao giờ viết trực tiếp password hoặc secret key vào Jenkinsfile hay source code Monolith.

  • Che giấu Log (Masking): Jenkins cực kỳ thông minh, nếu các biến được lấy từ Credentials Store vô tình bị in ra màn hình console (echo), Jenkins sẽ tự động thay thế chúng bằng chuỗi ký tự **** để tránh bị lộ trong lịch sử build.

  • Giới hạn quyền truy cập: Chỉ cấp quyền cấu hình và xem Credentials cho những tài khoản DevOps hoặc Tech Lead thực sự cần thiết.


All rights reserved

Viblo
Hãy đăng ký một tài khoản Viblo để nhận được nhiều bài viết thú vị hơn.
Đăng kí