- ארגון GitHub מוגדר — עם צוותות, תפקידים והרשאות ברמת least privilege
- קובץ CODEOWNERS שמחייב את האנשים הנכונים לעבור על כל PR
- Repository ruleset פעיל שאוכף code review, status checks ו-signed commits
- טבלת החלטה: מתי Free מספיק, מתי צריך Team, ומתי Enterprise
- ידע לקרוא audit log — לזהות פעולות חריגות ולעמוד ב-compliance
- הבנה מעשית של SSO/SCIM — מתי צריך ואיך זה עובד
- תוכנית מיגרציה — איך לעבור מחשבון אישי לארגון בלי לאבד כלום
- מילון מונחים — 14 מונחים שתצטרכו כדי לנהל ארגון
- תוכלו להגדיר ארגון עם תפקידים, צוותות ו-CODEOWNERS
- תוכלו ליצור repository rulesets שאוכפים מדיניות על branches ו-tags
- תוכלו לנטר פעילות עם audit log ולזהות בעיות compliance
- תוכלו להבדיל בין Free, Team ו-Enterprise ולבחור את התוכנית הנכונה
- תוכלו להעביר ריפוזיטורים מחשבון אישי לארגון בצורה בטוחה
- פרקים קודמים: מומלץ לקרוא פרק 1 (Actions) ופרק 7 (Security) — חלק מהמושגים (secrets, environments, Dependabot) מוזכרים כאן בהקשר ארגוני
- כלים: חשבון GitHub (חינמי), לפחות ריפוזיטורי אחד
- ידע: הבנה בסיסית של branches, PRs ו-code review
- מומלץ: גישה לעוד חשבון GitHub אחד (למשל חשבון בדיקה) כדי לתרגל הזמנת חברים לארגון
מאיפה הגענו: בפרק 8 למדתם לגשת ל-GitHub בצורה תכנותית — REST API, GraphQL, Webhooks ו-GitHub Apps. עכשיו נעבור מגישה תכנותית לניהול ארגוני: איך לנהל צוותות, הרשאות ומדיניות כשיש יותר מאדם אחד.
הפרויקט שנבנה: ארגון GitHub מוגדר עם צוותות, CODEOWNERS ו-rulesets — תשתית ניהולית שתומכת בצוות שגדל.
לאן ממשיכים: בפרק 10 נלמד לבנות קהילות קוד פתוח — issue templates, contributing guidelines ו-Discussions — כדי לפתוח את הפרויקט שבנינו לתרומה מבחוץ.
- Organization (Org)
- ישות ב-GitHub שמאגדת משתמשים, ריפוזיטורים וצוותות תחת חשבון אחד משותף
- Team
- קבוצת משתמשים בתוך ארגון — ניתנת הרשאות ברמת הצוות, לא ברמת הפרט
- Role
- רמת הרשאה: Owner, Member, Billing Manager, Outside Collaborator או Custom Role
- CODEOWNERS
- קובץ שמגדיר מי חייב לאשר שינויים בקבצים מסוימים — אכיפה אוטומטית של code review
- Repository Ruleset
- מדיניות מרכזית שאוכפת כללים על branches ו-tags — הדור החדש של branch protection
- Branch Protection Rule
- הגרסה הישנה של אכיפת מדיניות על branches — עדיין עובדת, אבל rulesets עדיפים
- Audit Log
- יומן שמתעד כל פעולה ניהולית בארגון — מי עשה מה ומתי
- SSO (Single Sign-On)
- מנגנון שמאפשר כניסה אחת לכל השירותים — חיבור GitHub לספק זהות ארגוני
- SAML
- Security Assertion Markup Language — פרוטוקול לאימות SSO בין GitHub לספק הזהות שלכם
- SCIM
- System for Cross-domain Identity Management — סנכרון אוטומטי של משתמשים בין ספק הזהות לארגון ב-GitHub
- Base Permission
- ההרשאה שכל חבר ארגון מקבל אוטומטית על כל ריפוזיטורי — ברירת המחדל
- Outside Collaborator
- משתמש שיש לו גישה לריפוזיטורים ספציפיים בלי להיות חבר ארגון
- Nested Team
- צוות שמוכל בתוך צוות אחר — יורש הרשאות מהצוות ההורה
- Custom Repository Role
- תפקיד מותאם עם הרשאות ספציפיות שמגדירים ב-Enterprise — מעבר ל-5 התפקידים הבסיסיים
9.1 ארגון vs חשבון אישי — מתי להקים Organization
כל חשבון GitHub הוא אחד משני סוגים: Personal account (חשבון אישי) או Organization (ארגון). הם נראים דומים מבחוץ — שניהם יכולים להכיל ריפוזיטורים, שניהם מופיעים עם שם ב-URL — אבל מתחת למכסה הם שונים לחלוטין.
חשבון אישי הוא אתם. כל ריפוזיטורי שייך לכם, כל הרשאה עוברת דרככם, ואין שום מבנה ארגוני. זה עובד מצוין כשאתם עובדים לבד, או עם 1-2 שותפים. אבל ברגע שהצוות גדל — דברים נשברים:
- הרשאות — אין דרך לתת לפרונטאנד הרשאה לריפו של הפרונטאנד בלבד. Collaborator מקבל גישה ל-repo ספציפי, אבל אין שום היררכיה.
- בעלות — אם אתם עוזבים את הפרויקט, הריפוזיטורים שלכם. אין transfer אוטומטי, אין ירושה.
- Billing — כל collaborator צריך PAT או SSH key משלו. אין billing מרכזי.
- Secrets — secrets ברמת repo בלבד. אין org-level secrets ששייכים לכולם.
- Audit — אין audit log. אין דרך לדעת מי שינה מה ומתי.
Organization פותר את כל הבעיות האלה. זה חשבון משותף שמכיל ריפוזיטורים, צוותות ומשתמשים. בעלות שייכת לארגון, לא לאדם. הרשאות מנוהלות דרך צוותות, לא דרך הזמנות אישיות. וכל פעולה מתועדת ב-audit log.
בואו נבין את ההבדל הבסיסי. חשבון אישי הוא כמו דירה בשכירות — אתם גרים שם לבד ומנהלים הכל. Organization הוא כמו בניין משרדים — יש ניהול מרכזי, חדרים לצוותות שונים, ומפתחות שונים לאנשים שונים.
הנה ההשוואה הבסיסית:
| קריטריון | חשבון אישי | Organization |
|---|---|---|
| בעלות | אדם אחד — אם עוזב, הריפוזיטורים שלו | הארגון — ריפוזיטורים שייכים לארגון, לא לאדם |
| הרשאות | Collaborator per repo — אין היררכיה | צוותות + roles — היררכיה מלאה |
| Billing | אישי | מרכזי — חשבונית אחת לכל הארגון |
| Secrets | repo-level בלבד | repo + org-level — שיתוף secrets בין ריפוזיטורים |
| Audit | אין | Audit log מלא — מי עשה מה ומתי |
| CODEOWNERS | עובד, אבל אין צוותות לשייך | CODEOWNERS + צוותות = אכיפה אוטומטית |
| Actions | 2,000 דקות/חודש (Free) | 2,000 (Free) / 3,000 (Team) / 50,000 (Enterprise) |
הכלל הפשוט
אם אחד מהתנאים הבאים מתקיים — הגיע הזמן לארגון:
- יותר מ-2 אנשים עובדים על אותם ריפוזיטורים באופן קבוע
- צריך הפרדת הרשאות — צוותות שונים צריכים גישה שונה
- הפרויקט לא שייך לאדם אחד — זה מוצר של חברה, קהילה או צוות
- צריך billing מרכזי — חשבונית אחת לכל הצוות
- צריך audit trail — רגולציה, compliance או פשוט שקיפות
חשוב: ארגון ב-GitHub הוא חינמי. אין עלות ליצירת ארגון. העלות מתחילה רק כשמשדרגים לתוכנית Team ($4/user/חודש) או Enterprise ($21/user/חודש). עם Free plan מקבלים ארגון עם unlimited public repos, unlimited collaborators, ורוב הפיצ'רים הבסיסיים.
דוגמאות מייצגות — מתי ארגון שינה את המצב
נסתכל על שלושה מצבים אופייניים:
מצב 1: סטארטאפ בשלב מוקדם. שלושה מפתחים, 4 ריפוזיטורים. בהתחלה עבדו מהחשבון האישי של ה-CTO. יום אחד ה-CTO עבר לפרויקט אחר — וכל הריפוזיטורים נשארו "שלו". התוצאה: חודש של בירוקרטיה להעביר בעלות. עם ארגון — הריפוזיטורים שייכים לארגון, ואף אדם בודד לא יכול "לקחת" אותם.
מצב 2: פרויקט קוד פתוח שגדל. מפתח בודד פתח ריפוזיטורי ציבורי. 10 תורמים הצטרפו. בלי ארגון — כל collaborator מקבל Write ישירות. אחד מהם מחק branch בטעות. אין audit log, אין דרך לדעת מי עשה את זה. עם ארגון — צוותות עם הרשאות מדויקות, audit log שמתעד כל פעולה.
מצב 3: חברה עם 15 מפתחים. צוות פרונטאנד, צוות בקאנד, ו-DevOps. כולם צריכים גישה לריפוזיטורים שונים ברמות שונות. בלי ארגון — 15 x 12 = 180 הרשאות אישיות לנהל. עם ארגון — 3 צוותות, כל צוות עם הגדרות ברורות. מפתח חדש? מוסיפים לצוות ומסיימים.
כנסו ל-github.com/settings/organizations. האם יש לכם ארגון? אם כן — בדקו מה התפקיד שלכם (Owner? Member?). אם לא — רשמו לעצמכם: "אני צריך ארגון? כן/לא" לפי הקריטריונים למעלה. אל תיצרו ארגון עדיין — נעשה את זה ביחד בסעיף הבא.
9.2 הגדרת ארגון — מאפס לארגון עובד
הקמת ארגון ב-GitHub לוקחת 2 דקות. ההגדרה הנכונה של מה שמגיע אחרי — הרשאות ברירת מחדל, הגדרות אבטחה, ותבניות — זה מה שקובע אם הארגון יעבוד חלק או ייצור בלאגן.
שלב 1: יצירת ארגון
- כנסו ל-github.com/account/organizations/new
- בחרו תוכנית — Free מספיקה כדי להתחיל ולתרגל את כל מה שנלמד
- בחרו שם לארגון — זה יהיה ה-namespace שלכם:
github.com/your-org-name - הזינו email ליצירת קשר
- ענו על השאלה "This organization belongs to" — my personal account אם זה לצרכי לימוד
טיפ לבחירת שם: שם הארגון מופיע ב-URL של כל ריפו, ב-package names (למשל @your-org/package), וב-container images (ghcr.io/your-org/image). בחרו שם קצר, ייחודי, ללא מקפים מיותרים. אי אפשר לשנות שם ארגון בקלות — זה שובר URLs, packages ו-CI.
שמות טובים: acme-labs, your-company, project-name. שמות גרועים: my-org-2026-v2, john-and-friends-projects. חשבו: אם החברה גדלה ל-100 אנשים — האם השם עדיין הגיוני?
יצירה דרך gh CLI
אפשר ליצור ארגון גם מהטרמינל (אם למדתם פרק 2 — GitHub CLI):
# יצירת ארגון חדש (פותח דפדפן לסיום)
gh api /user/orgs --method POST \
-f login="your-org-name" \
-f name="Your Organization Display Name" \
-f billing_email="billing@example.com"
# בדיקה שהארגון נוצר
gh org list
שימו לב: יצירה דרך ה-API דורשת שלמשתמש שלכם יש permission ליצור ארגונים (זה ברירת המחדל). אחרי היצירה, עדיין צריך להגדיר את ההגדרות דרך ה-UI או דרך API calls נוספים.
שלב 2: הגדרות ברירת מחדל קריטיות
אחרי היצירה, כנסו ל-Settings של הארגון. ההגדרות הבאות חובה לעדכן מייד:
Member Privileges (Settings → Member privileges)
| הגדרה | ברירת מחדל | מומלץ | למה |
|---|---|---|---|
| Base permissions | Read | Read (או None) | כל חבר ארגון מקבל הרשאה זו על כל ריפו. Read מאפשר צפייה בלבד — טוב. Write נותן יותר מדי. |
| Repository creation | Enabled | Disabled (או Public only) | אתם רוצים שליטה על מה שנוצר. אפשר לפתוח בהמשך. |
| Repository forking | Enabled | Disabled | מניעת fork של ריפו פרטי מחוץ לארגון |
| Pages creation | Public | Private (אם Team/Enterprise) | מניעת חשיפת מידע דרך Pages |
הטעות הנפוצה ביותר בהקמת ארגון חדש היא לתת Write כ-base permission. התוצאה: כל חבר ארגון יכול לדחוף קוד לכל ריפו בארגון, כולל ריפוזיטורים שהם לא קשורים אליהם. זה בדיוק ההיפך מ-least privilege. תמיד התחילו עם Read ותנו Write רק דרך צוותות ספציפיים.
Security (Settings → Code security and analysis)
הפעילו את כל האפשרויות הבאות ברמת הארגון — הן יחולו על כל ריפוזיטורי חדש:
- Dependency graph — Enabled (חובה ל-Dependabot)
- Dependabot alerts — Enabled
- Dependabot security updates — Enabled
- Secret scanning — Enabled
- Push protection — Enabled
אם למדתם את פרק 7 (Security), אתם כבר מכירים את כל הפיצ'רים האלה. ההבדל: כאן אתם מפעילים אותם ברמת הארגון — מה שאומר שכל ריפוזיטורי חדש שנוצר מקבל את ההגדרות האלה אוטומטית, בלי שמישהו צריך לזכור להפעיל.
הגדרות Actions (Settings → Actions → General)
ברמת ארגון אפשר לשלוט מי יכול להריץ Actions:
- Actions permissions: "Allow all actions and reusable workflows" (ברירת מחדל) או להגביל ל-actions של GitHub בלבד ושל creators מאומתים
- Required workflows: workflows שחייבים לרוץ על כל ריפו בארגון — מצוין ל-CI מינימלי אחיד
- Fork pull request workflows: מומלץ להגדיר "Require approval for first-time contributors" — מונע הרצת actions זדוני מ-PRs של זרים
Org-level Secrets (Settings → Secrets and variables → Actions)
אחד היתרונות הגדולים של ארגון הוא org-level secrets. במקום להגדיר את אותו API key ב-20 ריפוזיטורים — מגדירים פעם אחת ברמת הארגון ובוחרים אילו ריפוזיטורים (או כולם) יכולים לגשת:
# הגדרת secret ברמת ארגון דרך gh cli
gh secret set NPM_TOKEN \
--org your-org \
--visibility selected \
--repos "repo1,repo2,repo3"
# או ניתן לכל הריפוזיטורים
gh secret set DEPLOY_KEY \
--org your-org \
--visibility all
שלוש רמות visibility ל-org secrets:
- All repositories — כולם יכולים לגשת. שימוש: API keys שכל הפרויקטים צריכים.
- Private repositories — רק ריפוזיטורים פרטיים. מונע חשיפה דרך public repos.
- Selected repositories — רשימה ספציפית. הכי מאובטח — least privilege.
צרו ארגון חדש בתוכנית Free. שם מומלץ לתרגול: your-username-lab. אחרי היצירה, כנסו ל-Settings → Member privileges ושנו:
- Base permissions → Read
- Repository creation → Disabled
אחר כך כנסו ל-Settings → Code security and analysis והפעילו את כל אפשרויות האבטחה.
9.3 תפקידים והרשאות — Least Privilege בפעולה
ניהול הרשאות ב-GitHub Organization עובד בשלוש שכבות: תפקיד ברמת הארגון (org role), הרשאה ברמת הריפוזיטורי (repo role), והרשאות ברמת צוות (team permission). ההבנה של שלוש השכבות האלה היא המפתח לניהול נכון.
תפקידים ברמת הארגון
| תפקיד | מה יכול | למי לתת |
|---|---|---|
| Owner | הכל — ניהול חברים, צוותות, billing, הגדרות, מחיקת ארגון. גישת admin לכל ריפוזיטורי. | 1-3 אנשים מהימנים בלבד. אף פעם לא כולם. |
| Member | צפייה בריפוזיטורים (לפי base permission), חברות בצוותות, יצירת ריפו (אם מותר). | כל מפתח בצוות. |
| Billing Manager | צפייה ועדכון של billing בלבד — אין גישה לקוד או הגדרות. | מנהל כספים או operations. |
| Outside Collaborator | גישה לריפוזיטורים ספציפיים בלבד — לא חבר ארגון, לא רואה צוותות, לא רואה members. | קבלן חיצוני, freelancer, שותף. |
הרשאות ברמת ריפוזיטורי
כל ריפוזיטורי תומך ב-5 רמות הרשאה. כשאתם מוסיפים צוות לריפו, אתם בוחרים אחת מהרמות:
| רמה | יכולות | דוגמה מתאימה |
|---|---|---|
| Read | צפייה בקוד, clone, פתיחת issues | צוות QA שצופה בקוד אבל לא משנה |
| Triage | Read + ניהול issues ו-PRs (assign, label, close) | מנהל מוצר שמנהל issues |
| Write | Triage + push לbranches, merge PRs | מפתח שעובד על הקוד |
| Maintain | Write + ניהול settings (ללא destructive actions) | tech lead שמנהל את הריפו |
| Admin | הכל — כולל מחיקת ריפו, הגדרת branch protection, webhooks | Owner של הפרויקט |
הכלל: Start Narrow, Expand Later
עיקרון ה-Least Privilege אומר: תנו את ההרשאה המינימלית שמספיקה לבצע את העבודה. תמיד אפשר להוסיף הרשאות — קשה מאוד להוריד אותן בלי לשבור משהו.
בפועל זה אומר:
- מפתח חדש מקבל Write על הריפוזיטורים שהוא עובד עליהם — לא Admin
- Tech lead מקבל Maintain — יכול לנהל settings בלי יכולת למחוק את הריפו
- מנהל מוצר מקבל Triage — יכול לנהל issues ו-PRs בלי push לקוד
- QA מקבל Read — יכול לצפות בקוד ולפתוח issues, אבל לא לשנות
- Admin רק לריפוזיטורים קריטיים, ורק ל-owners בפועל
אם מישהו מבקש "אני צריך Admin" — שאלו: "מה ספציפית אתה צריך לעשות?" ברוב המקרים, Write או Maintain מספיק. Admin נחוץ רק ל-webhook configuration, branch protection changes, ומחיקת ריפו — דברים שאדם ממוצע לא צריך לעשות יומיומית.
כשצוות קטן, המפתה הוא לתת Owner לכולם "כדי שלא יהיו בעיות הרשאה". זה רעיון מסוכן. Owner יכול למחוק את כל הארגון, להסיר חברים, לשנות billing, ולגשת לכל secret. גם בצוות של 3 אנשים — Owner אחד, כל השאר Members עם הרשאות Write על הריפוזיטורים הרלוונטיים.
Custom Repository Roles — Enterprise בלבד
ב-Enterprise, אפשר ליצור Custom Repository Roles — תפקידים מותאמים שמשלבים הרשאות ספציפיות מעבר ל-5 הרמות הסטנדרטיות. למשל:
- "Security Reviewer" — Read + manage security advisories + view secret scanning results. יכול לראות בעיות אבטחה בלי Write על הקוד.
- "Release Manager" — Write + manage releases + manage GitHub Pages. יכול לפרסם releases בלי Admin.
- "CI Manager" — Write + manage Actions + manage webhooks. יכול לנהל CI/CD בלי גישה ל-settings של הריפו.
יצירת custom role: Organization → Settings → Roles → Create a role. בוחרים base role (Read/Triage/Write/Maintain) ומוסיפים הרשאות ספציפיות. אחרי היצירה, ניתן לתת את התפקיד לצוותות על ריפוזיטורים ספציפיים.
אם אתם לא ב-Enterprise — לא צריך את זה ברוב המקרים. 5 הרמות הסטנדרטיות מכסות 95% מהתרחישים. Custom roles הם "נחמד שיש" לארגונים גדולים עם דרישות מדויקות.
הזמנת חברים — Best Practices
כשמזמינים חבר חדש לארגון, יש כמה דברים שכדאי לעשות:
- הזמינו כ-Member, לא כ-Owner. תמיד. גם אם זה ה-CTO. Owner רק למי שמנהל את הארגון בפועל.
- הוסיפו לצוות מייד. Member בלי צוות = Member בלי הרשאות (אם base permission הוא Read). ודאו שהאדם מצטרף לצוות הנכון ברגע שהוא מתקבל.
- דרשו 2FA. ב-Organization → Settings → Authentication security, הפעילו "Require two-factor authentication". כל חבר שלא מגדיר 2FA תוך שבועיים — מוסר אוטומטית.
- ליצרו onboarding checklist. קובץ
ONBOARDING.mdשמסביר: אילו צוותות יש, איך לבקש גישה, מה מותר ומה אסור.
כנסו לארגון שיצרתם → People. בדקו: האם כל החברים הם Owners? אם כן, שנו את כולם ל-Member חוץ מעצמכם. אם אתם בארגון קיים — בדקו כמה Owners יש ותשאלו: האם כולם באמת צריכים Owner? אחר כך — כנסו ל-Settings → Authentication security ובדקו אם 2FA מופעל.
9.4 צוותות — מבנה היררכי שעובד
צוותות (Teams) הם הלב של ניהול הרשאות בארגון. במקום לתת הרשאות לכל אדם בנפרד על כל ריפוזיטורי, אתם יוצרים צוות, מוסיפים אנשים, ונותנים לצוות גישה לריפוזיטורים. כשאדם חדש מצטרף — מוסיפים אותו לצוות, והוא מקבל את כל ההרשאות אוטומטית.
למה צוותות ולא הרשאות ישירות?
דמיינו ארגון עם 20 מפתחים ו-15 ריפוזיטורים. בלי צוותות, צריך לנהל 20 x 15 = 300 הרשאות אישיות. עם 4 צוותות, צריך לנהל 4 x 15 = 60 הרשאות צוותיות + 20 חברויות. כשמישהו עוזב, במקום לעבור על 15 ריפוזיטורים ולהסיר — מסירים מהצוות ומסיימים.
יצירת צוות
- בדף הארגון, לחצו על טאב Teams
- לחצו New team
- בחרו שם — מומלץ:
frontend,backend,devops,design - הוסיפו תיאור — "צוות הפרונטאנד — React, Next.js, CSS"
- בחרו Visibility: Visible (כולם רואים) או Secret (רק חברי הצוות)
- אם רלוונטי — בחרו Parent team ליצירת nested team
Nested Teams — צוותות מקוננים
GitHub תומך ב-nested teams — צוות בתוך צוות. צוות ילד יורש את כל ההרשאות של צוות ההורה, ואפשר להוסיף לו הרשאות נוספות. זה שימושי במבנים ארגוניים גדולים:
בדוגמה הזו, @org/engineering הוא צוות ההורה. כל מי שב-@org/frontend מקבל גם את ההרשאות של @org/engineering. אם engineering יקבל Read על ריפוזיטורי docs — כל חברי frontend, backend ו-devops יקבלו את ההרשאה הזו אוטומטית.
Team Maintainers
כל צוות יכול שיהיו לו maintainers — חברים שיכולים להוסיף ולהסיר חברים מהצוות, לשנות שם ותיאור, ולנהל את הצוות בלי להיות Owner של הארגון. זה מאפשר דלגציה: ה-tech lead של הפרונטאנד מנהל את צוות frontend בלי צורך בגישת admin לכל הארגון.
ניהול צוותות דרך gh CLI
אם למדתם פרק 2 (GitHub CLI), הנה פקודות שימושיות לניהול צוותות מהטרמינל:
# רשימת צוותות בארגון
gh api /orgs/YOUR-ORG/teams --jq '.[] | "\(.slug): \(.members_count) members"'
# יצירת צוות חדש
gh api /orgs/YOUR-ORG/teams --method POST \
-f name="mobile" \
-f description="צוות מובייל — iOS ו-Android" \
-f privacy="closed"
# הוספת חבר לצוות
gh api /orgs/YOUR-ORG/teams/frontend/memberships/USERNAME --method PUT \
-f role="member"
# מתן הרשאה לצוות על ריפו
gh api /orgs/YOUR-ORG/teams/frontend/repos/YOUR-ORG/REPO --method PUT \
-f permission="push"
Team Discussions ו-Mentions
צוותות ב-GitHub הם לא רק מנגנון הרשאות — הם גם ערוץ תקשורת. כל צוות תומך ב:
- @mentions — כתבו
@org/frontendב-issue, PR או comment — כל חברי הצוות יקבלו notification. זה הרבה יותר יעיל מלתייג כל אדם בנפרד. - Team Discussions — כל צוות יכול לנהל דיונים פנימיים. שימושי ל-RFCs, החלטות ארכיטקטוניות, או עדכונים שנוגעים רק לצוות.
- Review requests — כשמבקשים review מ-
@org/frontend, GitHub יכול לחלק את הבקשה בין חברי הצוות לפי load balancing (CODEOWNERS with round-robin).
טיפ מעשי: בכל PR שנוגע בקוד של צוות אחר — תייגו את הצוות, לא אדם ספציפי. אם @sarah בחופשה — ה-PR תקוע. אם @org/backend — מישהו אחר מהצוות ישים לב.
בארגון שיצרתם, צרו שני צוותות:
- צוות
engineering— visibility: Visible, בלי parent - צוות
frontend— visibility: Visible, parent:engineering
עכשיו צרו ריפוזיטורי חדש בארגון (Settings → Repositories → New), ותנו לצוות frontend הרשאת Write עליו. בדקו: האם חברי engineering רואים את הריפו?
9.5 CODEOWNERS — מי אחראי על מה
CODEOWNERS הוא קובץ שמגדיר מי חייב לאשר שינויים בקבצים מסוימים. כשנפתח PR שמשנה קובץ שיש לו CODEOWNER — GitHub מוסיף אוטומטית את ה-owner כ-reviewer, ואם branch protection מחייב CODEOWNER approval — ה-PR לא יכול להתמזג בלי האישור שלהם.
זה המנגנון הכי חשוב שיש ל-code quality בצוותות גדולים. בלי CODEOWNERS, כל אחד עם Write יכול לשנות כל קובץ. עם CODEOWNERS, שינוי ב-infrastructure code חייב לעבור דרך צוות DevOps, ושינוי ב-API חייב לעבור דרך צוות Backend.
יצירת קובץ CODEOWNERS
הקובץ חייב להיקרא CODEOWNERS (באותיות גדולות) ולשבת באחד מהמיקומים:
CODEOWNERS— בשורש הריפוזיטורי.github/CODEOWNERS— בתיקיית .github (מומלץ — מסודר יותר)docs/CODEOWNERS— בתיקיית docs
הסינטקס פשוט — כל שורה מכילה pattern ואחריו owners:
# CODEOWNERS — הגדרת בעלות על קוד
# כל שורה: pattern owner1 owner2 ...
# ברירת מחדל — כל קובץ שלא מוגדר אחרת
* @org/engineering
# Frontend — כל מה שב-src/components ו-src/pages
/src/components/ @org/frontend
/src/pages/ @org/frontend
*.css @org/frontend @user-design-lead
*.scss @org/frontend
# Backend — כל מה שב-api/
/api/ @org/backend
/database/ @org/backend @user-dba
# DevOps — תשתית ו-CI
/.github/workflows/ @org/devops
/infrastructure/ @org/devops
Dockerfile @org/devops
docker-compose.yml @org/devops
# Security — קבצים רגישים
/security/ @org/security-team
.env.example @org/security-team @org/devops
# Documentation
/docs/ @org/engineering
README.md @org/engineering
כללים חשובים
- השורה האחרונה שמתאימה מנצחת. אם שתי שורות מתאימות לקובץ — השורה האחרונה קובעת. סדרו מכללי לספציפי.
- Owners יכולים להיות:
@username,@org/team-name, אוemail@example.com - Patterns עובדים כמו gitignore:
*= הכל,*.js= כל קובצי JS,/src/= תיקייה ספציפית - CODEOWNERS לא עובד בלי branch protection. הקובץ מגדיר מי, branch protection מגדיר שחייב.
CODEOWNERS + Branch Protection — השילוב שעובד
CODEOWNERS לבד לא אוכף כלום. הוא רק מציע reviewers. כדי שה-approval יהיה חובה, צריך גם branch protection או ruleset שמגדיר "Require review from Code Owners". הנה איך שני המנגנונים עובדים ביחד:
- מפתח פותח PR שמשנה קובץ ב-
/api/ - CODEOWNERS מזהה שהבעלים של
/api/הוא@org/backend - GitHub מוסיף אוטומטית את
@org/backendכ-reviewer - Branch protection/ruleset דורש שלפחות חבר אחד מ-
@org/backendיאשר - עד שהאישור מגיע — ה-PR מסומן כ-"Review required" ולא ניתן ל-merge
בלי branch protection, ה-PR יכול להתמזג גם בלי אישור — CODEOWNERS רק מציע. תמיד שלבו את שני המנגנונים ביחד.
פתרון בעיות נפוצות ב-CODEOWNERS
כמה מצבים שכולם נתקלים בהם ואיך לפתור:
- "Invalid CODEOWNERS file" — בדרך כלל שם צוות שגוי. ודאו שהצוות קיים ושאתם כותבים
@org/team-nameולא@team-name. - PR תקוע כי CODEOWNER לא זמין — פתרון: הגדירו צוות כ-owner, לא אדם ספציפי. אם הצוות מכיל 3 אנשים — תמיד מישהו יהיה זמין.
- שני patterns מתנגשים — זכרו: השורה האחרונה שמתאימה מנצחת. סדרו מכללי (למעלה) לספציפי (למטה).
- CODEOWNER review לא נדרש — ודאו שב-branch protection/ruleset מסומן "Require review from Code Owners".
ארגונים רבים מקימים צוותות, נותנים הרשאות, ושוכחים CODEOWNERS. התוצאה: PR על infrastructure code מתמזג אחרי שמפתח frontend עשה approve — כי הוא היה זמין. CODEOWNERS מבטיח שהאדם הנכון רואה את ה-PR, לא רק מישהו.
מטרה: ליצור קובץ CODEOWNERS שמחלק בעלות על חלקים שונים של הקוד.
דרישות: ריפוזיטורי בארגון שלכם עם לפחות 2 תיקיות.
שלב 1: צרו מבנה תיקיות פשוט (אם אין לכם):
mkdir -p src/frontend src/backend docs .github/workflows
touch src/frontend/app.js src/backend/server.js docs/README.md
touch .github/workflows/ci.yml
שלב 2: צרו קובץ .github/CODEOWNERS:
# Default — כל מה שלא מוגדר אחרת
* @your-org/engineering
# Frontend code
/src/frontend/ @your-org/frontend
# Backend code
/src/backend/ @your-org/backend
# CI/CD workflows
/.github/workflows/ @your-org/devops
# Documentation
/docs/ @your-org/engineering
שלב 3: דחפו את השינויים. פתחו PR שמשנה קובץ ב-src/frontend/ ובדקו — האם GitHub הוסיף את @your-org/frontend כ-reviewer?
תוצאה צפויה: ה-PR יראה "Review required" עם שם הצוות שמוגדר כ-CODEOWNER. אם הגדרתם גם branch protection שדורש CODEOWNER approval — ה-PR לא יתמזג בלי אישור של הצוות.
9.6 Repository Rulesets — הדור החדש של Branch Protection
Repository Rulesets הם המנגנון המרכזי של GitHub לאכיפת מדיניות על branches ו-tags. הם הגרסה החדשה והמשופרת של Branch Protection Rules — יותר גמישים, ניתנים לניהול ברמת הארגון, ותומכים ב-bypass lists מדויקים.
Branch Protection vs Rulesets — מה ההבדל?
| קריטריון | Branch Protection (ישן) | Rulesets (חדש) |
|---|---|---|
| רמת הגדרה | ריפו בלבד | ריפו או ארגון — ruleset אחד לכל הארגון |
| מטרות | Branches בלבד | Branches + Tags |
| Bypass | Admin תמיד יכול לעקוף | Bypass list מדויק — אפשר לקבוע מי יכול לעקוף ומי לא |
| Stacking | כלל אחד per branch pattern | מספר rulesets יחולו — הכי מחמיר מנצח |
| Status | Active / Disabled | Active / Evaluate / Disabled — evaluate מדווח בלי לאכוף |
| API | REST API מוגבל | REST + GraphQL מלאים |
| Import/Export | אין | JSON import/export — ניתן לשכפל בין ריפוזיטורים |
ההמלצה: אם אתם מתחילים מאפס — השתמשו ב-Rulesets. אם יש לכם branch protection קיים — אין צורך לעבור מייד, אבל כדאי לתכנן מעבר.
| מצב | ההמלצה | למה |
|---|---|---|
| ריפו חדש | Rulesets | אין legacy, קל להתחיל נכון |
| ארגון חדש | Rulesets ברמת ארגון | ruleset אחד שחל על כל הריפוזיטורים |
| ריפו קיים עם branch protection שעובד | אל תשנו עכשיו | Branch protection עדיין נתמך. העבירו כשיש סיבה. |
| צוות Enterprise | Rulesets ברמת ארגון | Bypass lists, evaluate mode, JSON export |
| צריך להגן על tags | Rulesets | Branch protection לא תומך ב-tag protection |
יצירת Ruleset
כנסו ל-Repository → Settings → Rules → Rulesets → New ruleset:
- Ruleset name: שם מתאר — למשל "main-branch-protection"
- Enforcement status:
- Active — אוכף מייד
- Evaluate — מדווח ב-insights בלי לאכוף (מצוין לבדיקה לפני הפעלה)
- Disabled — כבוי
- Bypass list: מי יכול לעקוף את ה-ruleset — היו מינימליסטים. אפשר: roles, teams, apps.
- Target branches: על איזה branches הכלל חל —
main,release/*, או Default branch
Rules שכדאי להפעיל
| Rule | מה עושה | מומלץ? |
|---|---|---|
| Require pull request | חייב PR לפני merge — אין push ישיר ל-branch | כן, תמיד על main |
| Required approvals | מספר approvals מינימלי (1-6) | כן — לפחות 1 |
| Dismiss stale reviews | ביטול approval אם נדחפו שינויים חדשים | כן — מונע "approve then change" |
| Require review from CODEOWNERS | חייב אישור מ-CODEOWNER של הקבצים שהשתנו | כן — מפעיל את CODEOWNERS |
| Require status checks | CI חייב לעבור (ירוק) לפני merge | כן — בחרו את ה-workflow שלכם |
| Require signed commits | כל commit חייב להיות חתום (GPG/SSH) | תלוי — טוב ל-security, אבל דורש הגדרה מכל מפתח |
| Block force push | מניעת force push שמשכתב היסטוריה | כן, תמיד על main |
| Block deletion | מניעת מחיקה של branch | כן על main, לא בהכרח על feature branches |
| Require linear history | מאלץ squash merge או rebase — אין merge commits | אופציונלי — עניין של העדפה |
בריפוזיטורי שלכם, כנסו ל-Settings → Rules → Rulesets. בדקו: האם יש rulesets קיימים? האם יש branch protection rules ישנים (Settings → Branches)? רשמו לעצמכם מה מוגדר ומה חסר.
מטרה: ליצור ruleset שאוכף code review ו-CI על branch ה-main.
דרישות: ריפוזיטורי בארגון שלכם.
שלב 1: כנסו ל-Settings → Rules → Rulesets → New ruleset → New branch ruleset
שלב 2: הגדירו:
- Name:
protect-main - Enforcement: Active
- Bypass list: ריק (גם Owners צריכים PR)
- Target branches: Default branch
שלב 3: הפעילו rules:
- ☑ Restrict deletions
- ☑ Require a pull request before merging — 1 approval
- ☑ Dismiss stale reviews on new pushes
- ☑ Require review from Code Owners
- ☑ Block force pushes
שלב 4: שמרו את ה-ruleset. עכשיו נסו לעשות push ישירות ל-main:
echo "test" >> test.txt
git add test.txt
git commit -m "test direct push"
git push origin main
תוצאה צפויה: ה-push יידחה עם הודעה remote: error: GH006: Protected branch update failed. זה בדיוק מה שרצינו — עכשיו חייב PR.
Org-level Rulesets — כלל אחד לכל הארגון
אחד היתרונות הגדולים של rulesets הוא היכולת להגדיר אותם ברמת הארגון. במקום להגדיר ruleset בכל ריפוזיטורי בנפרד, אפשר ליצור ruleset אחד שחל על כל הריפוזיטורים (או על בחירה ספציפית).
כדי ליצור org-level ruleset: Organization → Settings → Rules → New ruleset. בשדה Repository targeting, בחרו:
- All repositories — הכלל חל על כל ריפו בארגון
- Dynamic list by name — pattern כמו
production-*— רק ריפוזיטורים שמתאימים - Dynamic list by property — לפי custom properties (Enterprise)
- Select repositories — רשימה ספציפית
דוגמה מעשית: ארגון עם 30 ריפוזיטורים רוצה שכל branch של main יהיה מוגן — חייב PR, חייב review, אסור force push. במקום 30 rulesets — ruleset אחד ברמת הארגון שחל על כולם. מפתח חדש יוצר ריפו? ה-ruleset חל אוטומטית.
Evaluate Mode — בדיקה לפני אכיפה
אחד הפיצ'רים החכמים ב-rulesets הוא Evaluate mode. כשמגדירים ruleset ב-evaluate, הוא מדווח אילו פעולות היו נחסמות — בלי באמת לחסום. זה מאפשר לכם:
- ליצור ruleset חדש ב-Evaluate
- לחכות שבוע ולבדוק ב-insights כמה פעולות היו נחסמות
- אם מעט מדי — אולי ה-ruleset רפוי מדי
- אם יותר מדי — אולי ה-ruleset מחמיר מדי ויפריע לצוות
- כשמרוצים — העבירו ל-Active
גישה ל-insights: Repository → Settings → Rules → Rulesets → Rule Insights. מציג כמה pushes נחסמו (או היו נחסמים) על ידי כל ruleset.
Tag Protection עם Rulesets
Rulesets יכולים להגן גם על tags — לא רק branches. זה חשוב כי tags בדרך כלל מייצגים releases: v1.0.0, v2.3.1. אם מישהו מוחק או משנה tag — זה יכול לשבור deploy pipelines, package versions ו-changelogs.
ליצירת tag ruleset: Settings → Rules → Rulesets → New ruleset → New tag ruleset. הגדרו target tag pattern (למשל v*) והפעילו "Block deletion" ו-"Block force push".
ייצוא וייבוא Rulesets
Rulesets תומכים ב-JSON export/import. זה שימושי כשרוצים ליצור ruleset זהה ב-repositories או ארגונים שונים:
# ייצוא ruleset ל-JSON
gh api /repos/ORG/REPO/rulesets/RULESET_ID --jq '.' > ruleset.json
# ייבוא לריפו אחר (אחרי עריכה)
gh api /repos/ORG/OTHER-REPO/rulesets --method POST \
--input ruleset.json
Branch protection עדיין עובד ונתמך, אבל הוא מוגבל: ברמת ריפו בלבד, Admin תמיד יכול לעקוף, ואין תמיכה ב-tags. אם אתם מקימים ארגון חדש — התחילו ישר עם rulesets. הם יותר גמישים, יותר מאובטחים (bypass list מדויק), וניתנים לניהול מרכזי ברמת הארגון.
Ruleset Stacking — מה קורה כשיש כמה rulesets?
אחד הפיצ'רים החזקים של rulesets הוא stacking — אפשר שמספר rulesets יחולו על אותו branch. כשזה קורה, הכלל הכי מחמיר מנצח:
- Ruleset A דורש 1 reviewer
- Ruleset B דורש 2 reviewers
- התוצאה: 2 reviewers נדרשים
זה שימושי כשיש org-level ruleset בסיסי (מינימום 1 reviewer) ועל ריפוזיטורים קריטיים מוסיפים repo-level ruleset מחמיר יותר (2 reviewers + signed commits). שני ה-rulesets חלים ביחד — לא צריך לשכפל הגדרות.
חשוב: Stacking עובד רק עם rulesets, לא עם branch protection rules. זו עוד סיבה לעבור ל-rulesets.
אם יצרתם ruleset בתרגיל — כנסו ל-Settings → Rules → Rule insights. בדקו: האם ה-ruleset שלכם חסם push ישיר? כמה פעמים? אם עדיין אין נתונים — נסו לדחוף ישירות ל-main ובדקו שוב.
9.7 Audit Log — מי עשה מה ומתי
Audit log הוא יומן שמתעד כל פעולה ניהולית בארגון. כל פעם שמישהו מוסיף חבר, משנה הגדרה, מוחק ריפו, מפעיל deploy key, או מתקין GitHub App — זה נרשם ב-audit log. זה הכלי שמאפשר לכם לענות על השאלה "מי עשה את זה?" בלי לשאול אנשים.
גישה ל-Audit Log
Organization → Settings → Audit log (דורש Owner permission)
ב-Free plan תקבלו 90 יום של היסטוריה. ב-Enterprise — עד 180 יום (וניתן להגדיר streaming חיצוני ל-S3, Splunk, Datadog ועוד).
סוגי אירועים חשובים
| קטגוריה | אירועים לדוגמה | למה חשוב |
|---|---|---|
| org | member_added, member_removed, role_changed | מעקב אחרי שינויים בהרכב הצוות |
| repo | create, destroy, visibility_change, transfer | זיהוי מחיקות או חשיפת ריפוזיטורים |
| team | add_member, remove_member, add_repository | מעקב אחרי שינויי הרשאות |
| protected_branch | create, destroy, policy_override | זיהוי עקיפת מדיניות |
| hook | create, destroy, config_changed | webhooks חדשים שעלולים לשלוח מידע החוצה |
| integration_installation | create, destroy, repos_added | GitHub Apps חדשות שהותקנו |
חיפוש ב-Audit Log
Audit log תומך בחיפוש מובנה. הנה queries שימושיים:
# מי שינה visibility של ריפוזיטורי?
action:repo.access
# איזה ריפוזיטורים נמחקו בחודש האחרון?
action:repo.destroy
# מי הוסיף GitHub App חדשה?
action:integration_installation.create
# מה עשה משתמש ספציפי?
actor:username
# כל הפעולות על ריפו ספציפי
repo:org-name/repo-name
בארגון שלכם, כנסו ל-Settings → Audit log. חפשו action:org — האם אתם רואים את הפעולות שעשיתם (יצירת ארגון, הוספת צוותות, שינוי הגדרות)? אם כן — אתם מבינים מה audit log עושה. אם לא — ייתכן שצריך כמה דקות עד שהאירועים מופיעים.
מה לא מופיע ב-Audit Log
חשוב לדעת גם מה לא מתועד:
- Git operations רגילות — push, pull, clone לא מופיעים (חוץ מ-Enterprise עם Git events מופעל)
- קריאת קוד — צפייה בקובץ דרך הדפדפן לא מתועדת
- Actions runs — הרצות workflows לא מופיעות ב-audit log (יש לוגים נפרדים ב-Actions)
- Code review comments — תגובות על PRs לא מתועדות ב-audit log (הן חלק מה-PR עצמו)
Audit log מתמקד בפעולות ניהוליות — שינויים בהגדרות, בהרשאות, בחברויות ובמדיניות. לניטור של פעילות git (מי דחף מה ומתי), צריך כלים אחרים או Enterprise עם Git events.
Audit Log API
לארגונים שצריכים ניטור אוטומטי, ניתן לגשת ל-audit log דרך ה-API:
# שליפת audit log דרך gh cli
gh api /orgs/YOUR-ORG/audit-log \
--method GET \
-f phrase='action:repo.destroy' \
--jq '.[] | "\(.created_at) \(.actor) \(.action) \(._document_id)"'
ב-Enterprise, ניתן גם להגדיר Audit log streaming — שליחה אוטומטית של כל האירועים לשירות חיצוני: Amazon S3, Azure Blob Storage, Google Cloud Storage, Splunk, או Datadog. זה מאפשר שמירה ארוכת טווח, התראות אוטומטיות ודשבורדים.
תרחישים שבהם Audit Log מציל
הנה מצבים אמיתיים שבהם audit log הוא ההבדל בין "בלש" ל-"ניחוש":
- "מי שינה את ה-visibility של הריפו שלנו ל-public?" — חפשו
action:repo.access. תראו בדיוק מי, מתי, ומאיזו IP. - "למה ה-CI נשבר פתאום?" — חפשו
action:protected_branch— אולי מישהו שינה branch protection rules. - "מי התקין את ה-GitHub App הזו?" — חפשו
action:integration_installation.create. חשוב במיוחד כי GitHub Apps מקבלות הרשאות רחבות. - "האם מישהו ניגש לריפוזיטורים רגישים?" — חפשו
action:repo.cloneעםactor:suspicious-username.
נסו חיפוש מתקדם ב-audit log. חפשו action:team — האם אתם רואים את יצירת הצוותות שעשיתם בסעיף 9.4? אם לא — חכו כמה דקות (אירועים יכולים לקחת עד 5 דקות להופיע). רשמו: מה מתועד, מה לא, ומה הייתם רוצים לנטר באופן שוטף.
9.8 SSO, SAML ו-SCIM — אימות ארגוני
SSO (Single Sign-On) מאפשר לחברי הארגון להתחבר ל-GitHub דרך ספק הזהות הארגוני — Okta, Azure AD, OneLogin או אחר. במקום שכל מפתח ינהל סיסמה נפרדת ל-GitHub, הוא מתחבר פעם אחת דרך הספק הארגוני ומקבל גישה לכל השירותים, כולל GitHub.
חשוב: SSO/SAML דורש תוכנית Enterprise. הוא לא זמין ב-Free או Team. אם אתם בארגון קטן עם Free/Team — קראו את הסעיף הזה כדי להבין מה Enterprise מציע, אבל אל תנסו ליישם.
שלושה מושגים שצריך להכיר
| מושג | מה זה | דוגמה |
|---|---|---|
| SSO | כניסה אחת לכל השירותים | מתחברים ל-Okta → מקבלים גישה ל-GitHub, Slack, Jira |
| SAML | הפרוטוקול שמחבר את GitHub לספק הזהות | GitHub (Service Provider) → SAML → Okta (Identity Provider) |
| SCIM | סנכרון אוטומטי של משתמשים | עובד חדש נוסף ב-Okta → SCIM → נוצר אוטומטית ב-GitHub. עובד עוזב → מוסר אוטומטית. |
למה SSO חשוב?
- אבטחה: מפתח שעוזב את החברה — מוסר אוטומטית מ-GitHub (דרך SCIM). בלי SSO, צריך לזכור להסיר ידנית.
- Compliance: רגולציות רבות (SOC 2, ISO 27001, GDPR) דורשות ריכוז אימות. SSO מספק את זה.
- חוויית משתמש: כניסה אחת — לא צריך לזכור סיסמה נוספת ל-GitHub.
- MFA מרוכז: ה-MFA מנוהל בספק הזהות, לא בכל שירות בנפרד.
| מצב | ההמלצה | למה |
|---|---|---|
| סטארטאפ 2-10 אנשים | לא צריך | MFA אישי מספיק, אין צורך ב-Enterprise |
| חברה 10-50 אנשים | שווה לשקול | אם כבר יש Okta/Azure AD — קל לחבר |
| ארגון 50+ אנשים | כן, חובה | Compliance, offboarding אוטומטי, ריכוז שליטה |
| דרישות רגולטוריות (SOC 2, ISO) | כן, חובה | האודיטור ידרוש SSO — אין מנוס |
SCIM — סנכרון אוטומטי של משתמשים
SCIM (System for Cross-domain Identity Management) הוא השכבה שמעל SAML. בזמן ש-SAML מטפל באימות (מי אתה), SCIM מטפל בprovisioning (ניהול החשבונות):
- Provisioning: עובד חדש נוסף ב-Okta → SCIM יוצר אוטומטית חשבון GitHub → מוסיף לצוותות הנכונים
- De-provisioning: עובד עוזב → מוסר מ-Okta → SCIM מסיר מ-GitHub → הגישה נחסמת מייד
- Group sync: קבוצות ב-Okta ממופות לצוותות ב-GitHub. שינוי קבוצה ב-Okta → שינוי צוות ב-GitHub
בלי SCIM, כשעובד עוזב צריך לזכור להסיר אותו ידנית מ-GitHub. בארגון של 100 אנשים, עם 10 עזיבות בשנה — זה 10 הזדמנויות לשכוח ולהשאיר גישה פתוחה. SCIM מבטל את הסיכון הזה לגמרי.
ספקי זהות נתמכים
GitHub תומך רשמית ב-SAML SSO עם הספקים הבאים:
| ספק | SAML | SCIM | הערות |
|---|---|---|---|
| Entra ID (Azure AD) | ☑ | ☑ | אינטגרציה מלאה, הכי נפוץ בחברות שמשתמשות ב-Microsoft |
| Okta | ☑ | ☑ | אינטגרציה מלאה, פופולרי בסטארטאפים |
| OneLogin | ☑ | ☑ | אינטגרציה מלאה |
| PingOne | ☑ | ☑ | אינטגרציה מלאה |
| אחרים (SAML 2.0) | ☑ | ☐ | כל ספק SAML 2.0 עובד — אבל SCIM דורש תמיכה ספציפית |
בדקו: האם הארגון שלכם (אם יש לכם ארגון בעבודה) משתמש ב-SSO? כנסו ל-Organization → Settings → Authentication security. אם אתם רואים "SAML single sign-on" — SSO מוגדר. אם לא — האם הארגון צריך SSO לפי טבלת ההחלטה למעלה? רשמו לעצמכם: "הארגון שלי צריך/לא צריך SSO כי ___".
9.9 Billing ועלויות — Free, Team ו-Enterprise
GitHub מציע שלוש תוכניות לארגונים. הבחירה משפיעה על כל מה שלמדנו בפרק: הרשאות, rulesets, audit log, SSO, ו-CODEOWNERS enforcement. הנה ההשוואה המעשית:
| פיצ'ר | Free | Team ($4/user/mo) | Enterprise ($21/user/mo) |
|---|---|---|---|
| Public repos | Unlimited | Unlimited | Unlimited |
| Private repos | Unlimited | Unlimited | Unlimited |
| Collaborators | Unlimited | Unlimited | Unlimited |
| CODEOWNERS | ☑ | ☑ | ☑ |
| Branch protection / Rulesets | Public repos only | ☑ All repos | ☑ All repos + org-level |
| Required reviewers | Public repos only | ☑ All repos | ☑ All repos |
| Draft PRs | ☐ | ☑ | ☑ |
| CODEOWNERS enforcement | Public repos only | ☑ | ☑ |
| Audit log | 90 days | 90 days | 180 days + streaming |
| SSO/SAML | ☐ | ☐ | ☑ |
| SCIM | ☐ | ☐ | ☑ |
| Custom roles | ☐ | ☐ | ☑ |
| Internal repos | ☐ | ☐ | ☑ |
| Actions minutes (private) | 2,000/mo | 3,000/mo | 50,000/mo |
| Packages storage | 500 MB | 2 GB | 50 GB |
הנקודות הקריטיות
- Branch protection/rulesets על private repos — זה מה שמכריח את רוב הצוותות לשדרג ל-Team. אם יש לכם ריפוזיטורים פרטיים וצריכים code review מחייב — אתם צריכים Team.
- SSO — זמין רק ב-Enterprise. אם הארגון דורש SSO — אין ברירה.
- Custom roles — ב-Free ו-Team יש רק 5 רמות הרשאה (Read-Admin). ב-Enterprise אפשר ליצור תפקידים מותאמים.
- Internal repos — visibility שקיים רק ב-Enterprise. Internal repo נגיש לכל חברי הארגון אבל לא לציבור. שימושי לספריות משותפות.
חישוב עלות מעשי
בואו נחשב עלות חודשית לתרחישים שונים:
תרחיש 1: סטארטאפ, 5 מפתחים, private repos, צריך code review מחייב.
- Free לא מספיק — branch protection על private repos דורש Team
- עלות: 5 x $4 = $20/חודש
- פלוס: 3,000 Actions minutes (במקום 2,000) ו-2GB Packages (במקום 500MB)
תרחיש 2: חברה, 30 מפתחים, צריכים SSO + audit streaming.
- Team לא מספיק — SSO דורש Enterprise
- עלות: 30 x $21 = $630/חודש
- פלוס: 50,000 Actions minutes, SCIM, custom roles, internal repos
תרחיש 3: פרויקט open source, 50 תורמים, public repos בלבד.
- Free מספיק — branch protection עובד על public repos, Actions unlimited על public repos
- עלות: $0
| מצב | התוכנית | למה |
|---|---|---|
| פרויקט אישי / open source | Free | כל מה שצריך — branch protection עובד על public repos |
| צוות 2-20 עם private repos שצריך code review מחייב | Team | Branch protection/rulesets על private repos. $4/user — שווה את זה. |
| חברה שדורשת SSO, compliance, audit streaming | Enterprise | SSO, SCIM, custom roles, internal repos. $21/user — אין ברירה אם צריך compliance. |
| לא בטוח | Free → Team | התחילו ב-Free. שדרגו ל-Team רק כשאתם באמת צריכים branch protection על private repos. |
כנסו ל-Organization → Settings → Billing and plans. בדקו: איזו תוכנית? כמה חברים? מה העלות? אם אתם ב-Free — רשמו לעצמכם: "מה חסר לי ומתי אצטרך Team?"
9.10 מיגרציה — מחשבון אישי לארגון
רוב המפתחים מתחילים עם ריפוזיטורים על החשבון האישי שלהם. בשלב מסוים, הפרויקט גדל ומגיע הרגע שצריך להעביר ריפוזיטורים לארגון. זה תהליך פשוט מבחינה טכנית, אבל יש כמה דברים שחשוב לדעת לפני שמתחילים.
מה קורה ב-Transfer?
כשמעבירים ריפוזיטורי מחשבון אישי לארגון:
- URL משתנה:
github.com/username/repo→github.com/org-name/repo. GitHub מגדיר redirect אוטומטי מה-URL הישן, אבל ה-redirect הזה לא עובד לכל מקום (API calls, webhook URLs, links בתוך CI). - Git remotes נשברים: כל מי שעשה clone צריך לעדכן את ה-remote:
git remote set-url origin NEW_URL - Issues ו-PRs: נשמרים כולם, כולל labels, milestones ו-assignees.
- Stars ו-Watchers: נשמרים.
- GitHub Pages: הדומיין משתנה ל-
org-name.github.io/repo. אם יש custom domain — צריך לעדכן. - Actions secrets: לא מועברים — צריך להגדיר מחדש בארגון.
- Webhooks: נשמרים, אבל בדקו שה-URLs עדיין נכונים.
- Branch protection: נשמר.
- Collaborators: הופכים ל-outside collaborators. צריך להוסיף אותם לצוותות.
צ'קליסט לפני מיגרציה
לפני שמעבירים ריפוזיטורי — עברו על הרשימה הזו ותעדו הכל:
| פריט | איפה לבדוק | מה לתעד |
|---|---|---|
| Secrets | Settings → Secrets and variables → Actions | רשימת שמות (לא ערכים!) כדי לדעת מה צריך להגדיר מחדש |
| Webhooks | Settings → Webhooks | URLs, events, secrets — בדקו שה-URLs עדיין יהיו נכונים |
| Branch protection | Settings → Branches | כללים קיימים — הם נשמרים, אבל כדאי לבדוק |
| Deploy keys | Settings → Deploy keys | מפתחות — נשמרים, אבל בדקו שהם עדיין רלוונטיים |
| GitHub Pages | Settings → Pages | הדומיין ישתנה — צריך לעדכן custom domain אם יש |
| GitHub Actions workflows | .github/workflows/ | בדקו שאין hardcoded refs ל-username הישן |
תהליך ההעברה
- לפני: ודאו שיש לכם Owner permission בארגון היעד
- לפני: תעדו את כל ה-secrets, webhooks ו-CI settings של הריפו (טבלה למעלה)
- לפני: הודיעו לכל חברי הצוות שה-URL ישתנה
- כנסו ל-Repository → Settings → General → גללו לתחתית → Transfer repository
- הקלידו את שם הארגון היעד
- אשרו את ההעברה (GitHub יבקש הקלדת שם הריפו לאישור)
- אחרי: הגדירו secrets מחדש — שימו לב שאם כבר יש org-level secrets, הריפו יכול לגשת אליהם
- אחרי: עדכנו remotes אצל כל חברי הצוות:
git remote set-url origin NEW_URL - אחרי: הוסיפו צוותות עם ההרשאות הנכונות
- אחרי: בדקו ש-CI עובד — ה-workflow הראשון אחרי transfer הוא הבדיקה הטובה ביותר
זמן ההעברה: מיידי. ברגע שאתם מאשרים — הריפו עובר. אבל redirect מה-URL הישן יכול לקחת כמה דקות להתעדכן.
העברה של מספר ריפוזיטורים — Batch Transfer
אם צריך להעביר 5, 10, או 20 ריפוזיטורים — אפשר לעשות את זה דרך ה-API במקום ידנית:
# רשימת כל הריפוזיטורים שלכם
gh repo list --limit 100 --json name,owner \
--jq '.[] | select(.owner.login == "YOUR-USERNAME") | .name'
# העברה דרך API (לכל ריפו בנפרד)
gh api /repos/YOUR-USERNAME/REPO-NAME/transfer \
--method POST \
-f new_owner="YOUR-ORG"
# בדיקה שההעברה הצליחה
gh repo view YOUR-ORG/REPO-NAME --json url --jq '.url'
שימו לב: גם דרך API, secrets לא מועברים. אחרי transfer של מספר ריפוזיטורים, עברו על כולם וודאו ש-CI עובד.
מתי לא להעביר
לא כל ריפו צריך להיות בארגון. ריפוזיטורים אישיים — dotfiles, ניסויים, side projects — עדיף שיישארו על החשבון האישי. הכלל: אם ריפו הוא חלק מהעבודה של הצוות → ארגון. אם הוא פרויקט אישי שלכם → חשבון אישי. אם אתם לא בטוחים — שאלו: "אם אני עוזב מחר, האם מישהו אחר צריך גישה לריפו הזה?" אם כן → ארגון.
בדקו: האם יש לכם ריפוזיטורים על החשבון האישי שצריכים להיות בארגון? רשמו רשימה. אל תעבירו עדיין — קודם ודאו שתיעדתם secrets, webhooks ו-CI. אם אין לכם ריפוזיטורים להעביר — צרו ריפו חדש על החשבון האישי ותעבירו אותו לארגון התרגול כתרגול.
מטרה: להעביר ריפוזיטורי מהחשבון האישי לארגון, ולהגדיר צוות והרשאות.
דרישות: ריפוזיטורי על החשבון האישי + ארגון שלכם.
שלב 1: צרו ריפוזיטורי בדיקה על החשבון האישי:
gh repo create migration-test --public --clone
cd migration-test
echo "# Migration Test" > README.md
git add . && git commit -m "Initial" && git push
שלב 2: העבירו לארגון:
- Repository → Settings → General → Transfer repository
- New owner:
your-org-name - הקלידו את שם הריפו לאישור
שלב 3: אחרי ההעברה, עדכנו remote:
git remote set-url origin https://github.com/your-org/migration-test.git
git remote -v # ודאו שה-URL חדש
שלב 4: הוסיפו את צוות engineering עם הרשאת Write:
- Repository → Settings → Collaborators and teams → Add teams →
engineering→ Write
תוצאה צפויה: הריפו נמצא תחת github.com/your-org/migration-test, צוות engineering יכול לכתוב אליו, וה-URL הישן מפנה אוטומטית ל-URL החדש.
Actions secrets לא מועברים בתהליך transfer. אם הריפוזיטורי שלכם משתמש ב-CI/CD עם secrets (API keys, deploy tokens) — הם ייעלמו. ה-workflow ייכשל בלי הודעת שגיאה ברורה — הוא פשוט יקבל ערך ריק ב-secret. תמיד תעדו secrets לפני העברה והגדירו אותם מחדש אחרי.
9.11 סיכום ומבט קדימה
- Organization הוא חשבון משותף שמאגד ריפוזיטורים, צוותות ומשתמשים — הכרחי ברגע שיש יותר מ-2 אנשים שעובדים ביחד.
- Base permission צריכה להיות Read (או None) — כל הרשאה נוספת ניתנת דרך צוותות בלבד.
- תפקידים: Owner (1-3 אנשים בלבד), Member (כל המפתחים), Billing Manager (כספים), Outside Collaborator (חיצוניים).
- צוותות (Teams) הם הדרך הנכונה לנהל הרשאות — לא הרשאות אישיות. Nested teams מאפשרים היררכיה עם ירושת הרשאות.
- CODEOWNERS מגדיר מי חייב לאשר שינויים בקבצים ספציפיים — מבטיח שהאנשים הנכונים עושים code review.
- Repository Rulesets הם הדור החדש של branch protection — תומכים ב-tags, org-level, bypass lists מדויקים ו-evaluate mode.
- Audit log מתעד כל פעולה ניהולית. חיוני ל-compliance וזיהוי בעיות.
- SSO/SAML/SCIM מחברים את GitHub לספק הזהות הארגוני — דרש Enterprise, אבל חיוני בארגונים של 50+ אנשים.
- Billing: Free מספיק לרוב, Team חובה ל-branch protection על private repos, Enterprise ל-SSO ו-compliance.
- מיגרציה מחשבון אישי לארגון היא פשוטה, אבל חובה לתעד secrets לפני ולהגדיר מחדש אחרי.
צרו קובץ CODEOWNERS. מכל מה שלמדנו בפרק — ארגונים, צוותות, rulesets, SSO — הפעולה עם ההשפעה הגדולה ביותר על איכות הקוד היא קובץ CODEOWNERS. שלוש דקות של הגדרה → כל PR עובר לאדם הנכון → פחות באגים ב-production, פחות "מי אישר את זה?", יותר אחריות.
# הכלל הבסיסי שמספיק ל-80% מהמקרים:
# .github/CODEOWNERS
* @your-org/engineering
- מה ההבדל בין Base Permission לבין הרשאה שניתנת דרך צוות? (רמז: base חלה על כולם אוטומטית)
- למה כדאי להגדיר CODEOWNERS אם כבר יש branch protection שמחייב reviewers? (רמז: CODEOWNERS קובע מי, branch protection קובע שחייב)
- מה היתרון של Rulesets על Branch Protection? (רמז: חשבו על org-level, tags, bypass lists)
- מתי צריך SSO/SAML? (רמז: גודל ארגון, compliance, offboarding)
- מה לא מועבר כשעושים transfer של ריפוזיטורי לארגון? (רמז: secrets)
- יומית: בדקו PRs שממתינים ל-CODEOWNER approval — אל תשאירו PRs תקועים. אם אתם CODEOWNER, עדיפות לreview של שינויים בתחום שלכם.
- שבועית: בדקו audit log לפעולות חריגות — חברים חדשים, שינויי visibility, webhooks שנוספו. חפשו
action:repo.accessו-action:org.update_member. - חודשית: סקרו את רשימת החברים — האם יש אנשים שכבר לא פעילים? האם כל ה-Owners עדיין צריכים להיות Owners? בדקו outside collaborators — האם הגישה שלהם עדיין נחוצה? עדכנו CODEOWNERS אם המבנה הארגוני השתנה.
טיפ: הגדירו GitHub Action שמתריע ב-Slack/Teams כשנוסף חבר חדש לארגון או כשמישהו מקבל Owner permission. זה ניטור פסיבי שלא עולה כלום אבל תופס בעיות בזמן אמת.
- ☐ הבנתי מתי להקים ארגון ומתי חשבון אישי מספיק
- ☐ יצרתי ארגון והגדרתי base permissions נכון (Read)
- ☐ הפעלתי הגדרות אבטחה ברמת הארגון (Dependabot, secret scanning, push protection)
- ☐ מכיר/ה את 4 התפקידים: Owner, Member, Billing Manager, Outside Collaborator
- ☐ מכיר/ה את 5 רמות ההרשאה: Read, Triage, Write, Maintain, Admin
- ☐ יצרתי צוותות ונתתי הרשאות ריפו דרכם (לא הרשאות אישיות)
- ☐ הבנתי nested teams וירושת הרשאות
- ☐ יצרתי קובץ CODEOWNERS עם owners לתיקיות שונות
- ☐ יצרתי repository ruleset שאוכף code review על main
- ☐ הבנתי את ההבדל בין Branch Protection ל-Rulesets
- ☐ בדקתי את ה-audit log ומכיר/ה את סוגי האירועים
- ☐ מבין/ה מתי צריך SSO/SAML/SCIM ומה ההבדלים
- ☐ מכיר/ה את ההבדלים בין Free, Team ו-Enterprise
- ☐ העברתי ריפוזיטורי מחשבון אישי לארגון
- ☐ יודע/ת מה עלול להישבר במיגרציה (secrets, remotes, Pages URL)
טעויות נפוצות — סיכום
לפני שממשיכים, הנה חמש הטעויות הנפוצות ביותר בניהול ארגוני GitHub — וודאו שאתם לא עושים אותן:
| הטעות | למה מפתה | הפתרון |
|---|---|---|
| לתת Owner לכולם | "ככה אין בעיות הרשאה" | Owner ל-1-3 אנשים. כל השאר — Members עם צוותות |
| Base permission על Write | ברירת מחדל של חלק מהארגונים | שנו ל-Read מייד. Write רק דרך צוותות. |
| לא להגדיר CODEOWNERS | "כולנו יודעים מי אחראי על מה" | קובץ CODEOWNERS + branch protection = אכיפה |
| להשתמש ב-branch protection ישן | "כבר עובד, למה לשנות?" | Rulesets — bypass lists, tags, org-level, evaluate mode |
| להעביר ריפו בלי לתעד secrets | "הכל יעבור אוטומטית" | Secrets לא מועברים. תעדו לפני, הגדירו אחרי. |
מטרה: להתרגל חיפוש באירועים ב-audit log ולבנות query שימושי.
דרישות: ארגון שלכם עם הפעולות שעשיתם בפרק (יצירת צוותות, הוספת ריפוזיטורים, הגדרת rulesets).
שלב 1: כנסו ל-Organization → Settings → Audit log
שלב 2: חפשו את הפעולות הבאות ורשמו מה מצאתם:
action:team.create— האם אתם רואים את הצוותות שיצרתם?action:repo.create— האם אתם רואים את הריפוזיטורים שיצרתם?action:org.update_member— האם יש שינויי תפקיד?
שלב 3: דרך gh CLI, שלפו את כל האירועים האחרונים:
gh api /orgs/YOUR-ORG/audit-log \
--method GET \
-f phrase='action:team' \
--jq '.[] | "\(.created_at | split("T")[0]) | \(.actor) | \(.action)"'
תוצאה צפויה: רשימה כרונולוגית של כל הפעולות על צוותות, כולל מי עשה ומתי. זה בדיוק מה שתצטרכו כשתרצו לבדוק "מי הוסיף את הבנאדם הזה לצוות?".
מבט קדימה
בפרק הבא: נלמד את הצד השני של ניהול ארגון — קוד פתוח. איך לפתוח פרויקט לתרומה מבחוץ, איך ליצור README מקצועי, issue templates, contributing guidelines, ואיך לבנות קהילה בריאה סביב הקוד. הארגון שבנינו בפרק הזה הוא הבסיס — עכשיו נלמד לפתוח אותו לעולם.
מה שמגיע בהמשך:
- פרק 10: קוד פתוח — README profiles, issue templates, Discussions, Sponsors, רישיונות
- פרק 11: המפה המלאה — חינמי vs בתשלום, אסטרטגיית שדרוג, מיקסום free tier