אנחנו צוות של מהנדסי DevOps עם ניסיון של 5+ שנים ב-CI/CD. הגדרת builds מטריציוניים היא משימה שכל DevOps נתקל בה כשמתחזקים פרויקטים מרובי-פלטפורמות. דמיינו שאתם מפתחים ספריית Python שחייבת לעבוד עם גרסאות 3.9, 3.10, 3.11, 3.12 על Ubuntu, Windows ו-macOS. ללא מטריצה, אתם כותבים 12 jobs זהים או מריצים אותם ברצף — ה-pipeline שלכם מתנפח ל-60+ דקות. עם matrix builds, קובץ YAML אחד מייצר 12 jobs מקבילים, ודוח תאימות מלא מוכן תוך 5–7 דקות. הבדל הביצועים: matrix builds מהירים פי 4 מריצות רצפות. עבור צוות של 10 מפתחים, זה חוסך $2000 בחודש בעלויות CI ומבטל 10 שעות המתנה ביום.
בעיות שאנחנו פותרים
- כפילות קוד: ארבעה jobs זהים עם גרסאות שונות — מקור לשגיאות ועומס תחזוקה.
- Pipelines ארוכים: ריצות רצפות מכפילות את זמן ההמתנה של המפתחים.
- אובדן הקשר: כשבדיקה אחת נכשלת, כל השאר נעצרים, ומסתירים את התמונה המלאה.
Matrix builds פותרים את כל השלוש בצורה דקלרטיבית.
איך להגדיר matrix build ב-GitHub Actions
---
jobs:
test:
runs-on: ubuntu-latest
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
os: [ubuntu-latest, windows-latest]
fail-fast: false
steps:
- uses: actions/checkout@v4
- name: Set up Python ${{ matrix.python-version }}
uses: actions/setup-python@v5
with:
python-version: ${{ matrix.python-version }}
- run: pip install -e ".[test]" && pytest
---
jobs: test: runs-on: ubuntu-latest strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12"] os: [ubuntu-latest, windows-latest] fail-fast: false steps: - uses: actions/checkout@v4 - name: Set up Python ${{ matrix.python-version }} uses: actions/setup-python@v5 with: python-version: ${{ matrix.python-version }} - run: pip install -e ".[test]" && pytest הוא קריטי. כברירת מחדל, GitHub Actions עוצר את כל ה-matrix jobs בכשלון הראשון. לבדיקת תאימות, אתם צריכים לראות את כל התוצאות. זה נותן 8 jobs מקבילים.
הכללות והחרגות במטריצה
לא כל השילובים הגיוניים. Python 3.9 על Windows עשוי להיות לא נתמך:
---
strategy:
matrix:
python-version: ["3.9", "3.10", "3.11", "3.12"]
os: [ubuntu-latest, windows-latest]
exclude:
- python-version: "3.9"
os: windows-latest
include:
- python-version: "3.12"
os: ubuntu-latest
experimental: true
fail-fast: false מוסיף משתנים נוספים לשילובים ספציפיים. כאן strategy: matrix: python-version: ["3.9", "3.10", "3.11", "3.12"] os: [ubuntu-latest, windows-latest] exclude: - python-version: "3.9" os: windows-latest include: - python-version: "3.12" os: ubuntu-latest experimental: true מאפשר include.
GitLab CI: parallel:matrix
ב-GitLab, השתמשו ב-experimental: true:
---
test:
image: python:${PYTHON_VERSION}
parallel:
matrix:
- PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12"]
DATABASE: ["postgresql", "sqlite"]
script:
- pip install -e ".[test]"
- pytest --database $DATABASE
---GitLab יוצר 8 jobs כמו continue-on-error: ${{ matrix.experimental }}. עבור Docker מרובה-ארכיטקטורות:
---
build:
parallel:
matrix:
- ARCH: [amd64, arm64]
PLATFORM: [linux/amd64, linux/arm64]
script:
- docker buildx build --platform $PLATFORM -t myapp:${CI_COMMIT_SHORT_SHA}-${ARCH} --push .
לאחר מכן צרו manifest מרובה-ארכיטקטורות.
בחירת fail-fast ו-continue-on-error
parallel:matrix מבטיח תמונה מלאה של תאימות. בלעדיו, הכשלון הראשון מבטל את כל ה-jobs. הגדרת test: image: python:${PYTHON_VERSION} parallel: matrix: - PYTHON_VERSION: ["3.9", "3.10", "3.11", "3.12"] DATABASE: ["postgresql", "sqlite"] script: - pip install -e ".[test]" - pytest --database $DATABASE לשילובים ניסיוניים מאפשרת לבדוק גרסאות לא יציבות מבלי לחסום את ה-pipeline.
השוואה: מטריצה מול רצף
| מאפיין | רצף | מטריצה (מקביל) |
|---|---|---|
| זמן ביצוע ל-4 גרסאות (5 דקות כל אחת) | 20 דקות | 5 דקות |
| כפילות קוד | 4 עותקים | Job אחד עם מטריצה |
| נראות | בדיקה אחת בכל פעם | הכל בו-זמנית |
| סיכון לעצירה | בכשלון הראשון | נשלט דרך fail-fast |
עבור 10–20 PRs ביום, מפתחים ממתינים דקות במקום חצי שעה. Matrix builds מהירים פי 4.
השוואה בין מערכות CI
| מערכת CI | תחביר | תכונות |
|---|---|---|
| GitHub Actions | test: [3.9, postgresql] |
include/exclude, fail-fast, continue-on-error |
| GitLab CI | test: [3.9, sqlite] |
variables, include/exclude, parallel |
| Jenkins | Matrix Project | Plugin, הגדרת צירים |
מתי נדרשים matrix builds?
- ספריות מרובות-ריצות (Python 3.9–3.12, PHP 7.4–8.2).
- אפליקציות חוצות-פלטפורמות (Node.js על Linux, Windows, macOS).
- Docker מרובה-ארכיטקטורות (amd64, arm64 עבור Raspberry Pi ושרתי ARM).
Matrix builds מקצרים את זמן הבדיקות פי 4 בהשוואה לריצות רצפות. זה קריטי במהלך פיתוח פעיל, וחוסך $2000/חודש בעלויות CI עבור צוות של 10 מפתחים.
תהליך העבודה
- ניתוח: זיהוי גרסאות, ארכיטקטורות, מערכות הפעלה.
- עיצוב: בחירת מערכת CI, עיצוב מטריצה עם החרגות ושילובים ניסיוניים.
- יישום: כתיבת קונפיגורציה, הגדרת caching, runners מקבילים.
- בדיקה: הרצת מטריצה מלאה, אימות התנהגות.
- פריסה: שילוב ב-CI/CD, תיעוד.
מה כלול
- אסטרטגיית מטריצה מותאמת לסט הטכנולוגי שלכם.
- החרגות והכללות לשילובים לא תואמים.
- אופטימיזציית זמן: caching, מקביליות שלבים.
- תיעוד להוספת גרסאות חדשות.
- הדרכת צוות: קריאת דוחות מטריצה, הוספת שילובים.
למהנדסים שלנו יש ניסיון של 5+ שנים ב-CI/CD, עם למעלה מ-50 פרויקטים המשתמשים ב-matrix builds. אנחנו מבטיחים ללא כפילות קוד והפחתה של פי 2–4 בזמן הבדיקות.
לוחות זמנים ותמחור
הוספת אסטרטגיית מטריצה ל-job קיים: משעה אחת. הגדרה מלאה עם exclude, ניסיוני ו-build: parallel: matrix: - ARCH: [amd64, arm64] PLATFORM: [linux/amd64, linux/arm64] script: - docker buildx build --platform $PLATFORM -t myapp:${CI_COMMIT_SHORT_SHA}-${ARCH} --push . נכון: חצי יום. Monorepo עם מספר שפות: עד 2–3 ימים. התמחור מחושב באופן אישי. צרו קשר לייעוץ — נגדיר matrix builds לפרויקט שלכם. הזמינו הגדרת CI/CD וקבלו ביצוע בדיקות מקביל ללא כפילות קוד.







