Tối Ưu Hóa Workflows GitHub Actions

0 0 0

Người đăng: Minh Hoàng

Theo Viblo Asia

Bạn đã bao giờ ngồi nhìn màn hình, chờ workflow GitHub Actions chạy xong mà cảm giác như đang đợi crush trả lời tin nhắn chưa? Một pipeline chậm chạp không chỉ làm bạn phát điên mà còn ngốn tài nguyên, làm chậm cả dự án. Thực tế là, theo thống kê từ GitHub, một dự án trung bình có thể mất đến 20 phút cho mỗi lần build nếu không được tối ưu – trong khi các team chuyên nghiệp chỉ cần 5 phút. Vậy làm sao để tối ưu workflow nhanh, mạnh, và hiệu quả?

Trong bài này, mình sẽ chia sẻ những best practices giúp bạn tối ưu hóa GitHub Actions: từ giảm thời gian chạy, dùng caching thông minh, đến tận dụng job matrices và xử lý lỗi. Biết đâu anh em cũng sẽ tìm thấy một ví dụ thực tế để áp dụng ngay vào dự án của mình.


1. Tại sao cần tối ưu GitHub Actions?

GitHub Actions là gì?

GitHub Actions là “trợ thủ đắc lực” của dân DevOps, một công cụ tự động hóa tích hợp ngay trong GitHub. Nó cho phép bạn tạo các workflows – những quy trình tự động chạy khi có sự kiện như push code, pull request, hay theo lịch trình. Từ build, test đến deploy, đây là xương sống của pipeline CI/CD hiện đại, dễ dàng kết nối với Docker, Kubernetes, hay bất kỳ công cụ nào bạn thích.

Vậy tối ưu hóa để làm gì?

Hãy tưởng tượng: bạn vừa commit một thay đổi nhỏ, nhưng phải đợi 25 phút để workflow chạy xong chỉ vì nó tải lại toàn bộ dependencies và test mọi thứ từ đầu. Trong khi đó, team đối thủ đã deploy xong tính năng mới và đang chill chill ngồi lướt tóp tóp hóng drama "nhân viên bỏ quên đồ tại nhà sếp tên V" 😛. Tối ưu workflows không chỉ giúp bạn tiết kiệm thời gian mà còn giảm chi phí (đặc biệt nếu bạn xài runners trên GitHub-hosted) và giữ cho cả team vui vẻ, tập trung vào code thay vì chờ đợi, chửi thề là sao nay CI chạy chậm thế anh 😪


2. Những “vấn đề” phổ biến khi dùng GitHub Actions

Trước khi đi vào giải pháp, hãy điểm qua những vấn đề mà hầu hết DevOps Engineer từng gặp. Đây là những “kẻ thù” bạn cần tiêu diệt:

  • 🚀 Workflow chạy chậm như rùa: Một dự án tầm trung với hàng tá tests có thể ngốn 15-30 phút chỉ để kiểm thử. Thời gian đó đủ để bạn xem tóp tóp mỏi tay!
  • 📦 Tài nguyên bị lãng phí: Mỗi lần chạy, dependencies như npm packages hay Docker images bị tải lại từ đầu, dù chẳng có gì thay đổi. Tốn cả thời gian lẫn tiền bạc.
  • 🔄 Chạy workflow vô tội vạ: Bạn fix một typo trong README, thế mà workflow vẫn hùng hục build/test toàn bộ dự án. Vô lý hết sức!
  • 🔐 Rủi ro bảo mật: Secrets như API keys bị hardcode hoặc quản lý lỏng lẻo, chỉ cần một sơ suất là cả hệ thống “toang”.

Nhận diện được vấn đề rồi, giờ là lúc “ra tay” tối ưu!


3. Best Practices để biến workflows thành “người đẹp”

Dưới đây là những bí kíp mình đúc kết từ những dự án mà mình tham gia, giúp bạn tăng tốc và làm chủ GitHub Actions:

