ריצות בדיקות אוטומטיות על Pull Requests
תארו לעצמכם: הרגע מיזגתם PR לתוך main, ודקה לאחר מכן הייצור קורס עם שגיאה. מסתבר שהמודול החדש דרס endpoint ישן, ואף בדיקה לא תפסה את זה. תרחיש זה מוכר לצוותים רבים. עברנו את זה ומאז אכפנו כלל נוקשה: כל PR עובר דרך pipeline בדיקות אוטומטי. אין אור ירוק — אין מיזוג. ריצות בדיקות אוטומטיות על PR הן קו ההגנה הבסיסי מפני רגרסיות. מפתח לא יכול למזג קוד ששובר פונקציונליות קיימת. זה לא תחליף לסקירת קוד, אלא תוספת: המבקרים מתמקדים בלוגיקה, לא בתפיסת באגים ברורים.
לפי תיעוד GitHub Actions, שמירת תלויות במטמון מקצרת את זמן ההתקנה מ-90 שניות ל-5 שניות — מהיר פי 18. ביצוע בדיקות מטריציוניות מאפשר לבדוק גרסאות סביבה שונות במקביל, ומאיץ את הריצה הכוללת פי 3–4. זה חוסך עד 40 שעות בחודש על דיבוג. הניסיון שלנו — מעל 5 שנים ב-CI/CD ו-100+ pipelines מוגדרים — מאשר שריצות בדיקות אוטומטיות מחזירות את ההשקעה כבר בתוך הספרנט הראשון.
למה ריצות בדיקות אוטומטיות על PR הן קריטיות
ללא הגנה זו, אתם מסתכנים ב:
- CI שבור על
fail-fast— אם באג מתמזג, כל הספרנט הבא מוקדש לתיקונו. - בזבוז זמן על סקירת קוד — המבקרים מוסחים על ידי שגיאות שבדיקות יכלו לתפוס.
- בדיקות ידניות — ככל שיש פחות שגרה, כך מהירות האספקה גבוהה יותר.
אילו בדיקות להריץ ומאילו לוותר
| סוג בדיקה | חובה? | מתי להריץ | מטרה |
|---|---|---|---|
| Linting | כן | על כל commit | סגנון עקבי, תפיסת באגים פוטנציאליים |
| בדיקות יחידה | כן | על כל PR | בדיקת לוגיקה מבודדת |
| בדיקות אינטגרציה | כן (DB/API) | על כל PR | אינטראקציה בין רכיבים |
| E2E | לא (לפי דרישה) | רק לשינויים בתרחישים קריטיים | בדיקת מסלול משתמש מלא |
| בדיקות אבטחה | מומלץ | פעם ביום או בשחרור | מציאת פרצות |
מבנה ה-Pipeline
Pipeline מתוכנן היטב מתפצל למשימות מקבילות עם אסטרטגיית # .github/workflows/pr.yml name: PR Tests on: pull_request: branches: [main, develop] concurrency: group: ${{ github.workflow }}-${{ github.ref }} cancel-in-progress: true # Отменяем старые запуски при новом push jobs: lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: 20, cache: npm } - run: npm ci - run: npm run lint && npm run type-check unit: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: 20, cache: npm } - run: npm ci - run: npm test -- --coverage - uses: codecov/codecov-action@v4 with: token: ${{ secrets.CODECOV_TOKEN }} integration: runs-on: ubuntu-latest services: postgres: image: postgres:16 env: POSTGRES_DB: testdb POSTGRES_PASSWORD: test options: >- --health-cmd pg_isready --health-interval 5s --health-timeout 5s --health-retries 5 steps: - uses: actions/checkout@v4 - uses: actions/setup-node@v4 with: { node-version: 20, cache: npm } - run: npm ci - run: npm run test:integration env: DATABASE_URL: postgresql://postgres:test@localhost:5432/testdb :
---
# .github/workflows/pr.yml
name: PR Tests
on:
pull_request:
branches: [main, develop]
concurrency:
group: ${{ github.workflow }}-${{ github.ref }}
cancel-in-progress: true # Отменяем старые запуски при новом push
jobs:
lint:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run lint && npm run type-check
unit:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm test -- --coverage
- uses: codecov/codecov-action@v4
with:
token: ${{ secrets.CODECOV_TOKEN }}
integration:
runs-on: ubuntu-latest
services:
postgres:
image: postgres:16
env:
POSTGRES_DB: testdb
POSTGRES_PASSWORD: test
options: >-
--health-cmd pg_isready
--health-interval 5s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
- run: npm ci
- run: npm run test:integration
env:
DATABASE_URL: postgresql://postgres:test@localhost:5432/testdb
איך להגדיר מטמון כדי להאיץ את ה-Pipeline
ללא מטמון, npm ci על runner קר לוקח 60–90 שניות. עם מטמון — 5–10 שניות. השתמשו במטמון המובנה ב-actions/setup-node או במפורש דרך actions/cache:
---
# Кэш node_modules по package-lock.json
- uses: actions/setup-node@v4
with:
node-version: 20
cache: npm
# Встроенный кэш в actions/setup-node
# Или явно через actions/cache
- uses: actions/cache@v4
with:
path: ~/.npm
key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }}
---השפעת המטמון על המהירות:
| שיטה | זמן התקנת תלויות | זמן pipeline כולל |
|---|---|---|
| ללא מטמון | 60–90 שניות | 3–5 דקות |
| עם מטמון (actions/setup-node) | 5–10 שניות | 1–2 דקות |
| מטמון מובנה + מטריצה | 5–10 שניות למשימה | 1–2 דקות (במקביל) |
בדיקות מטריציוניות ותמיכה במספר ערימות טכנולוגיות
אם היישום חייב לעבוד על מספר גרסאות Node.js או PHP, השתמשו במטריצה:
strategy: matrix: node-version: [18, 20, 22] fail-fast: false # Запускаем все версии даже если одна упала לפרויקטים של Laravel, השתמשו בביצוע מקביל של PHPUnit:
---
- name: Run PHPUnit
run: php artisan test --parallel --coverage-clover=coverage.xml
env:
DB_CONNECTION: pgsql
DB_DATABASE: testing
- name: Upload coverage
uses: codecov/codecov-action@v4
with:
files: coverage.xml
---# Кэш node_modules по package-lock.json - uses: actions/setup-node@v4 with: node-version: 20 cache: npm # Встроенный кэш в actions/setup-node # Или явно через actions/cache - uses: actions/cache@v4 with: path: ~/.npm key: ${{ runner.os }}-node-${{ hashFiles('**/package-lock.json') }} מריץ בדיקות במקביל דרך strategy: matrix: node-version: [18, 20, 22] fail-fast: false # Запускаем все версии даже если одна упала . על 200+ בדיקות, זה מאיץ פי 3–4.
בדיקות סטטוס והגנת ענפים
בהגדרות GitHub → Branches → Branch protection rules, הוסיפו בדיקות סטטוס נדרשות: - name: Run PHPUnit run: php artisan test --parallel --coverage-clover=coverage.xml env: DB_CONNECTION: pgsql DB_DATABASE: testing - name: Upload coverage uses: codecov/codecov-action@v4 with: files: coverage.xml , --parallel, brianium/paratest. מיזוג לתוך lint ללא בדיקות אלה הוא בלתי אפשרי.
אופטימיזציית מהירות: סינון נתיבים וחלוקת בדיקות
-
סינון נתיבים — הרצת בדיקות רק כשקבצים רלוונטיים משתנים (למשל, דרך
unitב-GitHub Actions). - חלוקת בדיקות — פיזור בדיקות על פני מספר runners (מטריצת GitHub Actions).
-
רק מודולים ששונו — Jest
integration, pytestpaths.
מטרה: ה-pipeline מסתיים תוך 5 דקות. pipelines איטיים גורמים למפתחים להתעלם מהם.
תהליך ההתקנה ומה כלול בעבודה
- ניתוח בדיקות קיימות ותשתית הפרויקט.
- עיצוב ה-pipeline: הגדרת משימות, מטריצות, מטמון.
- יישום תצורת GitHub Actions המותאמת לערימה הטכנולוגית שלכם.
- הגדרת הגנת ענפים ובדיקות סטטוס נדרשות.
- בדיקה על PR אמיתי, דיבוג.
- תיעוד התהליך והעברה לצוות.
כתוצאה מכך, אתם מקבלים:
- תצורת GitHub Actions עם מטמון ומטריצה
- בדיקות סטטוס וכללי הגנת ענפים
- דוחות כיסוי (Codecov, Coveralls)
- תיעוד להרצת בדיקות מקומית
- גישה לתבנית ההתחלה המהירה שלנו לפרויקטים חדשים
- שבועיים של תמיכה לאחר השחרור
ציר זמן ועלות
התקנה בסיסית עם בדיקות יחידה ואינטגרציה עבור Node.js או PHP אורכת 1–2 ימים. הוספת כיסוי ותג — עוד חצי יום. ציר הזמן הסופי תלוי במורכבות הפרויקט (מספר שירותים, סוגי בדיקות). העלות נקבעת באופן אישי.
הזמינו התקנת CI pipeline מהמהנדסים שלנו — אנו מבטיחים pipeline יציב ותיעוד. קבלו ייעוץ על היישום — צרו קשר כדי לדון בפרויקט שלכם.







