Skipbox

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

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

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

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

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

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

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

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

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

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

ตัวเลขของ GitHub คือบิลหลังหักการใช้งานที่ GitHub Team รวมให้แล้ว ใส่นาทีของคุณเองในเครื่องคำนวณบนหน้าแรก ได้ ไม่ต้องเข้าสู่ระบบ

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

  • 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 หนักสั้นลง

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

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

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

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) รันบนเครื่องใหม่ที่ใช้แล้วทิ้ง

อ่านรายละเอียดได้ในวิธีแยกจ็อบออกจากกัน

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

ทดลองใช้ฟรี 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

อัปเดต 11 พฤศจิกายน 2026

CI/CD ที่เร็วขึ้นด้วยแคชที่พร้อมเสมอ

รันเนอร์ที่พร้อมทำงานเสมอ ในราคาเหมาจ่าย

ค่าใช้จ่ายเพียง 1/12 ของ GitHub เมื่อใช้เต็มที่ ราคาเหมาจ่าย จึงรันได้ทั้งวัน พื้นที่แคช 7 เท่าของ GitHub

  • ไม่ต้องใช้บัตร
  • เข้าสู่ระบบด้วย GitHub
  • ยกเลิกได้ทุกเมื่อ