# ทำไม GitHub Actions ช้า และวิธีเลิกสร้างสภาพเดิมใหม่ทุกจ็อบ

> GitHub Actions ช้าเพราะทุกจ็อบเริ่มบน VM ว่างเปล่า ต้องดาวน์โหลดเครื่องมือ ติดตั้ง dependency ใหม่ และ build อิมเมจ Docker ใหม่ก่อนเทสต์แรก Skipbox เก็บทั้งหมดไว้บนเครื่องของคุณเองระหว่างจ็อบ ในราคาเหมาจ่าย $39 ต่อเดือน ไม่จำกัดนาที: ที่ 20,000 นาทีบน 4 vCPU ถูกกว่า GitHub $183 ต่อเดือน

เวลาส่วนใหญ่ของจ็อบ GitHub Actions ที่ช้าหมดไปก่อนเทสต์แรกจะรัน ตั้งค่า Node ดาวน์โหลด dependency build อิมเมจ Docker: นาทีเดิมๆ ทุกครั้งที่ push ขณะที่มีคนในทีมนั่งรอเครื่องหมายถูกสีเขียว และเมื่อคิดเงินรายนาที คุณก็จ่ายเงินให้นาทีเหล่านั้นด้วย

Skipbox คือรันเนอร์ GitHub Actions ที่เก็บเครื่องไว้ระหว่างจ็อบ สิ่งที่จ็อบหนึ่งติดตั้งไว้จึงยังอยู่บนดิสก์ให้จ็อบถัดไป เปลี่ยนบรรทัดเดียว `runs-on: skipbox` แล้วจ็อบจะรันบนเครื่องของคุณเองในราคาเหมาจ่าย $39 ต่อเดือน ไม่จำกัดนาที

- dependency, layer ของ Docker และเครื่องมืออยู่บนดิสก์ จ็อบจึงข้ามการดาวน์โหลดและการ build ใหม่ได้
- พื้นที่แคชอย่างน้อย 7× ของ GitHub ไม่หมดอายุใน 7 วัน และไม่ต้องปรับ cache key
- 20,000 นาทีต่อเดือนบน 4 vCPU: บน GitHub $222 บน Skipbox $39

**GitHub Actions ราคาเหมาจ่าย ไม่จำกัดนาที** Skipbox รันจ็อบ GitHub Actions บนเครื่องเฉพาะของคุณเอง: $39 ต่อเดือน ไม่ว่าจะรันกี่นาที layer ของ Docker และแคช dependency ยังอยู่ระหว่างจ็อบ จ็อบถัดไปจึงเริ่มได้ทันที

รันเนอร์ 4 vCPU, 20,000 นาทีต่อเดือน: GitHub $222 → Skipbox $39. ประหยัด $183 ทุกเดือน.

ย้ายได้ด้วยบรรทัดเดียว: `runs-on: skipbox`

