+2

Series Jenkins #5: Bắt tay với GitHub – Tự động hóa hoàn toàn với Webhook

Chào anh em! Trong Bài 4, chúng ta đã thành công đưa quy trình CI/CD vào những dòng code bằng Jenkinsfile. Tuy nhiên, nếu tinh ý, anh em sẽ nhận ra một điểm hơi "cấn": Mỗi lần muốn chạy quy trình, chúng ta vẫn phải vào giao diện Jenkins và tự tay bấm nút Build Now.

Thử tưởng tượng anh em đang đi cafe cuối tuần, sếp gọi điện bảo có hot-fix cần deploy gấp. Chẳng lẽ lại phải lóc cóc bật máy tính, đăng nhập Jenkins để bấm nút? Thế thì gọi gì là "tự động hóa" nữa!

Triết lý của CI/CD hiện đại là: Mọi thứ bắt đầu từ Git. Nhiệm vụ của Developer chỉ là gõ mã nguồn và đẩy lên kho chứa (Git Push / Merge Request). Tất cả những việc còn lại hệ thống phải tự lo.

Hôm nay, tôi sẽ hướng dẫn anh em cách thiết lập "đường dây nóng" giữa GitHub và Jenkins thông qua một công nghệ gọi là Webhook.

1. Webhook là gì? (Lý thuyết thực chiến)

Để hai hệ thống khác nhau (GitHub và Jenkins) nói chuyện được với nhau, chúng ta cần một cơ chế thông báo.

Anh em hãy tưởng tượng Webhook giống như cái chuông cửa nhà anh em vậy:

  • GitHub là vị khách đứng ngoài cổng. Mỗi khi có ai đẩy code mới lên kho chứa (Sự kiện - Event), vị khách này sẽ nhấn chuông.
  • Jenkins là bác quản gia ở trong nhà. Khi nghe tiếng chuông (nhận được HTTP POST Request từ GitHub), bác ấy sẽ lập tức chạy ra nhận bản code mới nhất và bắt tay vào quy trình Pipeline mà anh em đã định nghĩa.

Lưu ý "xương máu" cho anh em làm local: Vì GitHub nằm trên Internet, nó không thể "nhấn chuông" một cái Jenkins đang chạy ở localhost (máy tính cá nhân) của anh em được. Để thực hành bài này, anh em cần cài thêm công cụ Ngrok (chỉ tốn 1 phút) để biến localhost:8080 thành một đường link Public. Nếu anh em đang cài Jenkins trên Server thật (VPS/EC2) có IP tĩnh, thì cứ dùng IP đó luôn.

2. Thực hành: Kết nối GitHub và Jenkins

Chúng ta sẽ chia công việc này làm 3 bước. Cứ bình tĩnh làm từng bước một nhé.

Bước 1: Tạo Personal Access Token (PAT) trên GitHub

Jenkins cần một cái "chìa khóa" để có thể đăng nhập vào GitHub của anh em và kéo code về (đặc biệt là với các Private Repository).

  1. Đăng nhập GitHub, vào Settings (ở avatar góc trên bên phải) > Developer settings > Personal access tokens > Tokens (classic).
  2. Nhấn Generate new token (classic).
  3. Đặt tên (Note) là Jenkins-Token. Ở phần chọn quyền (Scopes), anh em tick chọn repo và admin:repo_hook.
  4. Nhấn tạo và COPY MÃ TOKEN này lại ngay lập tức (nó chỉ hiện một lần duy nhất).

Bước 2: Dạy Jenkins cách dùng Token

Bây giờ chúng ta mang cái chìa khóa vừa tạo về đưa cho bác quản gia Jenkins.

  1. Mở Jenkins, vào Dashboard > Manage Jenkins > Credentials.
  2. Click vào (global) > Add Credentials.
  3. Ô Kind: Chọn Secret text.
  4. Ô Secret: Dán đoạn mã Token vừa copy ở GitHub vào đây.
  5. Ô ID: Đặt tên là github-token (nhớ tên này để lát nữa dùng).
  6. Nhấn Create.

Bước 3: Gắn "Chuông cửa" Webhook trên GitHub

  1. Vào kho chứa (Repository) dự án của anh em trên GitHub.
  2. Chuyển sang tab Settings của repo đó > Webhooks > Add webhook.
  3. Ô Payload URL: Đây là nơi anh em điền địa chỉ Jenkins của mình. Cú pháp bắt buộc phải là: http://<IP-Jenkins-Của-Bạn>:8080/github-webhook/ (Lưu ý: Bắt buộc phải có dấu / ở cuối).
  4. Ô Content type: Chọn application/json.
  5. Phần Which events...: Chọn Just the push event (Chỉ kích hoạt khi có lệnh Push).
  6. Nhấn Add webhook. Nếu tải lại trang mà thấy dấu tích màu xanh lá cây xuất hiện cạnh webhook là thành công!

3. Cập nhật Jenkinsfile để lắng nghe sự kiện

Mọi thứ đã kết nối xong. Việc cuối cùng là cập nhật lại cái Pipeline Job ở Bài 4 để nó hiểu rằng: "Hãy lấy code từ GitHub và lắng nghe Webhook nhé".

Vào cấu hình của Job My-First-Pipeline trên Jenkins, tích chọn ô GitHub hook trigger for GITScm polling.

Sau đó, anh em sửa đổi đoạn code Pipeline như sau:

pipeline {
    agent any
    
    stages {
        stage('Kéo Code (Checkout)') {
            steps {
                echo "Đang kéo mã nguồn từ GitHub..."
                // Dùng plugin Git để kéo code bằng Credentials đã tạo
                git branch: 'main', 
                    credentialsId: 'github-token', 
                    url: 'https://github.com/Tên-Của-Bạn/Ten-Repo-Cua-Ban.git'
            }
        }
        
        stage('Build Code') {
            steps {
                echo "Đang tải thư viện và build code..."
            }
        }
        
        stage('Deploy') {
            steps {
                echo "Hệ thống đã sẵn sàng!"
            }
        }
    }
}

4. Tận hưởng phép màu

Giờ thì dẹp giao diện Jenkins sang một bên đi. Anh em hãy mở IDE lên, sửa một dòng code bất kỳ trong dự án, sau đó mở Terminal gõ:

git add .
git commit -m "update: Tự động hóa CI/CD với Webhook"
git push origin main

Ngay lập tức, khi lệnh git push vừa chạy xong, hãy liếc mắt sang màn hình Jenkins. Anh em sẽ thấy một Job mới tự động được kích hoạt và chạy rần rần mà không cần ai chạm vào.

Xin chúc mừng! Anh em đã chính thức sở hữu một dây chuyền CI/CD tự động 100% từ khâu code cho đến khâu build.

Ở bài tiếp theo, Bài 6, chúng ta sẽ đưa vũ khí tối thượng của DevOps là Docker vào trong quy trình này, để việc đóng gói và triển khai ứng dụng đạt đến mức độ hoàn hảo và ổn định nhấ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í