ข้ามไปยังเนื้อหา
Tayakorn
CI/CD Handbook

CI/CD Handbook

LEVEL 2 · ระดับกลาง

Matrix & การขนานงาน

ถ้าโปรแกรมของคุณต้องทำงานได้บน Node 18, 20 และ 22 ทั้งบน Linux และ Windows คุณจะเขียน job ซ้ำกัน 6 อันไหม? ไม่ต้อง — matrix คือเครื่องมือที่สร้างชุด job ขนานให้อัตโนมัติจากการประกาศมิติเพียงไม่กี่บรรทัด

7.1 Matrix — ทดสอบหลายมิติพร้อมกัน

matrixnode × osขยายเป็น 3 × 2 = 6 job รันพร้อมกันทั้งหมดnode18 · ubuntunode20 · ubuntunode22 · ubuntunode18 · windowsnode20 · windowsnode22 · windowsแต่ละช่องคือ job อิสระบน runner ของตัวเอง — ตกช่องไหนรู้ทันทีว่าพังที่ combination ไหน
FIG 7.1 ประกาศสองมิติ CI ขยายเป็นทุกคู่ผสม (cartesian product) แล้วรันขนานกันหมด · ครอบคลุมหลายสภาพแวดล้อมโดยเขียนครั้งเดียว
jobs:
  test:
    strategy:
      fail-fast: false          # ช่องหนึ่งตก ไม่ยกเลิกช่องอื่น — เห็นภาพครบ
      matrix:
        node: [18, 20, 22]
        os: [ubuntu-latest, windows-latest]
    runs-on: ${{ matrix.os }}     # แต่ละ job หยิบค่าจากช่องของตัวเอง
    steps:
      - uses: actions/setup-node@v4
        with:
          node-version: ${{ matrix.node }}

7.2 fail-fast — เห็นภาพครบ หรือ ประหยัดทรัพยากร

fail-fast: true (ค่าเริ่มต้น) หมายถึง "พอช่องใดช่องหนึ่งตก ให้ยกเลิกช่องที่เหลือทันที" — ประหยัดเวลา/เครื่อง เหมาะตอนแค่อยากรู้ว่า "ผ่านหรือไม่ผ่าน" ส่วน fail-fast: false ปล่อยให้ทุกช่องรันจบ เหมาะตอน debug เพราะคุณอยากเห็นว่า พังเฉพาะ Windows + Node 18 หรือพังทุกที่ — ข้อมูลนี้ชี้ต้นตอได้ทันที

7.3 ความเร็วรวมของ pipeline

เพราะ job ขนานกัน เวลารวมของ pipeline ไม่ใช่ผลบวกของทุก job แต่เท่ากับ เส้นทางที่ยาวที่สุด (critical path) เหมือนหลายคนช่วยกันทำงานพร้อมกัน งานเสร็จเมื่อคนที่ช้าที่สุดเสร็จ การออกแบบ pipeline ให้เร็วจึงเป็นเรื่องของ "แตกงานอิสระให้ขนานกันให้มากที่สุด แล้วไล่บีบ job ที่อยู่บนเส้นทางวิกฤต"

สรุปบทที่ 7matrix ขยายมิติที่ประกาศ (เช่น node × os) เป็นชุด job ขนานอัตโนมัติ ครอบคลุมหลายสภาพแวดล้อมด้วยโค้ดครั้งเดียว · fail-fast: false ให้ทุกช่องรันจบเพื่อเห็นภาพครบตอน debug · เวลารวมของ pipeline = เส้นทางที่ยาวที่สุด ไม่ใช่ผลบวก — เร่งได้ด้วยการขนานงานอิสระ

อ่านแบบเต็มเล่ม