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ệnhmake
. -
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
-
Tự động hóa lệnh phức tạp: Viết 1 lần – chạy nhiều lần.
-
Kiểm soát chặt chẽ logic: Có thể dùng
if
,for
,while
,function
, xử lý lỗi ($?
)... -
Dễ debug, tái sử dụng: Chạy độc lập, kiểm thử từng bước.
🎯 Makefile
-
Dễ dùng cho team:
make test
,make deploy
→ ai cũng chạy được. -
Giảm quên lệnh: Không cần nhớ các câu lệnh dài, phức tạp.
-
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:
-
Chạy test
-
Build Docker image
-
Deploy lên server
-
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