3.1. Giảm thời gian chạy: Đừng để đồng nghiệp chờ dài cổ

  • Tối ưu từng bước: Hãy kiểm tra từng lệnh trong workflow. Chẳng hạn, thay npm install bằng npm ci để cài dependencies nhanh hơn, hoặc loại bỏ các bước không cần thiết.
  • Chạy song song: Nếu bạn có 10 tests, đừng chạy tuần tự – hãy để chúng chạy đồng thời trên nhiều runners.

3.2. Caching: Tái sử dụng để tiết kiệm

Caching là “át chủ bài” giúp bạn tránh tải lại dependencies mỗi lần chạy. Dùng action actions/cache để lưu node modules, Docker layers, hay bất kỳ artifacts nào.

  • Ví dụ caching npm:
    - name: Cache node modules uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} restore-keys: ${{ runner.os }}-node-
    
    Khi package-lock.json không đổi, bạn tái sử dụng cache và tiết kiệm được ối thời gian chạy tới ngay bước tiếp theo trong workflow.

3.3. Job Matrix: Chạy song song như pro

Job matrix cho phép chạy tests trên nhiều cấu hình (Node.js 14, 16, 18 chẳng hạn) cùng lúc, thay vì đợi từng cái xong.

  • Ví dụ:
    jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [14, 16, 18] steps: - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - run: npm ci - run: npm test
    

3.4. Conditional Triggers: Chỉ chạy khi cần

Đừng để workflow “tự tung tự tác”. Dùng if hoặc cấu hình on để giới hạn:

  • Ví dụ chỉ chạy khi code trong src/ thay đổi:
    on: push: paths: - 'src/**'
    

3.5. Reusable Workflows: DRY cho CI/CD

Định nghĩa workflow tái sử dụng để áp dụng cho nhiều repo. Mình có hẳn 1 bài viết về chủ đề này rồi nhé, anh em xem tại https://viblo.asia/p/reusable-workflows-tai-su-dung-workflows-trong-github-actions-zOQJwowbJMP.

  • Ví dụ:
    # .github/workflows/reusable-build.yml
    name: Reusable Build
    on: workflow_call:
    jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - run: npm ci - run: npm run build
    
    Gọi lại ở workflow khác:
    jobs: build: uses: ./.github/workflows/reusable-build.yml
    

3.6. Quản lý secrets an toàn

  • Dùng GitHub Encrypted Secrets để lưu API keys, tránh hardcode trong YAML.
  • Truyền biến qua environment:
    steps: - run: echo "Deploying to ${{ secrets.DEPLOY_URL }}" env: DEPLOY_URL: ${{ secrets.DEPLOY_URL }}
    

📊 Impact Analysis: Tối ưu để được gì?

Để thấy rõ lợi ích, đây là bảng so sánh trước và sau khi tối ưu:

Kỹ thuật Trước tối ưu Sau tối ưu
Caching Tải lại dependencies: 5 phút Dùng cache: 1 phút
Job Matrix Test tuần tự: 15 phút Song song: 5 phút
Conditional Triggers Chạy 100% commits Chạy 30% commits cần thiết

Tóm lại: bạn có thể giảm tới 70% thời gian và tiết kiệm tài nguyên đáng kể!


4. Ví dụ thực tế: Workflow tối ưu cho dự án Node.js

Đây là một workflow “xịn sò” tích hợp tất cả kỹ thuật trên:

name: CI Pipeline on: push: branches: [main] paths: ['src/**', 'tests/**'] pull_request: branches: [main] jobs: test: runs-on: ubuntu-latest strategy: matrix: node-version: [14, 16, 18] steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: ${{ matrix.node-version }} - name: Cache dependencies uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-${{ matrix.node-version }}-${{ hashFiles('**/package-lock.json') }} - run: npm ci - run: npm test deploy: needs: test runs-on: ubuntu-latest if: github.ref == 'refs/heads/main' steps: - uses: actions/checkout@v3 - uses: actions/setup-node@v3 with: node-version: 16 - name: Cache dependencies uses: actions/cache@v3 with: path: ~/.npm key: ${{ runner.os }}-node-16-${{ hashFiles('**/package-lock.json') }} - run: npm ci - run: npm run build - run: echo "Deploying to ${{ secrets.DEPLOY_URL }}" env: DEPLOY_URL: ${{ secrets.DEPLOY_URL }}

