0
0
Lập trình
Flame Kris
Flame Krisbacodekiller

Quản Lý Tối Ưu Với Makefile Trên GitHub Actions

Đăng vào 1 ngày trước

• 7 phút đọc

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 Copy
# .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 Copy
# 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 Copy
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 Copy
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 Copy
.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 Copy
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 Copy
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:

  1. Các nền tảng là giao diện → Kiểm soát logic.
  2. Dịch vụ là tiện ích → Sở hữu khả năng.
  3. Đám mây là máy tính → Máy tính của bạn là đủ.
  4. 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 Copy
readme:
    @for package in packages/*; do \
        echo "- [$$(basename $$package)]($$package)" >> README.md; \
    done

Xuất Bản Tự Động

Thay vì GitHub Actions:

makefile Copy
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 Copy
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

Gợi ý câu hỏi phỏng vấn
Không có dữ liệu

Không có dữ liệu

Bài viết được đề xuất
Bài viết cùng tác giả

Bình luận

Chưa có bình luận nào

Chưa có bình luận nào