Bài 11. Bash trong CI/CD DevOps: Tích Hợp Pipeline 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

  1. 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!
  2. 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
  3. Trong GitLab CI:

    • Push code, pipeline chạy:
      • precheck_job pass → deploy_job chạy.
      • Disk > 70% hoặc env sai → fail.

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 -etrap 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.

Điều hướng chuỗi bài viết<< Bài 10. Error Handling Bash DevOps: Xử Lý Ngoại Lệ 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ả
Chia sẻ bài viết:
Theo dõi
Thông báo của
0 Góp ý
Được bỏ phiếu nhiều nhất
Mới nhất Cũ nhất
Phản hồi nội tuyến
Xem tất cả bình luận

Có thể bạn quan tâm