Chuyển tới nội dung

Jenkins

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

Mô tả

Job/ Project

Là một tác vụ Jenkins thực hiện, ví dụ build code, test, deploy

Pipline

Là chuỗi các bước (stages + steps) mô tả toàn bộ quy trình CI/CD bằng code (Jenkinsfile)

Plugin

Là các thành phần mở rộng cho Jenkins (Git plugin, Doker plugin, SonarQube plugin,v..v..)

Executor

Là tiến trình thực thi job trên agent

Workspace

Thư mục nơi Jenkins lưu mã nguồn và kết quả build

Node

Là bất kỳ máy (vật lý/ảo/container) nào Jenkins có thể dùng để chạy job

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 AgentMô tả
Static AgentLà máy cố định (vật lý hoặc ảo) được cấu hình sẵn.
Dynamic AgentTạ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 AgentMaster chủ động kết nối tới Agent qua SSH.
Docker AgentMỗ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 trong Jenkinsfile.
  • Trường agent dù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 post{} sẽ được thực thi sau khi các stage hoàn tất các công việc được chỉ định. Trong Jenkinsfile trê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 PipelineScripted Pipeline
Ngôn ngữCú pháp DSL (Domain-Specific Language) mở rộng của JenkinsGroovy thuần
Cấu trúcRõ 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ễ đọcDễ đọc, dễ bảo trì, thân thiện với người mớiKhó đọc hơn, đòi hỏi hiểu biết Groovy
Tính năng hỗ trợ sẵnCó nhiều keyword tiện dụng như agent, environment, post, toolsPhải tự khai báo hoặc xử lý bằng code
Khả năng mở rộng / logic phức tạpHạn chế hơnRấ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ụngHầu hết dự án thực tế, CI/CD chuẩnKhi 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...'
}
}

Liên hệ