# Vì sao GitHub Actions chậm, và cách thôi dựng lại mọi thứ mỗi job

> GitHub Actions chậm vì mỗi job khởi đầu trên một VM trống, phải tải tool, cài lại dependency và dựng lại Docker image trước khi chạy test đầu tiên. Skipbox giữ tất cả trên máy riêng của bạn giữa các job, với giá cố định $39 một tháng, không giới hạn phút: ở mức 20.000 phút trên 4 vCPU, rẻ hơn GitHub $183 mỗi tháng.

Phần lớn thời gian của một job GitHub Actions chậm diễn ra trước khi test đầu tiên chạy. Cài Node, tải dependency, build Docker image: vẫn những phút ấy, ở mỗi lần push, trong khi một người trong nhóm ngồi chờ dấu kiểm xanh. Khi tính phí theo phút, bạn còn trả tiền cho cả những phút đó.

Skipbox là runner GitHub Actions giữ máy của nó giữa các job, nên những gì job này đã cài vẫn còn trên ổ đĩa cho job sau. Đổi một dòng, `runs-on: skipbox`, là job chạy trên máy riêng của bạn với giá cố định $39 một tháng, không giới hạn phút.

- Dependency, Docker layer và tool nằm lại trên ổ đĩa, nên job bỏ qua được việc tải và dựng lại
- Dung lượng cache ít nhất gấp 7 lần GitHub, không hết hạn sau 7 ngày và không có cache key nào phải chỉnh
- 20.000 phút mỗi tháng trên 4 vCPU: $222 trên GitHub, $39 trên Skipbox

**GitHub Actions giá cố định, không giới hạn phút** Skipbox chạy job GitHub Actions của bạn trên máy riêng dành cho bạn: $39 một tháng, dù bạn chạy bao nhiêu phút. Docker layer và cache dependency được giữ giữa các job, nên job tiếp theo khởi chạy ngay.

Runner 4 vCPU, 20.000 phút một tháng: GitHub $222 → Skipbox $39. Bạn tiết kiệm $183 mỗi tháng.

Chỉ cần đổi một dòng: `runs-on: skipbox`.

