+2

Series Jenkins #4: Kỷ nguyên của Code - Khởi môn với Jenkins Pipeline (Declarative Pipeline)

Chào anh em! Ở Bài 3, chúng ta đã cùng nhau "khởi động" bác quản gia bằng một tác vụ Freestyle Project đơn giản. Tuy nhiên, ở cuối bài trước tôi có nhắc đến một điểm yếu chí mạng của Freestyle: Mọi thứ đều là click chuột.

Hãy thử tưởng tượng, quy trình build một dự án Backend phức tạp cần tới 20 bước click chuột khác nhau. Đùng một cái, server Jenkins lỗi ổ cứng, bay màu dữ liệu. Anh em sẽ phải ngồi vắt óc nhớ lại xem mình đã click vào những ô nào để cấu hình lại từ đầu. Thật là thảm họa!

Để giải quyết nỗi đau này, giới DevOps áp dụng một triết lý gọi là Pipeline as Code (Quy trình dưới dạng Code). Thay vì click chuột, chúng ta sẽ gõ code để ra lệnh cho Jenkins. Và hôm nay, chúng ta sẽ bước vào kỷ nguyên đó với Jenkins Pipeline.

1. Jenkins Pipeline và "Bí kíp" Jenkinsfile là gì?

Nói một cách dân dã, Pipeline (Đường ống) là một tập hợp các bước nối tiếp nhau để đưa code từ kho chứa (Git) ra đến server thật (Production).

Thay vì click chuột trên giao diện UI, toàn bộ các bước này sẽ được anh em định nghĩa bằng chữ, viết vào một file text duy nhất có tên là Jenkinsfile.

Tại sao viết code lại ngon hơn click chuột?

  • Version Control: Vì Jenkinsfile chỉ là một file text chứa code, anh em có thể commit nó lên GitHub/GitLab cùng với mã nguồn dự án luôn. Ai sửa quy trình, sửa lúc nào, thêm bước gì... đều có lịch sử rõ ràng.
  • An toàn tuyệt đối: Lỡ Jenkins có sập? Không sao cả! Dựng một con Jenkins mới, trỏ vào repo GitHub, nó sẽ tự động đọc Jenkinsfile và chạy lại y chang không sai một ly.
  • Trực quan: Jenkins cung cấp một giao diện hiển thị các bước (Stage View) cực kỳ đẹp mắt, xanh đỏ rõ ràng để anh em biết tiến trình đang kẹt ở đâu.

2. Cấu trúc của một Declarative Pipeline

Jenkins hỗ trợ hai cú pháp viết Pipeline là Scripted (phức tạp, thiên về lập trình) và Declarative (khai báo, dễ đọc, có cấu trúc chặt chẽ). Là những người đề cao sự rõ ràng, chúng ta sẽ học Declarative Pipeline.

Một Declarative Pipeline giống như một công thức nấu ăn, luôn tuân theo một bộ khung cố định.

Anh em nhìn đoạn code dưới đây là hiểu ngay:

pipeline {
    agent any // 1. Ai sẽ làm việc này? (Bất kỳ Node nào rảnh)

    stages { // 2. Danh sách các công đoạn
        stage('Build Code') { // Công đoạn 1
            steps {
                echo "Đang tải thư viện và build code..."
            }
        }
        
        stage('Chạy Test') { // Công đoạn 2
            steps {
                echo "Đang chạy Unit Test..."
            }
        }
        
        stage('Deploy') { // Công đoạn 3
            steps {
                echo "Đang đẩy code lên Server Production!"
            }
        }
    }
}

Phân tích từ vựng một chút nhé:

  • pipeline {}: Chứa toàn bộ nội dung của quy trình. Bắt buộc phải có.
  • agent any: Báo cho Jenkins biết là "Anh Node nào đang rảnh thì vào làm giùm tôi". Nếu sau này anh em có nhiều Node (như đã nói ở Bài 2), anh em có thể chỉ định agent { label 'linux-node' }.
  • stages {}: Chứa toàn bộ các giai đoạn của quy trình.
  • stage('Tên giai đoạn') {}: Chia nhỏ quy trình ra. Ví dụ: Build, Test, Deploy.
  • steps {}: Những câu lệnh thực tế sẽ chạy trong giai đoạn đó. (Ví dụ: sh 'npm install' hoặc echo 'Hello').

3. Thực hành: Viết Pipeline đầu tay

Không dài dòng lý thuyết nữa, bắt tay vào làm thôi!

Bước 1: Tạo Pipeline Job

  • Trở lại Dashboard của Jenkins, chọn New Item.
  • Nhập tên Job: My-First-Pipeline.
  • Chọn loại là Pipeline (thay vì Freestyle project như bài trước).
  • Nhấn OK.

Bước 2: Gõ code Pipeline

  • Anh em cuộn thẳng xuống dưới cùng, phần Pipeline.
  • Ở mục Definition, để mặc định là Pipeline script.
  • Trong khung soạn thảo to đùng bên dưới, anh em hãy copy và paste đoạn code Groovy ở mục 2 phía trên vào.
  • Nhấn Save.

Bước 3: Chạy và tận hưởng thành quả

  • Nhấn Build Now để kích hoạt Pipeline.
  • Bây giờ, hãy nhìn ra giữa màn hình. Anh em sẽ thấy một giao diện mang tên Stage View hiện ra.

Các khối vuông (block) màu xanh lá cây tương ứng với các stage (Build Code -> Chạy Test -> Deploy) sẽ lần lượt hiện lên cùng thời gian chạy. Trông chuyên nghiệp và "xịn xò" hơn hẳn cái giao diện Freestyle cũ rích đúng không?

Nếu muốn xem log chi tiết của từng bước (lỗi ở đâu), anh em chỉ cần rê chuột vào cái khối vuông đó và click vào nút Logs.

Tóm lại

Hôm nay anh em đã chính thức đặt chân vào thế giới của Pipeline as Code. Chúng ta đã học được:

  1. Sự ưu việt của việc định nghĩa CI/CD bằng Jenkinsfile.
  2. Cấu trúc cơ bản của một Declarative Pipeline (Agent -> Stages -> Stage -> Steps).
  3. Cách chạy và đọc giao diện Stage View.

Tuy nhiên, đoạn code trên mới chỉ là "chạy giả lập" (dùng lệnh echo để in ra màn hình). Trong thực tế, Jenkins không tự đẻ ra code để build được. Nó cần phải lấy code từ đâu đó.

Và kho chứa code phổ biến nhất hiện nay chính là GitHub. Ở Bài 5: Bắt tay với GitHub – Tự động hóa hoàn toàn, tôi sẽ hướng dẫn anh em cách kết nối Jenkins với GitHub, để mỗi khi anh em gõ git push, Jenkins sẽ tự động biết và lao vào làm việc ngay lập tức mà không cần chúng ta phải bấm nút "Build Now" nữa.


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í