[CI/CD] Triển khai với Jenkins Pipeline, Agent, Docker

Bài viết này hướng dẫn bạn cách triển khai ứng dụng Flask thông qua Jenkins Pipeline, sử dụng Docker trên hai server Jenkins Agent: một cho môi trường dev, một cho môi trường prod. Toàn bộ quá trình được tự động hóa từ bước lấy mã nguồn đến build và deploy container Flask.

Mô hình triển khai: 

  1. Jenkins Server (Master)
  2. Hai Jenkins Agent: dev-nodeprod-node
  3. Ứng dụng Flask từ GitHub
  4. Docker dùng để đóng gói và chạy container Flask

1. Cài đặt Docker trên 2 Server Agent

Tham khảo chi tiết tại: Hướng dẫn: cách cài đặt docker trên linux – mục 4

Trên cả hai server agent (dev và prod), thực hiện cài đặt Docker để hỗ trợ việc build và chạy container.

2. Kết nối Agent Dev & Prod vào Jenkins

Bước 1: Truy Cập Jenkins

Mở trình duyệt và truy cập Jenkins thông qua địa chỉ:

http://<jenkins-server-ip>:8080

Bước 2: Cài Đặt Plugin “SSH Agent”

Jenkins sử dụng plugin SSH để kết nối tới các agent từ xa.

  1. Vào Manage Jenkins → Manage Plugins
  2. Chọn tab Available
  3. Tìm plugin “SSH Agent”
  4. Chọn và nhấn Install without restart

Cài Plugin “SSH Agent”

Bước 3: Cấu Hình Node (Agent) Mới

Trên cả hai server agent, thực hiện:

sudo chown azureadmin:azureadmin /opt
sudo apt update
sudo apt install openjdk-21-jre -y

Tại Jenkins:

  1. Truy cập Manage Jenkins → Nodes
  2. Nhấn “New Node”

Ví dụ cấu hình node prod-node:

  • Name: prod-node
  • Type: Permanent Agent → nhấn OK
  • Remote root directory: /opt
  • Labels: prod (dùng để phân biệt khi chọn node thực thi pipeline)
  • Usage: Only build jobs with label expressions matching this node
  • Launch method: Launch agents via SSH

Bước 4: Thêm SSH Credentials

  1. Truy cập Manage Jenkins → Credentials → (global) → Add Credentials
  2. Chọn loại Username with password
    • Username: azureadmin (hoặc user khác có quyền SSH)
    • Password: mật khẩu tương ứng
    • ID: đặt tên dễ nhớ, ví dụ root-prod

Cấu hình tiếp node prod-node:

  • Host: địa chỉ IP máy prod
  • Credentials: chọn root-prod
  • Host key verification strategy: chọn Non verifying verification strategy

Lưu cấu hình.

Lặp lại tương tự với máy dev:

  • Node name: dev-node
  • Label: dev
  • Remote root directory: /opt
  • Credentials ID: root-dev
  • Host: IP máy dev

Kết Nối 2 Server Agent Vào Jenkins

3. Tạo Jenkins Pipeline triển khai Flask với Docker

Mục Tiêu:

  • Tự động hoá quá trình deploy ứng dụng Flask bằng Docker
  • Pipeline thực hiện trên cả môi trường dev và prod

Bước 1: Tạo Jenkins Pipeline Mới

  1. Vào Jenkins Dashboard
  2. Nhấn New Item
  3. Chọn Pipeline
  4. Đặt tên: flask-pipeline → nhấn OK

Tạo Jenkins Pipeline

Bước 2: Viết Jenkinsfile (Pipeline Script)

pipeline {
    agent {
        label 'prod'
    }

    stages {
        stage('Clone Source') {
            steps {
                sh '''
                    rm -rf /opt/python
                    git clone https://github.com/ttnguyenblog/python /opt/python
                '''
            }
        }

        stage('Remove Container') {
            steps {
                sh 'docker rm web -f || true'
            }
        }

        stage('Remove Image') {
            steps {
                sh 'docker image remove flask:v1 -f || true'
            }
        }

        stage('Build Image') {
            steps {
                sh 'docker build -t flask:v1 /opt/python'
            }
        }

        stage('Deploy Container') {
            steps {
                sh 'docker run -dit --name web -p 80:5000 flask:v1'
            }
        }
    }
}

Lưu ý: Bạn có thể đổi label 'prod' thành dev nếu muốn chạy pipeline trên node dev.

Bước 3: Kiểm Tra Kết Quả

  • Nhấn Build Now trên Pipeline
  • Truy cập địa chỉ IP của agent:
http://<ip-agent>:80
  • Xác minh ứng dụng Flask hiển thị đúng nội dung mong đợi

Xem thêm:

[CI/CD] Triển khai ứng dụng Java với Jenkins, Ansible và Tomcat

[CI/CD] Hướng dẫn triển khai với Apache, Docker, Jenkins, Ansible

[CI/CD] Hướng dẫn triển khai với Apache, Jenkins

Hướng dẫn cài đặt và cấu hình Jenkins trên Ubuntu 22.04

Nguyễn Tiến Trường

Mình viết về những điều nhỏ nhặt trong cuộc sống, Viết về câu chuyện những ngày không có em