Giải thích:

  • Chỉ chạy khi src/ hoặc tests/ thay đổi.
  • Tests chạy song song trên 3 phiên bản Node.js, dùng cache để tăng tốc.
  • Deploy chỉ chạy trên main sau khi tests pass, bảo mật với secrets.

5. Debugging Workflows

Workflow tối ưu rồi mà vẫn lỗi? Anh em có thể debug bằng cách này xem sao nhé:

  • 📝 ACTIONS_STEP_DEBUG: Thêm secret ACTIONS_STEP_DEBUG: true trong repo để bật log chi tiết từng bước.
  • 🔧 tmate: SSH vào runner khi lỗi xảy ra:
    steps: - name: Debug with tmate uses: mxschmitt/action-tmate@v3 if: failure()
    
  • 📊 GitHub Logs & Annotations: Xem log trên giao diện GitHub để tìm lỗi.

6. Kết luận: Lên level cho pipeline của bạn

Tối ưu GitHub Actions không chỉ là chuyện kỹ thuật, mà là cách để bạn và team làm việc hiệu quả hơn. Từ caching, job matrices đến debugging, những mẹo này sẽ giúp pipeline của bạn nhanh và đáng tin cậy hơn bao giờ hết.

Next steps:

  • Thử self-hosted runners để tối ưu chi phí.
  • Tích hợp với Docker hoặc Terraform cho automation.
  • Chuẩn hóa workflows bằng reusable templates cho cả tổ chức.

Hãy thử áp dụng và đo lường sự khác biệt 🚀

Bình luận

Bài viết tương tự

- vừa được xem lúc

Cấu hình CI/CD với Github (phần 2): Trigger một work flow

Events trigger. Bạn có thể cấu hình cho workflows chạy khi có một sự kiện nào đó xảy ra trên GitHub, theo một lịch có sẵn hoặc cũng có thể là một sự kiện nào đó xảy ra ngoài GitHub.

0 0 80

- vừa được xem lúc

Khi Github Actions và CircleCI song kiếm hợp bích thì đỉnh không gì bằng [Phần 2]

Cách thức thực hiện. Có thể nói ưu điểm của Github Actions chính là số lượng trigger nhiều. Việc khởi động CircleCI sẽ gọi API của CircleCI từ phía Github Actions và kích hoạt trigger. Cho nên, ở setting của repository, hãy cài OFF cho Webhook.

0 0 49

- vừa được xem lúc

Khi Github Actions và CircleCI song kiếm hợp bích thì đỉnh không gì bằng [Phần 1]

(Sau đây xin được dịch lại bài báo nọ, ngôi xưng là "Chế"). .

0 0 48

- vừa được xem lúc

Cấu hình CI/CD với Github (phần 4): Các mẫu job cơ bản

Sau đây là một số mẫu Github action cơ bản mà các bạn có thể sử dụng để tạo một flow hoàn chỉnh, phụ thuộc vào yêu cầu của từng dự án khác nhau. .

0 1 130

- vừa được xem lúc

Cách tạo một trang blog cá nhân miễn phí dành cho dev

Vào một ngày đẹp trời, bỗng dưng mình nảy ra ý định làm một trang blog cá nhân thay vì viết Blog trên các nền tảng có sẵn. .

0 0 42

- vừa được xem lúc

Cài đặt đơn giản automating publishing Flutter app lên Google Play bằng Github Actions

Introduction. Mỗi developer hay gặp phải các công việc lặp đi lặp lại gây ra sự nhàm chán.

0 0 45