Quản Lý Tối Ưu Với Makefile Trên GitHub Actions
Giới thiệu
Trong thế giới phát triển phần mềm hiện đại, các nền tảng như GitHub Actions, CI/CD pipelines, và dịch vụ đám mây thường được coi là công cụ tiện lợi. Tuy nhiên, nhiều nhà phát triển cảm thấy mình trở thành nô lệ cho những nền tảng này. Chúng ta thường phải chờ đợi quy trình làm việc, hy vọng mọi thứ sẽ thành công mà không có sự kiểm soát thực sự. Bài viết này sẽ giới thiệu về cách sử dụng Makefile để giành lại quyền kiểm soát và tối ưu hóa quy trình phát triển của bạn.
Vấn đề
Nhiều nhà phát triển cảm thấy bị ràng buộc vào các nền tảng như GitHub, nơi mà mọi thứ đều phụ thuộc vào một số quy trình đã được định sẵn. Họ gặp phải những vấn đề như:
- Bị khóa vào nhà cung cấp: Chỉ có thể làm việc trong giới hạn của GitHub.
- Khó khăn trong việc gỡ lỗi: Cần phải đẩy mã lên để kiểm tra.
- Thời gian chờ đợi cho các runner: Mất thời gian chờ đợi để thực hiện các tác vụ.
- Khả năng kiểm tra hạn chế: Không thể kiểm tra trên môi trường địa phương trước.
Sự Thức Tỉnh
Tôi đã quyết định xóa bỏ hoàn toàn thư mục .github/workflows/
. Tại sao? Bởi vì tôi nhận ra rằng: Các nền tảng chỉ là giao diện. Logic nên thuộc về tôi.
Cuộc Cách Mạng Makefile
Những gì tôi đã có (Nô lệ của nền tảng)
yaml
# .github/workflows/publish.yml
name: Publish Packages
on:
push:
branches: [main]
jobs:
publish:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- uses: actions/setup-node@v3
- run: npm publish
Vấn đề:
- Phụ thuộc vào GitHub.
- Gỡ lỗi cần phải đẩy mã.
- Phải chờ đợi các runner.
- Hạn chế trong môi trường GitHub.
- Không thể thử nghiệm tại địa phương.
Những gì tôi đã xây dựng (Kiểm Soát Tối Đa)
makefile
# Makefile
publish:
@for dir in $$(fd package.json packages/ -x dirname {}); do \
pkg=$$(jq -r '.name' $$dir/package.json); \
version=$$(jq -r '.version' $$dir/package.json); \
published=$$(npm view $$pkg version 2>/dev/null || echo "0.0.0"); \
if [ "$$version" != "$$published" ]; then \
echo "Publishing $$pkg@$$version..."; \
(cd $$dir && npm publish); \
fi \
done
Lợi ích:
- Hoạt động ở mọi nơi (cục bộ, CI, bất kỳ nơi nào có make).
- Thực thi ngay lập tức.
- Hoàn toàn minh bạch.
- Không phụ thuộc vào bên ngoài.
- Kiểm soát hoàn toàn.
Triết Lý
Điều này kết nối với nguyên tắc cốt lõi của tôi: Không Tài Liệu → Mã Sống. Bây giờ được mở rộng: Không Phụ Thuộc Nền Tảng → Kiểm Soát Tối Đa.
Trước Đây: Phát Triển Dựa Trên Giao Diện
plaintext
Developer → GitHub → Actions → npm
↑ ↑ ↑
Giao Diện Nền Tảng Dịch Vụ
Mỗi mũi tên là một sự phụ thuộc. Mỗi sự phụ thuộc là một điểm thất bại tiềm năng.
Sau Đây: Phát Triển Dựa Trên Logic
plaintext
Developer → Makefile → Thực Thi Trực Tiếp
↑ ↑
Logic Kiểm Soát
Không có trung gian. Không chờ đợi. Không bất ngờ.
Triển Khai Thực Tế
Dưới đây là Makefile thực tế của tôi thay thế tất cả các GitHub Actions:
makefile
.PHONY: help readme publish publish-all list clean test
# Tạo README động từ các gói
readme:
@echo "# vibe-coding" > README.md
@echo "" >> README.md
@echo "| Command | Package | Description |" >> README.md
@echo "|---------|---------|-------------|" >> README.md
@for dir in $$(fd package.json packages/ -x dirname {} | sort); do \
name=$$(basename $$dir); \
pkg=$$(jq -r '.name' $$dir/package.json); \
desc=$$(jq -r '.description' $$dir/package.json); \
echo "| [\`$$name\`](packages/$$name) | \`$$pkg\` | $$desc |" >> README.md; \
done
# Tăng phiên bản cho tất cả các gói
bump:
@for dir in $$(fd package.json packages/ -x dirname {}); do \
pkg=$$(jq -r '.name' $$dir/package.json); \
old=$$(jq -r '.version' $$dir/package.json); \
new=$$(echo $$old | awk -F. '{print $$1"."$$2"."$$3+1}'); \
jq ".version = \"$$new\"" $$dir/package.json > $$dir/package.json.tmp && \
mv $$dir/package.json.tmp $$dir/package.json; \
echo "$$pkg: $$old → $$new"; \
done
# Kiểm tra tất cả các công cụ
test:
@for dir in $$(fd package.json packages/ -x dirname {}); do \
name=$$(basename $$dir); \
echo "Testing $$name..."; \
(cd $$dir && bun run ./index.ts -h) || true; \
done
Sức Mạnh Của Make
Make đã tồn tại 48 năm (1976). Nó tồn tại vì nó tuân thủ triết lý Unix:
- Làm một việc tốt
- Mọi thứ đều là một tệp
- Ghép nối các công cụ đơn giản
- Văn bản là giao diện phổ quát
GitHub Actions mới chỉ 5 năm tuổi. Nó sẽ không tồn tại 48 năm như Make.
Lợi Ích Thực Tiễn
1. Phát Triển Địa Phương Đầu Tiên
bash
make test # Kiểm tra cục bộ
make publish # Xuất bản cục bộ
# Không cần đẩy lên GitHub để kiểm tra quy trình làm việc
2. Độc Lập Với Nền Tảng
Hoạt động trên:
- Máy tính cá nhân
- Bất kỳ nền tảng CI/CD nào
- Máy chủ SSH
- Container Docker
- Bất kỳ nơi nào có
make
3. Tốc Độ
- GitHub Actions: Đẩy → Chờ runner → Thực thi → Kết quả (2-5 phút)
- Makefile: Thực thi → Kết quả (ngay lập tức)
4. Minh Bạch
bash
make -n publish # Xem những gì sẽ chạy mà không thực thi
Bạn không thể làm điều này với GitHub Actions.
Mô Hình Rộng Hơn
Đây là một phần của sự nhận ra lớn hơn:
- Các nền tảng là giao diện → Kiểm soát logic.
- Dịch vụ là tiện ích → Sở hữu khả năng.
- Đám mây là máy tính → Máy tính của bạn là đủ.
- Quy trình làm việc chỉ là các kịch bản → Viết kịch bản.
Hướng Dẫn Di Chuyển
Bước 1: Xác Định Các Phụ Thuộc Nền Tảng
- GitHub Actions → Makefile
- Vercel → Lưu trữ tĩnh
- AWS Lambda → Máy chủ cục bộ
- Heroku → Dịch vụ Systemd
Bước 2: Trích Xuất Logic
Nền tảng thực sự làm gì? Viết nó bằng tay.
Bước 3: Tạo Công Cụ Địa Phương Đầu Tiên
Mỗi dịch vụ đám mây có thể được thay thế bằng:
- Một kịch bản
- Một mục tiêu Makefile
- Một dịch vụ cục bộ
- Một nhị phân đơn giản
Ví Dụ Thực Tế
Tạo README Động
Thay vì một README tĩnh bị lỗi thời:
makefile
readme:
@for package in packages/*; do \
echo "- [$$(basename $$package)]($$package)" >> README.md; \
done
Xuất Bản Tự Động
Thay vì GitHub Actions:
makefile
publish: readme
@git diff --exit-code || (git add -A && git commit -m "auto: update" && git push)
@make publish-npm
Kiểm Tra Liên Tục
Thay vì CI/CD:
makefile
watch:
@fswatch -o . | xargs -n1 -I{} make test
Cách Unix Chiến Thắng
Tôi đã trở lại với những điều cơ bản:
- Make thay vì các nền tảng CI/CD
- Shell scripts thay vì quy trình làm việc
- Git hooks thay vì các ứng dụng GitHub
- Cron thay vì các hành động theo lịch
Mỗi công cụ thực hiện một việc tốt. Mỗi công cụ đều nằm trong tầm kiểm soát của tôi.
Kết Luận
Việc xóa bỏ thư mục .github/workflows/
đã mang lại cảm giác tự do. Tôi không còn phải chờ đợi các runner, gỡ lỗi YAML, hay bị ràng buộc vào hạ tầng của GitHub.
Makefile là tuyên ngôn độc lập của tôi. Đó là mã mà tôi kiểm soát, logic mà tôi sở hữu, và tự động hóa hoạt động ở mọi nơi.
Hãy ngừng cấu hình nền tảng. Bắt đầu viết Makefiles.
Quy trình làm việc tốt nhất là không có quy trình làm việc—chỉ cần làm.
Phần của triết lý Không Tài Liệu → Mã Sống. Xem thêm: @yemreak/culture - công cụ của tôi để khám phá các mẫu từ mã thay vì đọc tài liệu.
Đọc nguyên bản: Quản Lý Tối Ưu Với Makefile Trên GitHub Actions