Tối ưu workflow GitHub Actions: Mẹo CI/CD nhanh hơn để triển khai ứng dụng hiệu quả

Workflow diagram showing GitHub Actions release process with automated steps in gray and manual steps in green

Tối ưu workflow GitHub Actions: Mẹo CI/CD nhanh hơn để triển khai ứng dụng hiệu quả

GitHub Actions đã trở thành công cụ không thể thiếu trong phát triển phần mềm hiện đại, cho phép tự động hóa quy trình CI/CD từ việc build và test cho tới triển khai và giám sát. Tối ưu hóa workflow GitHub Actions không chỉ giúp tiết kiệm thời gian mà còn giảm chi phí compute và tăng độ tin cậy của quy trình phát triển.

Cách GitHub Actions hoạt động và tại sao cần tối ưu

Screenshot of GitHub issue template for vulnerability reporting used by employees

GitHub Actions cho phép tự động hóa quy trình phát triển phần mềm bằng cách xác định workflow trong file YAML. Mỗi workflow bao gồm một hoặc nhiều jobs, và mỗi job có thể chạy trên các runner khác nhau. Tuy nhiên, workflow không được tối ưu có thể dẫn tới:

  • Thời gian chờ lâu vì các job được thực hiện tuần tự thay vì song song
  • Tài nguyên compute bị lãng phí vì các bước không cần thiết vẫn được thực hiện
  • Thiếu lưu trữ và tái sử dụng artifacts giữa các jobs
  • Không tận dụng caching để giảm thời gian build lặp lại

Mẹo tối ưu workflow GitHub Actions cho CI/CD nhanh hơn

1. Tận dụng thực hiện song song và chiến lược ma trận (matrix strategy)

Thay vì chạy các test cho các phiên bản khác nhau của Node.js tuần tự, sử dụng ma trận để thực hiện song song:

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [16.x, 18.x, 20.x]
    steps:
    - uses: actions/checkout@v3
    - name: Use Node.js ${{ matrix.node-version }}
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm test

Điều này cho phép chạy tests cho 3 phiên bản Node.js cùng lúc, giảm thời gian tổng thời gian test đáng kể so với chạy tuần tự.

2. Sử dụng cache để giảm thời gian cài đặt dependencies

Cache các thư viện Node.js (node_modules) hoặc Python (virtualenv) để tránh cài đặt lại trong mỗi workflow run:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Cache node modules
      uses: actions/cache@v3
      with:
        path: ~/.npm
        key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    - run: npm ci
    - run: npm run build

Cache có thể giảm thời gian cài đặt dependencies từ vài phút xuống dưới 10 giây khi không có thay đổi trong package-lock.json.

3. Tối ưu việc sử dụng artifacts và lưu trữ kết quả giữa các jobs

Thay vì xây dựng lại cùng một file trong nhiều jobs khác nhau, sử dụng artifacts để lưu trữ và tái sử dụng kết quả:

jobs:
  build:
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - run: npm run build
    - uses: actions/upload-artifact@v3
      with:
        name: build-files
        path: dist/
  
  deploy:
    needs: build
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - uses: actions/download-artifact@v3
      with:
        name: build-files
        path: ./dist
    - run: ./deploy.sh

4. Chọn runner phù hợp và sử dụng self-hosted runners khi cần thiết

GitHub cung cấp các loại runner khác nhau:
– GitHub-hosted runners: Ubuntu, Windows, macOS (mặc định)
– Self-hosted runners: Máy chủ tùy chỉnh trong cơ sở hạ tầng của bạn

Đối với các workload đặc biệt (cần phần cứng cụ thể, giấy phép phần mềm nội bộ, hoặc yêu cầu bảo mật cao), self-hosted runners có thể tiết kiệm chi phí và tăng hiệu suất.

Ví dụ thực tế: Workflow CI/CD tối ưu cho ứng dụng web

Dưới đây là workflow CI/CD tối ưu cho một ứng dụng web React:

name: CI/CD Pipeline

on:
  push:
    branches: [ main ]
  pull_request:
    branches: [ main ]