[Bắt đầu dùng thử miễn phí 7 ngày](https://app.skipbox.dev/sign-in?ref=g-github-actions-slow-vi)

## Job nào cũng khởi đầu từ một VM trống

GitHub-hosted runner là một máy ảo mới cho mỗi job. Không có gì job trước đã tải hay build còn trên đó, nên job nào cũng phải dựng lại cùng một trạng thái:

| Step | GitHub-hosted runner | Skipbox |
|---|---|---|
| Cài Node, Python, Java | Tải toolchain | Tìm thấy nó trong tool cache từ job trước |
| Cài dependency | Tải và giải nén archive cache; nếu miss thì tải toàn bộ từ registry | Đọc cache của trình quản lý package từ ổ đĩa |
| Build Docker image | Bắt đầu không có layer nào và build lại mọi step | Dùng lại các layer của lần build trước |
| Chạy test | 2 CPU trên `ubuntu-latest` của repository riêng tư | Từ 4 vCPU trở lên |

Ba hàng đầu không tạo ra gì mới. Chúng chỉ đưa máy về lại trạng thái hôm qua.

Cache của GitHub làm nhẹ chuyện này nhưng không thay đổi nó. Cache chứa 10 GB cho mỗi repository, xóa các mục không job nào đọc trong 7 ngày, và một nhánh feature mới không đọc được cache của nhánh feature khác. Kể cả khi hit, mỗi lần chạy vẫn phải tải và giải nén một archive.

## Thời gian chờ khiến bạn tốn gì

Giả sử phần chuẩn bị chiếm 3 phút mỗi job và nhóm bạn chạy 100 job mỗi ngày. Như vậy là 300 phút runner mỗi ngày chỉ để đưa máy về như cũ, và pull request nào cũng phải chờ phần của nó. Review bắt đầu muộn hơn, merge muộn hơn, và kỹ sư chuyển sang việc khác trong lúc chờ.

Khi tính phí theo phút, những phút đó nằm trên hóa đơn. Một runner 4 vCPU, theo số phút mỗi tháng:

| Số phút mỗi tháng (4 vCPU) | GitHub | Skipbox S | Bạn tiết kiệm mỗi tháng |
|---|---|---|---|
| 10.000 | $102 | $39 | **$63** |
| 20.000 | $222 | $39 | **$183** |
| 30.000 | $342 | $39 | **$303** |

Số liệu GitHub là hóa đơn sau khi trừ mức sử dụng có sẵn của GitHub Team. Hãy nhập số phút của chính bạn vào [máy tính chi phí trên trang chủ](https://skipbox.dev/?ref=g-github-actions-slow-vi#cost); không cần đăng nhập.

Và số lần chạy chỉ có tăng:

- **AI coding agent.** Mỗi lần agent push là CI khởi chạy. Thời gian chờ và hóa đơn tăng theo số lần push, không theo số người.
- **Thêm test.** Một bộ test E2E hay một matrix lặp lại phần chuẩn bị ở mọi job nó thêm vào.
- **Ngân sách.** Chặn hóa đơn bằng ngân sách GitHub, thì job ngừng khởi chạy giữa tháng, và merge cũng dừng theo.

## Tự tăng tốc là cả một dự án

Giữ GitHub-hosted runner mà vẫn muốn nhanh nghĩa là phải nhận những việc như sau:

- Đặt cache key theo hash của lockfile và chỉnh `restore-keys` cho đến khi hit
- Thêm buildx và export cache của Docker bằng `cache-to`, trong cùng 10 GB
- Chia nhỏ test thành shard, mà shard nào cũng lặp lại phần chuẩn bị và số phút bị tính tăng lên
- Hoặc tự chạy self-hosted runner: cấp phát máy, cập nhật OS, dọn dẹp giữa các job, và sửa khi nó sập

Cách nào cũng chỉ là đi vòng quanh một cái máy quên sạch mọi thứ. Skipbox giữ lại máy, nên không cần cách nào cả.

## Trên Skipbox có gì khác

**Phần chuẩn bị nằm lại trên ổ đĩa.** Job của bạn chạy trên máy riêng của tài khoản bạn, và máy được giữ lại giữa các job. Docker image, layer và build cache; cache package của npm, pip, Gradle và nhiều công cụ khác; các tool mà `setup-node` và những action tương tự cài đặt. Dung lượng cache ít nhất gấp 7 lần GitHub, không hết hạn sau 7 ngày và không có quy tắc nhánh.

**Máy lớn hơn với giá cố định.** Trình biên dịch và trình chạy test khởi động một worker cho mỗi nhân, nên nhiều nhân hơn thì các step nặng về CPU ngắn lại.

| Gói | Máy | Giá |
|---|---|---|
| S | 4 vCPU · 16 GB | $39 một tháng |
| M | 8 vCPU · 16 GB | $79 một tháng |
| L | 16 vCPU · 32 GB | $149 một tháng |

Gói nào cũng không giới hạn phút. Job Skipbox không dùng phút GitHub nào, nên ngân sách GitHub không bao giờ chặn được chúng.

**Không có máy nào phải chăm sóc.** Skipbox cấp phát máy, cập nhật OS và tool, dọn dẹp sau mỗi job, kiểm tra tình trạng và dựng lại máy nào không đạt.

## Chuyển sang chỉ cần một dòng

```yaml
jobs:
  build:
    runs-on: skipbox # was ubuntu-latest
    steps:
      - uses: actions/checkout@v4
      - run: npm ci && npm test
```

1. Đăng nhập Skipbox bằng GitHub.
2. Cài ứng dụng GitHub của Skipbox và chọn các repository.
3. Đổi `runs-on` rồi push.

Những gì job đầu tiên cài đặt sẽ nằm trên ổ đĩa cho job thứ hai.

## Bảo mật

- Máy chỉ thuộc về tài khoản của bạn. Không có job của công ty nào khác chạy trên đó.
- Sau mỗi job, thông tin xác thực, tiến trình và container của runner bị xóa. Từ ngày 13 tháng 11 năm 2026, bản checkout và kết quả build của nó (`target/` của Cargo) được giữ trên máy riêng của bạn cho các job sau; bật “VM mới cho mỗi job” thì mỗi job chạy trên một máy mới.
- Code từ người không có quyền ghi (chẳng hạn pull request từ fork) chạy trên một máy mới, dùng xong là bỏ.

Chi tiết có trong [cách các job được cách ly](https://docs.skipbox.dev/isolation).

## Thử trên job chậm nhất của bạn

Dùng thử miễn phí trong 7 ngày hoặc 3.000 phút chạy job, tùy điều kiện nào đến trước, không cần thẻ. Hãy chuyển job chậm nhất của bạn sang `runs-on: skipbox`, chạy nó hai lần liên tiếp, và đặt thời gian từng step cạnh số liệu của GitHub.

## Câu hỏi thường gặp

### Vì sao GitHub Actions chậm như vậy?

Mỗi job trên GitHub-hosted runner khởi đầu trên một VM mới, không còn gì từ lần chạy trước, nên nó phải tải tool, cài lại dependency và dựng lại Docker image trước khi test của bạn bắt đầu. Skipbox chạy job trên máy riêng của tài khoản bạn và giữ trạng thái đó trên ổ đĩa, nên job sau bắt đầu từ chỗ job trước dừng lại.

### Đã thêm actions/cache rồi, sao workflow vẫn chậm?

Kể cả khi cache hit, mỗi job vẫn phải tải và giải nén một archive, vì lần nào VM cũng mới. Hơn nữa, cache của GitHub chỉ chứa 10 GB cho mỗi repository, xóa các mục không dùng trong 7 ngày, và không đọc được từ một nhánh ngang hàng. Trên Skipbox, cache package và Docker layer đã nằm sẵn trên ổ đĩa của máy, không có key nào phải quản lý.

### Làm sao build Docker nhanh hơn trong GitHub Actions?

Hãy cho bản build dùng các layer của lần build trước. Trên GitHub-hosted runner, điều đó nghĩa là export cache bằng buildx rồi import lại mỗi lần chạy, trong cùng giới hạn 10 GB. Trên Skipbox, image và build cache của Docker được giữ trên máy giữa các job, nên docker build tự dùng lại các layer.

### Dùng Skipbox có phải viết lại workflow không?

Không. Với job Linux, hãy đổi runs-on thành skipbox. Máy chạy Ubuntu 24.04 với Docker, Node.js và Python, và các step cùng action của bạn chạy như cũ.

### Có thể thử miễn phí trên chính job chậm của tôi không?

Có. Dùng thử kéo dài 7 ngày hoặc 3.000 phút chạy job, tùy điều kiện nào đến trước, không cần thẻ. Hãy chuyển job chậm nhất của bạn sang runs-on: skipbox, chạy nó hai lần liên tiếp, và so thời gian từng step với GitHub.

Cập nhật ngày 2026-11-11 · https://skipbox.dev/vi/guides/github-actions-slow
