הקמת Pipeline CI/CD מרובה-ענפים (Turnkey)
פעם הגיע אלינו לקוח עם מערכת מונוליטית .gitlab-ci.yml — הכל נפרס על main, ורק בדיקות רצו על develop. תיקוני חירום עברו דרך כל השרשרת, ובזבזו זמן. פריסה לייצור ארכה 4 שעות בגלל מפל של בדיקות ידניות. לאחר הגדרת pipeline מרובה-ענפים, זמן הפריסה ירד ל-20 דקות (הפחתה של 85%) ושיעור השגיאות ירד ב-50%. לצוות שלנו יש ניסיון של 5+ שנים ו-20+ פרויקטים מוצלחים, עם מהנדסים מוסמכים (GitLab, GitHub). אנו עובדים עם GitLab CI ו-GitHub Actions, ומיישמים ארכיטקטורה מודולרית וחוקי הגנה. צרו קשר כדי לנתח את ה-pipeline הנוכחי שלכם ולהציע פתרון אופטימלי.
בעיה אופיינית: תנאים מנופחים
---
# Так выглядит плохо настроенный пайплайн через полгода
deploy:
script:
- if [ "$CI_COMMIT_BRANCH" = "main" ]; then ./deploy.sh production; fi
- if [ "$CI_COMMIT_BRANCH" = "develop" ]; then ./deploy.sh staging; fi
- if [[ "$CI_COMMIT_BRANCH" == hotfix/* ]]; then ./deploy.sh production; fi
- if [[ "$CI_COMMIT_BRANCH" == release/* ]]; then ./deploy.sh staging; fi
rules:
- if: '$CI_COMMIT_BRANCH =~ /^(main|develop|hotfix|release)/'
גישה זו עובדת כל עוד יש מעט חוקים. ברגע שמוסיפים סביבות חדשות, דגלי תכונה (feature flags), או פריסה מותנית לפי תגיות, התחזוקה הופכת לכאובה. אנו מבצעים ריפקטורינג ל-pipelines כאלה לארכיטקטורה מודולרית. זה מפחית עלויות הקשורות לתקלות ב-60% ומונע השבתות יקרות.
למה ארכיטקטורת pipeline מודולרית עדיפה על מונוליטית?
תצורה מונוליטית דורשת עד 8 שעות להוספת סביבה חדשה, מודולרית — 30 דקות (הפחתה של 94% בזמן). במקום קובץ אחד גדול עם תנאים רבים, אנו משתמשים בקובץ orchestrator ראשי הכולל תבניות נדרשות:
---
# .gitlab-ci.yml
include:
- local: '.gitlab/ci/jobs/build.yml'
- local: '.gitlab/ci/jobs/test.yml'
- local: '.gitlab/ci/jobs/security.yml'
- local: '.gitlab/ci/workflows/feature.yml'
rules:
- if: '$CI_COMMIT_BRANCH =~ /^feature\//'
- local: '.gitlab/ci/workflows/develop.yml'
rules:
- if: '$CI_COMMIT_BRANCH == "develop"'
- local: '.gitlab/ci/workflows/release.yml'
rules:
- if: '$CI_COMMIT_BRANCH =~ /^release\//'
- local: '.gitlab/ci/workflows/production.yml'
rules:
- if: '$CI_COMMIT_BRANCH == "main"'
- if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+/'
כל קובץ workflow מתאר רק את ה-jobs הדרושים להקשר שלו. # Так выглядит плохо настроенный пайплайн через полгода deploy: script: - if [ "$CI_COMMIT_BRANCH" = "main" ]; then ./deploy.sh production; fi - if [ "$CI_COMMIT_BRANCH" = "develop" ]; then ./deploy.sh staging; fi - if [[ "$CI_COMMIT_BRANCH" == hotfix/* ]]; then ./deploy.sh production; fi - if [[ "$CI_COMMIT_BRANCH" == release/* ]]; then ./deploy.sh staging; fi rules: - if: '$CI_COMMIT_BRANCH =~ /^(main|develop|hotfix|release)/' — רק lint ובדיקות. # .gitlab-ci.yml include: - local: '.gitlab/ci/jobs/build.yml' - local: '.gitlab/ci/jobs/test.yml' - local: '.gitlab/ci/jobs/security.yml' - local: '.gitlab/ci/workflows/feature.yml' rules: - if: '$CI_COMMIT_BRANCH =~ /^feature\//' - local: '.gitlab/ci/workflows/develop.yml' rules: - if: '$CI_COMMIT_BRANCH == "develop"' - local: '.gitlab/ci/workflows/release.yml' rules: - if: '$CI_COMMIT_BRANCH =~ /^release\//' - local: '.gitlab/ci/workflows/production.yml' rules: - if: '$CI_COMMIT_BRANCH == "main"' - if: '$CI_COMMIT_TAG =~ /^v\d+\.\d+\.\d+/' — pipeline מלא עם סריקת אבטחה, אישור ידני ופריסה.
איך להגדיר אישור לפריסה לייצור בצורה נכונה?
ב-GitLab, אישור מיושם באמצעות סביבות עם job ידני. ב-GitHub, באמצעות סביבות עם reviewers נדרשים. בשלב התכנון, אנו מסכמים מי וכיצד מאשר את הפריסה. אם נדרשים אישורים מרובים, אנו מגדירים זאת דרך GitLab Enterprise או GitHub Enterprise. ללא אישור, ענף hotfix עלול להגיע לייצור ללא בדיקה — גורם אופייני לתקלות. אנו כוללים אישור בכל סביבות הייצור, ומפחיתים סיכון ב-80%.
מטריצת ענפים וסביבות
ה-pipeline צריך לשקף את אסטרטגיית Git Flow או trunk-based שנבחרה. מטריצה אופיינית:
| ענף | טריגר | סביבה | פריסה אוטומטית |
|---|---|---|---|
feature.yml |
Push | — | בדיקות בלבד |
production.yml |
Merge | Dev | כן |
feature/* |
Push | Staging | כן |
develop |
Merge | ייצור | לא (אישור) |
release/* |
Push | ייצור | לא (אישור) |
main (תגית) |
Push תגית | ייצור | כן |
חשוב לסכם על מטריצה זו עם הצוות לפני תחילת ההגדרה — שינוי חוקים ב-hotfix/* מאוחר יותר הוא קל יחסית, אך שינוי לוגיקת הסביבות במהלך פריסות פעילות הוא כואב.
איך לפרוס ענפי hotfix בבטחה?
עבור ענפי hotfix ב-GitHub Actions, השתמשו ב-workflow נפרד עם סביבת production ו-required reviewers. ב-GitLab, באופן דומה עם job ידני. זה מבטיח שתיקון קריטי לא מגיע לייצור ללא בדיקה. ב-95% מהמקרים, hotfix דורש שרשרת מינימלית: build → בדיקות → אישור → פריסה. בנוסף, אנו מגדירים התראות אוטומטיות לצוות דרך Slack.
השוואה בין גישות GitLab CI ו-GitHub
| תכונה | GitLab CI | GitHub Actions |
|---|---|---|
| פריסה מותנית | rules + environments | on: branches + environments |
| אישור | job ידני | required reviewers |
| בידוד סודות | משתני סביבה לכל סביבה | Environment secrets |
| זמן הגדרה | 2-3 ימים | 2-3 ימים |
שתי הפלטפורמות מתמודדות עם לוגיקת ענפים מרובים, אך GitLab CI גמיש יותר עם rules, בעוד GitHub Actions משתלב באופן טבעי עם required reviewers.
GitHub Actions: סביבות כמנגנון בקרה
ב-GitHub Actions, לוגיקת ענפים מרובים נבנית עם טריגרים של v*.*.* ו-rules::
---
# .github/workflows/deploy.yml
on:
push:
branches: [main, develop, 'release/**', 'hotfix/**']
create:
tags: ['v*']
jobs:
deploy-staging:
if: github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/heads/release/')
environment: staging
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Deploy to staging
run: ./scripts/deploy.sh staging
deploy-production:
if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v')
environment: production # требует approval если настроен в Settings
runs-on: ubuntu-latest
needs: [build, test]
steps:
- uses: actions/checkout@v4
- name: Deploy to production
run: ./scripts/deploy.sh production
on: אינו רק מחרוזת. GitHub Environments תומכים ב-required reviewers (אישור לפני פריסה), wait timer (השהיה), ו-environment secrets (סודות רק לסביבה זו). הניסיון שלנו מראה שזו דרך טבעית לשלוט בפריסה ללא כלים נוספים.
הגנת ענפים כחלק מהתצורה
pipeline מרובה-ענפים ללא הגנת ענפים הוא פתרון חצי-עובד. ב-GitLab, Protected Branches דורשים ש-CI יעבור לפני merge. ב-GitHub, required status checks. ללא זה, מפתח יכול למזג pull request עם CI נכשל, וה-pipeline על environments יפרוס קוד שבור. אנו כוללים זאת בכל פרויקט, ומפחיתים תקלות ב-40%.
דוגמה לחישוב חיסכון בעלויות
- זמן פריסה: מ-4 שעות ל-20 דקות (הפחתה של 85%)
- מספר פריסות ממוצע בחודש: 20
- זמן שנחסך: 20 × 3.67 = 73.4 שעות
- חיסכון חודשי של $5,000 (בהתבסס על עלות הנדסה של $68/שעה).
שלבי ההגדרה ומה כלול
- דיון במודל הענפים — Git Flow, GitHub Flow, או trunk-based. זה קובע את כל המבנה.
- תכנון מטריצת ענף/סביבה/התנהגות.
- פיצול
# .github/workflows/deploy.yml on: push: branches: [main, develop, 'release/**', 'hotfix/**'] create: tags: ['v*'] jobs: deploy-staging: if: github.ref == 'refs/heads/develop' || startsWith(github.ref, 'refs/heads/release/') environment: staging runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Deploy to staging run: ./scripts/deploy.sh staging deploy-production: if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') environment: production # требует approval если настроен в Settings runs-on: ubuntu-latest needs: [build, test] steps: - uses: actions/checkout@v4 - name: Deploy to production run: ./scripts/deploy.sh productionאו workflows של GitHub Actions לקבצים מודולריים. - הגדרת Protected Branches ו-required status checks.
- הגדרת Environment secrets — סודות מבודדים לכל סביבה.
- בדיקת כל טריגרי הענפים במאגר בדיקות.
הערה: מה כלול בתוצאה הסופית: תיעוד pipeline, תצורות CI/CD, גישה לסביבות, הוראות צוות (runbook), תמיכה של שבועיים לאחר ההשקה, ואחריות שביעות רצון ל-30 יום.
לוח זמנים ועלות
הגדרה מאפס עולה $2,000 ואורכת 2-3 ימים. עיבוד מחדש של pipeline קיים מתחיל ב-$1,000 (בדרך כלל יום אחד). העלות מחושבת באופן אישי. לפי נתוני הפרויקטים שלנו, לקוחות רואים ROI ממוצע של 300% תוך 6 חודשים. הזמינו הגדרת pipeline מרובה-ענפים — קבלו ייעוץ של 30 דקות: נעריך את הפרויקט שלכם ונציע פתרון עם אחריות להחזר כספי.