jobs:
  test:
    runs-on: ubuntu-latest
    strategy:
      matrix:
        node-version: [16.x, 18.x]
    steps:
    - uses: actions/checkout@v3
    - name: Setup Node.js
      uses: actions/setup-node@v3
      with:
        node-version: ${{ matrix.node-version }}
    - run: npm ci
    - run: npm test

  build:
    needs: test
    runs-on: ubuntu-latest
    steps:
    - uses: actions/checkout@v3
    - name: Cache node modules
      uses: actions/cache@v3
      with:
        path: ~/.npm
        key: ${{ runner.os }}-node-${{ hashFiles('package-lock.json') }}
        restore-keys: |
          ${{ runner.os }}-node-
    - run: npm run build
    - uses: actions/upload-artifact@v3
      with:
        name: production-build
        path: build/

  deploy:
    needs: build
    runs-on: ubuntu-latest
    if: github.ref == 'refs/heads/main'
    steps:
    - uses: actions/checkout@v3
    - uses: actions/download-artifact@v3
      with:
        name: production-build
        path: ./build
    - name: Deploy to Firebase
      run: firebase deploy --only hosting
      env:
        FIREBASE_TOKEN: ${{ secrets.FIREBASE_TOKEN }}

Các lỗi thường gặp và cách khắc phục

Lỗi Nguyên nhân Giải pháp
Workflow chạy quá lâu Thiếu parallelism, không sử dụng cache Thêm strategy matrix, sử dụng actions/cache
Không thể truy cập secrets Secrets chưa được cấu hình trong repository settings Thêm secrets trong Settings > Secrets > Actions
Artifacts không được truyền giữa jobs Thiếu phụ thuộc job hoặc sử dụng download-artifact sai cách Thêm dependencies và sử dụng đúng cách download-artifact
Self-hosted runner không kết nối Firewall chặn kết nối, token không đúng Kiểm tra kết nối mạng và cấu hình lại runner token

Công cụ và dịch vụ hỗ trợ tối ưu GitHub Actions

  • GitHub Actions Dashboard: Theo dõi thời gian chạy workflow và tìm bottleneck
  • act: Công cụ chạy GitHub Actions local để test trước khi push
  • GitHub Marketplace: Tìm kiếm actions đã được tối ưu như caching, notifications, deployment
  • Workflow Visualizer: Extensions giúp hiển thị cấu trúc workflow trong IDE

Kết luận: Xây dựng quy trình CI/CD hiệu quả và bền vững

Tối ưu workflow GitHub Actions là một quá trình liên tục, cần theo dõi và điều chỉnh thường xuyên. Bằng cách kết hợp ma trận chiến lược, caching, artifacts tối ưu và lựa chọn runner phù hợp, các đội phát triển có thể giảm thời gian CI/CD từ vài giờ xuống dưới 15 phút cho hầu hết các dự án.

Lưu ý quan trọng: Luôn kiểm tra và cải thiện. Sử dụng GitHub Actions Dashboard để phát hiện các bước chậm và áp dụng các mẹo trên để tiếp tục tối ưu hóa quy trình phát triển phần mềm của bạn.

Nguồn: GitHub Engineering Blog, GitHub Actions Documentation, How GitHub Actions Powers GitHub

Tôi là một lập trình viên IOS. Code chính là IOS nhưng thỉnnh thoảng vẫn đá sang Android hoặc web. Mặc dù không quá thông thạo nhưng tôi sẽ chia sẻ những kiến thức mà mình đã tìm hiểu, áp dụng qua.

Bài viết liên quan

Theme Oh My Zsh robbyrussell: giao diện terminal đẹp mắt với git status

Zsh + Oh My Zsh: Cấu hình terminal hiệu quả cho developer

Zsh + Oh My Zsh: Cấu hình terminal hiệu quả cho developer Terminal là công cụ không thể thiếu đối với mọi nhà phát triển. Tuy nhiên, terminal mặc định…

Xem thêm

Terminal productivity: Tối ưu hiệu suất làm việc trên Linux/macOS

Terminal productivity: Tối ưu hiệu suất làm việc trên Linux/macOS Terminal là công cụ không thể thiếu cho devops, lập trình viên và quản trị hệ thống. Tuy nhiên, nhiều…

Xem thêm

Zed Editor: Trình soạn thảo mã hiệu suất cao viết bằng Rust cho macOS/Linux

Zed Editor: Trình soạn thảo mã hiệu suất cao viết bằng Rust cho macOS/Linux Zed là code editor thế hệ mới, phát hành 1.0 vào tháng 1/2024, được xây dựng…

Xem thêm
0 0 đánh giá
Article Rating
Theo dõi
Thông báo của
guest
0 Comments
Cũ nhất
Mới nhất Được bỏ phiếu nhiều nhất