Danh sách bài viết trong series Bashscript từ cơ bản đến áp dụng vào DevOps
- Bài 1. Cơ Bản Bash Script trong DevOps
- Bài 2. Điều Kiện trong Bash DevOps: Xử Lý Logic Cơ Bản
- Bài 3. Vòng Lặp trong Bash DevOps: Tự Động Hóa Lặp Lại Hiệu Quả
- Bài 4. Xử Lý File trong Bash DevOps: Đọc, Ghi và Quản Lý Hiệu Quả
- Bài 5. Text Processing trong Bash DevOps: Grep, Awk, Sed Hiệu Quả
- Bài 6. Function trong Bash DevOps: Tái Sử Dụng Code Hiệu Quả
- Bài 7. Quản Lý Biến và Môi Trường trong Bash DevOps
- Bài 8. Cron Job trong Bash DevOps: Tự Động Hóa Theo Lịch Hiệu Quả
- Bài 9. Debug trong Bash DevOps: Tìm và Sửa Lỗi Hiệu Quả
- Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ Hiệu Quả
- Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline Hiệu Quả
- Bài 12. Quản Lý Hệ Thống với Bash DevOps: Theo Dõi và Can Thiệp Hiệu Quả
- Bài 13. Tự Động Hóa SSH với Bash DevOps: Quản Lý Multi-Server Hiệu Quả
- Bài 14. Bash và Docker trong DevOps: Quản Lý Container Hiệu Quả
- Bài 15. Monitoring với Bash DevOps: Báo Cáo Hệ Thống Hiệu Quả
- Bài 16. Bash Nâng Cao: Parallel Execution trong DevOps Hiệu Quả
- Bài 17. Bash và API trong DevOps: Gọi và Xử Lý API Hiệu Quả
- Bài 18. Bash và Cloud CLI trong DevOps: Quản Lý Cloud Hiệu Quả
- Bài 19. Bash và Security trong DevOps: Bảo Mật Script Hiệu Quả
- Bài 20. Best Practice trong Bash DevOps: Làm Chủ Script Hiệu Quả
Bash trong CI/CD – Tích Hợp Pipeline trong DevOps
Trong DevOps, CI/CD là trái tim của quy trình phát triển – từ build, test, đến deploy – và Bash là “con dao Thụy Sĩ” giúp bạn tự động hóa CI/CD. Với Bash trong CI/CD DevOps, bạn có thể viết pipeline Bash linh hoạt, mạnh mẽ mà không cần phụ thuộc quá nhiều vào tool phức tạp. Trong bài thứ mười một của series Bash Script Chuyên Sâu cho DevOps, tôi sẽ dẫn bạn qua cách tích hợp Bash vào pipeline (dùng GitLab CI làm ví dụ), kèm thực hành thực tế. Đây là kinh nghiệm tôi áp dụng trong pipeline thực chiến, không chỉ là lý thuyết đâu nhé!
Bash trong CI/CD Là Gì?
Vai Trò của Bash
Bash là ngôn ngữ chính để viết script trong pipeline:
- Kiểm tra điều kiện trước build/deploy.
- Xử lý file, log, hoặc gọi tool (Docker, AWS CLI).
- Tự động hóa task nhỏ mà không cần code dài.
Ví dụ: Script Bash kiểm tra disk trước khi deploy để tránh crash runner.
Tại Sao Quan Trọng trong DevOps?
- Linh hoạt: Dễ tích hợp với mọi tool CI/CD (Jenkins, GitLab, GitHub Actions).
- Nhanh: Thực thi task đơn giản mà không cần ngôn ngữ nặng (Python, Go).
- Tích hợp sẵn: Hầu hết runner CI/CD hỗ trợ Bash mặc định.
Thực tế: Tôi từng dùng Bash trong GitLab CI để kiểm tra version ứng dụng, tiết kiệm 30 phút debug thủ công mỗi lần deploy.
Cách Tích Hợp Bash vào CI/CD
Pipeline Bash Cơ Bản
CI/CD dùng file cấu hình (VD: .gitlab-ci.yml
) để chạy script Bash:
stages:
- check
check_system:
stage: check
script:
- echo "Kiểm tra hệ thống..."
- df -h /
script
: Chạy lệnh Bash trực tiếp.
Biến Môi Trường trong CI/CD
Dùng biến từ hệ thống CI (bài 7):
check_job:
script:
- echo "Job ID: $CI_JOB_ID"
- echo "Commit: $CI_COMMIT_SHA"
Điều Kiện và Exit Code
Kiểm soát pipeline với Bash:
pre_deploy:
script:
- bash check.sh
- if [ $? -ne 0 ]; then exit 1; fi
Thực Hành: Script Kiểm Tra Trước Deploy
Script Bash
Tạo pre_deploy_check.sh
:
#!/bin/bash
set -e # Thoát khi lỗi
trap 'echo "Lỗi tại dòng $LINENO: $BASH_COMMAND" >&2; exit 1' ERR
# Biến từ CI hoặc mặc định
DISK_THRESHOLD=${DISK_THRESHOLD:-80}
DEPLOY_ENV=${CI_ENVIRONMENT_NAME:-"dev"}
# Hàm kiểm tra disk
check_disk() {
local DISK=$(df -h / | tail -1 | awk '{print $5}' | cut -d'%' -f1)
if [ "$DISK" -gt "$DISK_THRESHOLD" ]; then
echo "Cảnh báo: Disk vượt $DISK% (ngưỡng $DISK_THRESHOLD%)" >&2
exit 1
else
echo "Disk ổn: $DISK%"
fi
}
# Hàm kiểm tra version
check_version() {
if [ -z "$CI_COMMIT_TAG" ]; then
echo "Không có tag, chỉ deploy dev/test" >&2
if [ "$DEPLOY_ENV" != "dev" ] && [ "$DEPLOY_ENV" != "test" ]; then
exit 1
fi
else
echo "Tag: $CI_COMMIT_TAG, OK cho $DEPLOY_ENV"
fi
}
# Gọi hàm
check_disk
check_version
echo "Kiểm tra hoàn tất, sẵn sàng deploy!"
Tích Hợp vào GitLab CI
Tạo .gitlab-ci.yml
:
stages:
- precheck
- deploy
precheck_job:
stage: precheck
script:
- bash pre_deploy_check.sh
variables:
DISK_THRESHOLD: "70"
deploy_job:
stage: deploy
script:
- echo "Deploying to $CI_ENVIRONMENT_NAME..."
when: on_success
Chạy và Test
-
Local:
chmod +x pre_deploy_check.sh ./pre_deploy_check.sh
- Kết quả mẫu:
Disk ổn: 42% Không có tag, chỉ deploy dev/test Kiểm tra hoàn tất, sẵn sàng deploy!
- Kết quả mẫu:
-
Mô phỏng CI:
CI_ENVIRONMENT_NAME="prod" ./pre_deploy_check.sh
- Kết quả:
Disk ổn: 42% Không có tag, chỉ deploy dev/test
- Kết quả:
-
Trong GitLab CI:
- Push code, pipeline chạy:
precheck_job
pass →deploy_job
chạy.- Disk > 70% hoặc env sai → fail.
- Push code, pipeline chạy:
Giải thích:
set -e
: Dừng khi lỗi (bài 10).trap ERR
: Báo lỗi chi tiết.${DISK_THRESHOLD:-80}
: Dùng biến CI hoặc mặc định.check_version
: Đảm bảo tag cho prod.
DevOps: Script này ngăn deploy sai môi trường hoặc khi hệ thống không sẵn sàng.
Debug trong CI
- Thêm debug:
precheck_job: script: - bash -x pre_deploy_check.sh
- Kiểm tra log pipeline trong GitLab UI.
Thực tế: Tôi từng quên kiểm tra disk trong CI, runner crash giữa chừng – script này giờ là “lá chắn” đầu tiên.
Ứng Dụng trong DevOps
Pipeline Thực Tế
- Build và push Docker:
build: script: - | docker build -t myapp:$CI_COMMIT_SHA . docker push myapp:$CI_COMMIT_SHA || { echo "Push fail" >&2 exit 1 }
Tích Hợp Tool
- Gọi AWS CLI:
deploy_aws: script: - bash deploy.sh
deploy.sh
:#!/bin/bash set -e aws s3 cp app.zip s3://my-bucket/
Case study: Một team dùng Bash trong Jenkins để kiểm tra RAM trước test, giảm 90% lỗi runner overload.
Best Practice
- Dùng biến CI thay hardcode.
- Thêm
set -e
vàtrap
cho script quan trọng. - Debug local trước khi push.
Kết Luận
Bash trong CI/CD DevOps với pipeline Bash là cách mạnh mẽ để tự động hóa CI/CD, đặc biệt trong GitLab CI Bash. Thực hành với pre_deploy_check.sh
cho thấy bạn có thể tích hợp Bash vào pipeline, đảm bảo deploy an toàn. Bài tiếp theo, chúng ta sẽ khám phá Quản Lý Hệ Thống với Bash – cách giám sát và can thiệp như pro.