[เริ่มทดลองใช้ฟรี 7 วัน](https://app.skipbox.dev/sign-in?ref=g-github-actions-slow-th)

## ทุกจ็อบเริ่มจาก VM ว่างเปล่า

รันเนอร์ที่ GitHub โฮสต์คือเครื่องเสมือนใหม่สำหรับทุกจ็อบ ไม่มีสิ่งที่จ็อบก่อนดาวน์โหลดหรือ build ไว้อยู่บนนั้นเลย แต่ละจ็อบจึงต้องสร้างสภาพเดิมขึ้นมาใหม่:

| ขั้นตอน | รันเนอร์ที่ GitHub โฮสต์ | Skipbox |
|---|---|---|
| ตั้งค่า Node, Python, Java | ดาวน์โหลด toolchain | เจอใน tool cache จากจ็อบก่อน |
| ติดตั้ง dependency | ดาวน์โหลดและแตก archive ของแคช ถ้า miss ก็ดาวน์โหลดจาก registry ทั้งหมด | อ่านแคชของ package manager จากดิสก์ |
| build อิมเมจ Docker | เริ่มโดยไม่มี layer และ build ใหม่ทุกขั้นตอน | ใช้ layer จาก build ครั้งก่อนซ้ำ |
| รันเทสต์ | 2 CPU บน `ubuntu-latest` ของรีโพสิทอรีส่วนตัว | 4 vCPU ขึ้นไป |

สามแถวแรกไม่ได้สร้างอะไรใหม่เลย แค่พาเครื่องกลับไปอยู่ในสภาพเดียวกับเมื่อวาน

แคชของ GitHub ช่วยบรรเทาได้ แต่ไม่ได้เปลี่ยนปัญหานี้ แคชเก็บได้ 10 GB ต่อรีโพสิทอรี ลบรายการที่ไม่มีจ็อบไหนอ่านมา 7 วัน และ feature branch ใหม่อ่านแคชของ feature branch อื่นไม่ได้ แม้แคชจะ hit ก็ยังต้องดาวน์โหลดและแตก archive ทุกครั้งที่รัน

## การรอทำให้คุณเสียอะไร

สมมติว่าการตั้งค่าใช้เวลา 3 นาทีในแต่ละจ็อบ และทีมของคุณรัน 100 จ็อบต่อวัน นั่นคือเวลารันเนอร์วันละ 300 นาทีที่ใช้ไปกับการพาเครื่องกลับสู่สภาพเดิม และทุก pull request ก็ต้องรอส่วนของตัวเอง รีวิวเริ่มช้าลง merge ช้าลง และวิศวกรก็สลับไปทำอย่างอื่นระหว่างรอ

เมื่อคิดเงินรายนาที นาทีเหล่านั้นอยู่ในใบแจ้งหนี้ รันเนอร์ 4 vCPU ตามจำนวนนาทีต่อเดือน:

| นาทีต่อเดือน (4 vCPU) | GitHub | Skipbox S | ประหยัดได้ต่อเดือน |
|---|---|---|---|
| 10,000 | $102 | $39 | **$63** |
| 20,000 | $222 | $39 | **$183** |
| 30,000 | $342 | $39 | **$303** |

ตัวเลขของ GitHub คือบิลหลังหักการใช้งานที่ GitHub Team รวมให้แล้ว ใส่นาทีของคุณเองใน[เครื่องคำนวณบนหน้าแรก](https://skipbox.dev/?ref=g-github-actions-slow-th#cost) ได้ ไม่ต้องเข้าสู่ระบบ

และจำนวนการรันก็มีแต่จะเพิ่มขึ้น:

- **AI coding agent** ทุกการ push ของ agent เริ่ม CI การรอและบิลจึงโตตามจำนวนการ push ไม่ใช่จำนวนคน
- **เทสต์มากขึ้น** ชุด E2E หรือ matrix ทำให้การตั้งค่าซ้ำในทุกจ็อบที่เพิ่มเข้ามา
- **งบประมาณ** คุมบิลด้วยงบประมาณของ GitHub แล้วจ็อบจะไม่เริ่มกลางเดือน ซึ่งทำให้ merge หยุดไปด้วย

## เร่งความเร็วเองคือโปรเจกต์หนึ่ง

ถ้าจะใช้รันเนอร์ที่ GitHub โฮสต์ต่อและทำให้เร็ว คุณต้องรับงานแบบนี้:

- ตั้ง cache key จาก hash ของ lockfile และปรับ `restore-keys` จนกว่าจะ hit
- เพิ่ม buildx และ export แคชของ Docker ด้วย `cache-to` ภายใน 10 GB เดิม
- แบ่งเทสต์เป็น shard ซึ่งทุก shard ต้องตั้งค่าซ้ำ และนาทีที่ถูกคิดเงินก็เพิ่มขึ้น
- หรือรันรันเนอร์แบบ self-hosted เอง: จัดเตรียมเครื่อง อัปเดต OS เก็บกวาดระหว่างจ็อบ และซ่อมเมื่อมันล่ม

ทุกข้อเป็นการแก้ทางอ้อมให้เครื่องที่ลืมทุกอย่าง Skipbox เก็บเครื่องไว้ จึงไม่ต้องทำสักข้อ

## อะไรเปลี่ยนเมื่อใช้ Skipbox

**การตั้งค่ายังอยู่บนดิสก์** จ็อบของคุณรันบนเครื่องของบัญชีคุณเอง และเครื่องนั้นอยู่ต่อระหว่างจ็อบ อิมเมจ Docker, layer และ build cache แคชแพ็กเกจของ npm, pip, Gradle และอื่นๆ เครื่องมือที่ `setup-node` และ action อื่นๆ ติดตั้ง ได้พื้นที่แคชอย่างน้อย 7× ของ GitHub ไม่หมดอายุหลัง 7 วัน และไม่มีกฎเรื่อง branch

**เครื่องใหญ่ขึ้นในราคาเหมาจ่าย** คอมไพเลอร์และตัวรันเทสต์เริ่ม worker หนึ่งตัวต่อหนึ่งคอร์ คอร์ที่มากขึ้นจึงทำให้ขั้นตอนที่ใช้ CPU หนักสั้นลง

| แพ็กเกจ | เครื่อง | ราคา |
|---|---|---|
| S | 4 vCPU · 16 GB | $39 ต่อเดือน |
| M | 8 vCPU · 16 GB | $79 ต่อเดือน |
| L | 16 vCPU · 32 GB | $149 ต่อเดือน |

ทุกแพ็กเกจใช้ได้ไม่จำกัดนาที จ็อบบน Skipbox ไม่ใช้นาที GitHub งบประมาณของ GitHub จึงไม่เคยหยุดจ็อบเหล่านี้

**ไม่มีเครื่องให้ดูแล** Skipbox จัดเตรียมเครื่อง อัปเดต OS และเครื่องมือ เก็บกวาดหลังทุกจ็อบ ตรวจสุขภาพเครื่อง และสร้างเครื่องที่ไม่ผ่านการตรวจขึ้นใหม่

## ย้ายได้ด้วยบรรทัดเดียว

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

1. เข้าสู่ระบบ Skipbox ด้วย GitHub
2. ติดตั้งแอป Skipbox บน GitHub แล้วเลือกรีโพสิทอรี
3. เปลี่ยน `runs-on` แล้ว push

สิ่งที่จ็อบแรกติดตั้งไว้จะอยู่บนดิสก์ให้จ็อบที่สอง

## ความปลอดภัย

- เครื่องเป็นของบัญชีคุณคนเดียว ไม่มีจ็อบของบริษัทอื่นรันบนเครื่องนี้
- หลังทุกจ็อบ ข้อมูลรับรอง โปรเซส และคอนเทนเนอร์ของรันเนอร์จะถูกลบ ตั้งแต่ 13 พฤศจิกายน 2026 โค้ดที่ checkout และผลลัพธ์ build ของมัน (`target/` ของ Cargo) จะอยู่บนเครื่องของคุณเองให้จ็อบถัดไป ส่วน “VM ใหม่ทุกจ็อบ” จะให้แต่ละจ็อบได้เครื่องใหม่
- โค้ดจากคนที่ไม่มีสิทธิ์เขียน (เช่น pull request จาก fork) รันบนเครื่องใหม่ที่ใช้แล้วทิ้ง

อ่านรายละเอียดได้ใน[วิธีแยกจ็อบออกจากกัน](https://docs.skipbox.dev/isolation)

## ลองกับจ็อบที่ช้าที่สุดของคุณ

ทดลองใช้ฟรี 7 วัน หรือ 3,000 นาทีของจ็อบ แล้วแต่อย่างไหนครบก่อน ไม่ต้องใช้บัตร ย้ายจ็อบที่ช้าที่สุดไปที่ `runs-on: skipbox` รันสองครั้งติดกัน แล้ววางเวลาของแต่ละขั้นตอนเทียบกับของ GitHub

## คำถามที่พบบ่อย

### ทำไม GitHub Actions ช้าจัง

แต่ละจ็อบบนรันเนอร์ที่ GitHub โฮสต์เริ่มบน VM ใหม่ที่ไม่มีอะไรจากการรันครั้งก่อนเลย จึงต้องดาวน์โหลดเครื่องมือ ติดตั้ง dependency ใหม่ และ build อิมเมจ Docker ใหม่ก่อนเทสต์ของคุณจะเริ่ม Skipbox รันจ็อบของคุณบนเครื่องของบัญชีคุณเอง และเก็บสภาพนั้นไว้บนดิสก์ จ็อบถัดไปจึงเริ่มต่อจากที่จ็อบก่อนทำไว้

### ใส่ actions/cache แล้ว ทำไมเวิร์กโฟลว์ยังช้าอยู่

แม้แคชจะ hit ก็ยังต้องดาวน์โหลดและแตกไฟล์ archive ทุกจ็อบ เพราะ VM ใหม่ทุกครั้ง และแคชของ GitHub เก็บได้ 10 GB ต่อรีโพสิทอรี ลบรายการที่ไม่ได้ใช้ 7 วัน และอ่านจาก branch ข้างเคียงไม่ได้ บน Skipbox แคชแพ็กเกจและ layer ของ Docker อยู่บนดิสก์ของเครื่องอยู่แล้ว ไม่ต้องจัดการ key

### ทำให้ Docker build ใน GitHub Actions เร็วขึ้นได้อย่างไร

ให้ build ได้ใช้ layer จาก build ครั้งก่อน บนรันเนอร์ที่ GitHub โฮสต์ หมายถึงต้อง export แคชด้วย buildx แล้ว import ทุกครั้งที่รัน ภายในขีดจำกัด 10 GB เดิม บน Skipbox อิมเมจและ build cache ของ Docker อยู่บนเครื่องระหว่างจ็อบ docker build จึงใช้ layer ซ้ำได้เอง

### ต้องเขียนเวิร์กโฟลว์ใหม่เพื่อใช้ Skipbox ไหม

ไม่ต้อง สำหรับจ็อบ Linux ให้เปลี่ยน runs-on เป็น skipbox เครื่องเป็น Ubuntu 24.04 ที่มี Docker, Node.js และ Python ขั้นตอนและ action ของคุณรันได้เหมือนเดิม

### ลองกับจ็อบที่ช้าของตัวเองฟรีได้ไหม

ได้ ทดลองใช้ได้ 7 วัน หรือ 3,000 นาทีของจ็อบ แล้วแต่อย่างไหนครบก่อน ไม่ต้องใช้บัตร ย้ายจ็อบที่ช้าที่สุดไปที่ runs-on: skipbox รันสองครั้งติดกัน แล้วเทียบเวลาของแต่ละขั้นตอนกับของ GitHub

อัปเดต 2026-11-11 · https://skipbox.dev/th/guides/github-actions-slow
