0

Update Bash Script & Makefile – Cặp đôi tự động hóa thần thánh

1. 🧠 Là gì? Sinh ra để giải quyết vấn đề gì?

Bash Script là gì?

  • Là file .sh chứa các dòng lệnh shell (thường là Bash) được thực thi tuần tự.

  • Sinh ra để:

    • Tự động hoá các thao tác hệ thống lặp đi lặp lại như cài đặt, deploy, backup, xử lý file...

    • Thay vì gõ thủ công từng lệnh → chỉ cần chạy 1 file.


Makefile là gì?

  • Là file định nghĩa các "target" (ví dụ: test, build, deploy) dùng bởi lệnh make.

  • Sinh ra để:

    • Quản lý nhiều lệnh thành menu điều khiển – ngắn gọn, dễ nhớ.

    • Dùng nhiều trong build code C/C++, nhưng giờ được dùng rộng rãi cho bất kỳ project nào.


2. 💎 3 Lợi Ích Của Mỗi Công Cụ

🎯 Bash Script

  1. Tự động hóa lệnh phức tạp: Viết 1 lần – chạy nhiều lần.

  2. Kiểm soát chặt chẽ logic: Có thể dùng if, for, while, function, xử lý lỗi ($?)...

  3. Dễ debug, tái sử dụng: Chạy độc lập, kiểm thử từng bước.


🎯 Makefile

  1. Dễ dùng cho team: make test, make deploy → ai cũng chạy được.

  2. Giảm quên lệnh: Không cần nhớ các câu lệnh dài, phức tạp.

  3. Tổ chức pipeline rõ ràng: Từng bước gọn, dễ đọc như menu.


3. ⚖️ So sánh Bash Script vs Makefile

Tiêu chí Bash Script Makefile
Mục đích Thực thi logic từng bước Tổ chức & gọi các bước
Cách dùng bash deploy.sh make deploy
Viết như nào? Lệnh bash thuần target:\n\t<lệnh>
Mạnh về Logic phức tạp, xử lý linh hoạt Menu gọn, dễ dùng, dễ nhớ
Dùng cho Triển khai, backup, test, logic cụ thể Orchestration nhiều bước, teamwork

Tóm lại:

  • Bash Script là nơi viết logic chi tiết

  • Makefile là "menu điều khiển" gọi những logic đó


4. 🚀 Best Practices Khi Kết Hợp Bash Script & Makefile

Thực hành tốt Ý nghĩa
Tách logic vào script riêng Mỗi script làm 1 việc (test.sh, build.sh...)
Makefile gọi các script Target make deploy chỉ gọi bash scripts/deploy.sh
Dùng .PHONY cho các target Tránh lỗi khi target trùng tên file
Thêm menu help Gợi nhớ lệnh: make help
Đặt log + kiểm tra lỗi trong script Bắt $?, dùng exit 1 nếu có lỗi
Sử dụng shellcheck, bash-lint Phát hiện lỗi Bash sớm

🔥 Bonus: Ví dụ mẫu

🚀 Use Case: Tự động hoá CI/CD đơn giản cho Web App dùng Docker


🎯 Mục tiêu:

Tự động hóa quy trình:

  1. Chạy test

  2. Build Docker image

  3. Deploy lên server

  4. Gửi thông báo sau khi deploy


📁 Cấu trúc dự án:

project/
├── scripts/
│   ├── test.sh
│   ├── build.sh
│   ├── deploy.sh
│   └── notify.sh
├── Makefile
├── docker-compose.yml
├── app/ (source code)
└── README.md

⚙️ Bash Scripts – Viết riêng biệt, modular

scripts/test.sh

#!/bin/bash
echo "🔍 Running unit tests..."
pytest
if [ $? -ne 0 ]; then
  echo "❌ Test failed. Abort pipeline."
  exit 1
fi
echo "✅ Tests passed!"

scripts/build.sh

#!/bin/bash
echo "🔨 Building Docker image..."
docker build -t myapp:latest .
echo "✅ Build complete!"

scripts/deploy.sh

#!/bin/bash
echo "🚀 Deploying app via docker-compose..."
docker-compose down
docker-compose up -d
echo "✅ Deployment complete!"

scripts/notify.sh

#!/bin/bash
echo "📧 Sending notification..."
echo "Deployment successful at $(date)" | mail -s "Deploy Success" you@example.com

🧰 Makefile – Điều hướng và tổ chức workflow

.PHONY: all test build deploy notify ci

all: ci

test:
	bash scripts/test.sh

build:
	bash scripts/build.sh

deploy:
	bash scripts/deploy.sh

notify:
	bash scripts/notify.sh

ci: test build deploy notify
	@echo "🎉 CI/CD pipeline completed successfully!"

💡 Cách sử dụng

Lệnh Ý nghĩa
make hoặc make all Chạy toàn bộ pipeline
make test Chạy test
make build Build Docker image
make deploy Deploy app
make notify Gửi thông báo
make ci Chạy CI/CD end-to-end

Best Practice Giải Thích

Tiêu chí Áp dụng
Modular hóa Scripts chia nhỏ, dễ tái sử dụng và bảo trì
Tối ưu teamwork Makefile như một menu giúp cả team dễ dùng, dễ nhớ
Kiểm soát lỗi Script có kiểm tra lỗi, exit 1 nếu cần
Tách biệt concern Logic Bash nằm trong scripts, Makefile chỉ điều phối
Có thể mở rộng Dễ thêm make backup, make rollback, make lint,...

Tổng kết:
Bash Script = thực hiện từng bước cụ thể
Makefile = menu orchestration – chạy tuần tự, gọn, dễ dùng cho cả team


All Rights Reserved

Viblo
Let's register a Viblo Account to get more interesting posts.