Tự Động Hóa Build/Test PR từ GitHub bằng Jenkins Chuyên mục Devops 2025-06-19 3 Lượt xem 3 Lượt thích 0 Bình luận
Mục tiêu: sau bài này bạn sẽ có một Job Jenkins tự động quét repository, phát hiện PR mới, chạy pipeline kiểm thử–phân tích (CI) và bắn trạng thái về GitHub.
Đối tượng: đội ngũ dev, DevOps hoặc bất kỳ ai đang dùng GitHub + Jenkins và muốn “gắn CI” cho PR mà không phải cấu hình thủ công từng lần.
1. Vì sao nên build PR thay vì build branch thường?
Branch build truyền thống | Build Pull Request |
---|---|
Chỉ biết trạng thái nhánh | Biết trạng thái PR (trước khi merge) |
Không chặn merge code “hỏng” | Có thể fail check → cản merge |
Dễ “trùng” build (branch + PR) | Một job duy nhất, gọn gàng |
Không hiển thị chi tiết Coverage, Sonar… trên PR | PR tab hiển thị thẳng trạng thái CI |
Tóm lại: build PR giúp review‑team quyết định “merge hay không” thông qua đèn xanh‑đỏ ngay trên giao diện GitHub.
2. Chuẩn bị
-
Jenkins 2.414+ (hoặc bản mới nhất).
-
Plugin:
-
GitHub Integration
-
GitHub Branch Source
-
Pipeline: Multibranch
-
Credentials, SCM API (thường đã có sẵn)
-
-
GitHub Personal Access Token (PAT)
-
Scope tối thiểu: repo, read:org, admin:repo_hook.
-
-
Repository có sẵn Jenkinsfile ở root.
3. Tạo GitHub credential
-
Jenkins → Manage Jenkins → Credentials → Global → Add Credentials.
-
Kind: Username with password (bắt buộc)
-
Username: tài khoản GitHub (hoặc tên bot).
-
Password: PAT vừa tạo.(personal github token)
-
ID: đặt dễ nhớ, ví dụ github-pat.
4. Khai báo GitHub server (một lần duy nhất)
-
Jenkins → Manage Jenkins → Configure System.
-
Mục GitHub → Add GitHub Server:
-
Name: GitHub
-
API URL: https://api.github.com
-
Credentials: chọn github-pat
-
Test Connection → phải hiện “Credentials verified …”.
-
5. Tạo Multibranch Pipeline job
-
Jenkins Dashboard → New Item → đặt tên: liveapp-api-ci.
-
Chọn Multibranch Pipeline → OK.
5.1 Cấu hình Branch Sources → GitHub
Trường | Giá trị |
---|---|
Credentials | github-pat |
Owner | sondh (hoặc user/org của bạn) |
Repository | app_api |
5.2 Behaviours (quan trọng)
Behaviour | Strategy / Thiết lập |
---|---|
Discover branches | Exclude branches that are also filed as PRs |
Discover pull requests from origin | The current pull request revision |
Discover pull requests from forks | The current pull request revision Trust: From users with Admin or Write permission |
5.3 Triggers
Bạn không cần cron; Webhook GitHub sẽ tự bắn. Nếu muốn quét định kỳ để “dự phòng”, thêm:
periodicFolderTrigger {
interval('1h') // mỗi giờ quét repo một lần
}
Save job, sau đó click “Scan Multibranch Pipeline Now” để Jenkins tạo job con như PR-123, PR-124…
6. Viết Jenkinsfile chỉ chạy khi là PR
pipeline {
agent any
stages {
stage('Run only on PR') {
/* env.CHANGE_ID có giá trị khi build PR */
when { expression { env.CHANGE_ID != null } }
stages {
stage('Checkout') {
steps { checkout scm }
}
stage('Install deps') {
steps {
sh '''
python -m venv venv
. venv/bin/activate
pip install -r requirements-dev.txt
'''
}
}
stage('Unit Tests + Coverage') {
steps {
sh '''
. venv/bin/activate
coverage run -m pytest -v
coverage xml
'''
}
}
stage('Sonar') {
environment {
SCANNER_HOME = tool 'sonar-scanner'
}
steps {
script {
withSonarQubeEnv('sonarqube-prod') {
sh "${SCANNER_HOME}/bin/sonar-scanner -Dsonar.projectKey=liveapp -Dsonar.python.coverage.reportPaths=coverage.xml -Dsonar.branch.name=PR-${env.CHANGE_ID}"
}
}
}
}
stage('Await Quality Gate') {
steps {
timeout(time: 30, unit: 'MINUTES') {
waitForQualityGate abortPipeline: true
}
}
}
}
post {
success {
echo "✅ PR #${env.CHANGE_ID} passed CI."
}
failure {
echo "❌ PR #${env.CHANGE_ID} failed."
}
}
}
}
}
Lưu ý
CHANGE_ID, CHANGE_BRANCH, CHANGE_TARGET… chỉ có khi build PR.
Điều kiện when ở cấp stage giúp các build branch khác (nếu có) bị skip.
7. Những lỗi thường gặp & cách fix nhanh
Triệu chứng | Nguyên nhân / Fix |
---|---|
Credentials không hiển thị | Dùng sai loại. Phải là Username with password (password = PAT). |
Validate repo 404 | Nhập URL .git hoặc owner/repo sai. Dùng bản rút gọn https://github.com/org/repo. |
Không tạo job PR | Chọn source Git thay vì GitHub; thiếu “Discover pull requests”. |
PR build skip | Pipeline không tìm thấy CHANGE_ID → job thực chất đang build branch thường. Kiểm tra lại Branch Source. |
Sonar không có branch PR | Quên -Dsonar.branch.name=PR-${CHANGE_ID} hoặc server Sonar < 7.9 (không support branch). |
8. Kết luận
Chỉ với GitHub PAT + Jenkins Multibranch Pipeline, bạn đã:
-
Tự động quét PR → build → kiểm thử → phân tích code.
-
Đặt Quality Gate để “chặn” PR kém chất lượng.
-
Truyền trạng thái CI về GitHub → đội review thấy ngay “✓” hay “×” trên mỗi commit.
Thao tác này không chỉ giảm thiểu bug lọt vào main branch mà còn giúp reviewer tập trung vào chất lượng code thay vì thao tác thủ công.
Chúc bạn triển khai thành công! Có câu hỏi hay vướng chỗ nào, bình luận bên dưới – mình sẽ hỗ trợ sớm nhất. 🎉
Bình luận (0)