9 בניית יכולות

ארגונים וצוותות — ניהול בקנה מידה

בפרק הזה תלמדו לנהל ארגון GitHub בצורה מקצועית: מבנה צוותות עם הרשאות מדויקות, rulesets שאוכפים מדיניות על branches ו-tags, CODEOWNERS שמבטיח שהאנשים הנכונים עוברים על כל PR, audit log שעוקב אחרי כל פעולה, וחיבור SSO ארגוני. בסוף הפרק תדעו להקים ולנהל ארגון שעובד — מ-2 מפתחים ועד 200.

מה יהיה לך בסוף הפרק הזה
מה תוכלו לעשות בסוף הפרק הזה
דרישות קדם
חוט הפרויקט

מאיפה הגענו: בפרק 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 שותפים. אבל ברגע שהצוות גדל — דברים נשברים:

Organization פותר את כל הבעיות האלה. זה חשבון משותף שמכיל ריפוזיטורים, צוותות ומשתמשים. בעלות שייכת לארגון, לא לאדם. הרשאות מנוהלות דרך צוותות, לא דרך הזמנות אישיות. וכל פעולה מתועדת ב-audit log.

בואו נבין את ההבדל הבסיסי. חשבון אישי הוא כמו דירה בשכירות — אתם גרים שם לבד ומנהלים הכל. Organization הוא כמו בניין משרדים — יש ניהול מרכזי, חדרים לצוותות שונים, ומפתחות שונים לאנשים שונים.

הנה ההשוואה הבסיסית:

קריטריוןחשבון אישיOrganization
בעלותאדם אחד — אם עוזב, הריפוזיטורים שלוהארגון — ריפוזיטורים שייכים לארגון, לא לאדם
הרשאותCollaborator per repo — אין היררכיהצוותות + roles — היררכיה מלאה
Billingאישימרכזי — חשבונית אחת לכל הארגון
Secretsrepo-level בלבדrepo + org-level — שיתוף secrets בין ריפוזיטורים
AuditאיןAudit log מלא — מי עשה מה ומתי
CODEOWNERSעובד, אבל אין צוותות לשייךCODEOWNERS + צוותות = אכיפה אוטומטית
Actions2,000 דקות/חודש (Free)2,000 (Free) / 3,000 (Team) / 50,000 (Enterprise)

הכלל הפשוט

אם אחד מהתנאים הבאים מתקיים — הגיע הזמן לארגון:

  1. יותר מ-2 אנשים עובדים על אותם ריפוזיטורים באופן קבוע
  2. צריך הפרדת הרשאות — צוותות שונים צריכים גישה שונה
  3. הפרויקט לא שייך לאדם אחד — זה מוצר של חברה, קהילה או צוות
  4. צריך billing מרכזי — חשבונית אחת לכל הצוות
  5. צריך 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: יצירת ארגון

  1. כנסו ל-github.com/account/organizations/new
  2. בחרו תוכנית — Free מספיקה כדי להתחיל ולתרגל את כל מה שנלמד
  3. בחרו שם לארגון — זה יהיה ה-namespace שלכם: github.com/your-org-name
  4. הזינו email ליצירת קשר
  5. ענו על השאלה "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 permissionsReadRead (או None)כל חבר ארגון מקבל הרשאה זו על כל ריפו. Read מאפשר צפייה בלבד — טוב. Write נותן יותר מדי.
Repository creationEnabledDisabled (או Public only)אתם רוצים שליטה על מה שנוצר. אפשר לפתוח בהמשך.
Repository forkingEnabledDisabledמניעת fork של ריפו פרטי מחוץ לארגון
Pages creationPublicPrivate (אם Team/Enterprise)מניעת חשיפת מידע דרך Pages
טעות נפוצה: להשאיר Base Permission על Write

הטעות הנפוצה ביותר בהקמת ארגון חדש היא לתת Write כ-base permission. התוצאה: כל חבר ארגון יכול לדחוף קוד לכל ריפו בארגון, כולל ריפוזיטורים שהם לא קשורים אליהם. זה בדיוק ההיפך מ-least privilege. תמיד התחילו עם Read ותנו Write רק דרך צוותות ספציפיים.

Security (Settings → Code security and analysis)

הפעילו את כל האפשרויות הבאות ברמת הארגון — הן יחולו על כל ריפוזיטורי חדש:

אם למדתם את פרק 7 (Security), אתם כבר מכירים את כל הפיצ'רים האלה. ההבדל: כאן אתם מפעילים אותם ברמת הארגון — מה שאומר שכל ריפוזיטורי חדש שנוצר מקבל את ההגדרות האלה אוטומטית, בלי שמישהו צריך לזכור להפעיל.

הגדרות Actions (Settings → Actions → General)

ברמת ארגון אפשר לשלוט מי יכול להריץ Actions:

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:

עשו עכשיו

צרו ארגון חדש בתוכנית 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). ההבנה של שלוש השכבות האלה היא המפתח לניהול נכון.

שלוש שכבות ההרשאות שכבה 1: תפקיד בארגון (Org Role) Owner | Member | Billing Manager | Outside Collaborator שכבה 2: הרשאה ברמת ריפוזיטורי (Repo Role) Read | Triage | Write | Maintain | Admin שכבה 3: הרשאה דרך צוות (Team Permission) צוות frontend → repo-ui: Write | צוות backend → repo-api: Admin קובע: מה אתה יכול לעשות בארגון עצמו קובע: מה אתה יכול לעשות בריפו ספציפי

תפקידים ברמת הארגון

תפקידמה יכוללמי לתת
Owner הכל — ניהול חברים, צוותות, billing, הגדרות, מחיקת ארגון. גישת admin לכל ריפוזיטורי. 1-3 אנשים מהימנים בלבד. אף פעם לא כולם.
Member צפייה בריפוזיטורים (לפי base permission), חברות בצוותות, יצירת ריפו (אם מותר). כל מפתח בצוות.
Billing Manager צפייה ועדכון של billing בלבד — אין גישה לקוד או הגדרות. מנהל כספים או operations.
Outside Collaborator גישה לריפוזיטורים ספציפיים בלבד — לא חבר ארגון, לא רואה צוותות, לא רואה members. קבלן חיצוני, freelancer, שותף.

הרשאות ברמת ריפוזיטורי

כל ריפוזיטורי תומך ב-5 רמות הרשאה. כשאתם מוסיפים צוות לריפו, אתם בוחרים אחת מהרמות:

רמהיכולותדוגמה מתאימה
Readצפייה בקוד, clone, פתיחת issuesצוות QA שצופה בקוד אבל לא משנה
TriageRead + ניהול issues ו-PRs (assign, label, close)מנהל מוצר שמנהל issues
WriteTriage + push לbranches, merge PRsמפתח שעובד על הקוד
MaintainWrite + ניהול settings (ללא destructive actions)tech lead שמנהל את הריפו
Adminהכל — כולל מחיקת ריפו, הגדרת branch protection, webhooksOwner של הפרויקט

הכלל: Start Narrow, Expand Later

עיקרון ה-Least Privilege אומר: תנו את ההרשאה המינימלית שמספיקה לבצע את העבודה. תמיד אפשר להוסיף הרשאות — קשה מאוד להוריד אותן בלי לשבור משהו.

בפועל זה אומר:

אם מישהו מבקש "אני צריך Admin" — שאלו: "מה ספציפית אתה צריך לעשות?" ברוב המקרים, Write או Maintain מספיק. Admin נחוץ רק ל-webhook configuration, branch protection changes, ומחיקת ריפו — דברים שאדם ממוצע לא צריך לעשות יומיומית.

טעות נפוצה: לתת Owner access לכולם

כשצוות קטן, המפתה הוא לתת Owner לכולם "כדי שלא יהיו בעיות הרשאה". זה רעיון מסוכן. Owner יכול למחוק את כל הארגון, להסיר חברים, לשנות billing, ולגשת לכל secret. גם בצוות של 3 אנשים — Owner אחד, כל השאר Members עם הרשאות Write על הריפוזיטורים הרלוונטיים.

Custom Repository Roles — Enterprise בלבד

ב-Enterprise, אפשר ליצור Custom Repository Roles — תפקידים מותאמים שמשלבים הרשאות ספציפיות מעבר ל-5 הרמות הסטנדרטיות. למשל:

יצירת custom role: Organization → Settings → Roles → Create a role. בוחרים base role (Read/Triage/Write/Maintain) ומוסיפים הרשאות ספציפיות. אחרי היצירה, ניתן לתת את התפקיד לצוותות על ריפוזיטורים ספציפיים.

אם אתם לא ב-Enterprise — לא צריך את זה ברוב המקרים. 5 הרמות הסטנדרטיות מכסות 95% מהתרחישים. Custom roles הם "נחמד שיש" לארגונים גדולים עם דרישות מדויקות.

הזמנת חברים — Best Practices

כשמזמינים חבר חדש לארגון, יש כמה דברים שכדאי לעשות:

  1. הזמינו כ-Member, לא כ-Owner. תמיד. גם אם זה ה-CTO. Owner רק למי שמנהל את הארגון בפועל.
  2. הוסיפו לצוות מייד. Member בלי צוות = Member בלי הרשאות (אם base permission הוא Read). ודאו שהאדם מצטרף לצוות הנכון ברגע שהוא מתקבל.
  3. דרשו 2FA. ב-Organization → Settings → Authentication security, הפעילו "Require two-factor authentication". כל חבר שלא מגדיר 2FA תוך שבועיים — מוסר אוטומטית.
  4. ליצרו 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 ריפוזיטורים ולהסיר — מסירים מהצוות ומסיימים.

יצירת צוות

  1. בדף הארגון, לחצו על טאב Teams
  2. לחצו New team
  3. בחרו שם — מומלץ: frontend, backend, devops, design
  4. הוסיפו תיאור — "צוות הפרונטאנד — React, Next.js, CSS"
  5. בחרו Visibility: Visible (כולם רואים) או Secret (רק חברי הצוות)
  6. אם רלוונטי — בחרו Parent team ליצירת nested team

Nested Teams — צוותות מקוננים

GitHub תומך ב-nested teams — צוות בתוך צוות. צוות ילד יורש את כל ההרשאות של צוות ההורה, ואפשר להוסיף לו הרשאות נוספות. זה שימושי במבנים ארגוניים גדולים:

Nested Teams — מבנה היררכי @org/engineering @org/frontend @org/backend @org/devops web-app: Write design-system: Admin api-server: Write infra: Admin כל צוות ילד יורש את ההרשאות של engineering + ההרשאות הספציפיות שלו

בדוגמה הזו, @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 הם לא רק מנגנון הרשאות — הם גם ערוץ תקשורת. כל צוות תומך ב:

טיפ מעשי: בכל PR שנוגע בקוד של צוות אחר — תייגו את הצוות, לא אדם ספציפי. אם @sarah בחופשה — ה-PR תקוע. אם @org/backend — מישהו אחר מהצוות ישים לב.

עשו עכשיו

בארגון שיצרתם, צרו שני צוותות:

  1. צוות engineering — visibility: Visible, בלי parent
  2. צוות 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 (באותיות גדולות) ולשבת באחד מהמיקומים:

הסינטקס פשוט — כל שורה מכילה 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

כללים חשובים

CODEOWNERS + Branch Protection — השילוב שעובד

CODEOWNERS לבד לא אוכף כלום. הוא רק מציע reviewers. כדי שה-approval יהיה חובה, צריך גם branch protection או ruleset שמגדיר "Require review from Code Owners". הנה איך שני המנגנונים עובדים ביחד:

  1. מפתח פותח PR שמשנה קובץ ב-/api/
  2. CODEOWNERS מזהה שהבעלים של /api/ הוא @org/backend
  3. GitHub מוסיף אוטומטית את @org/backend כ-reviewer
  4. Branch protection/ruleset דורש שלפחות חבר אחד מ-@org/backend יאשר
  5. עד שהאישור מגיע — ה-PR מסומן כ-"Review required" ולא ניתן ל-merge

בלי branch protection, ה-PR יכול להתמזג גם בלי אישור — CODEOWNERS רק מציע. תמיד שלבו את שני המנגנונים ביחד.

פתרון בעיות נפוצות ב-CODEOWNERS

כמה מצבים שכולם נתקלים בהם ואיך לפתור:

טעות נפוצה: לא להגדיר CODEOWNERS

ארגונים רבים מקימים צוותות, נותנים הרשאות, ושוכחים CODEOWNERS. התוצאה: PR על infrastructure code מתמזג אחרי שמפתח frontend עשה approve — כי הוא היה זמין. CODEOWNERS מבטיח שהאדם הנכון רואה את ה-PR, לא רק מישהו.

תרגיל 1: יצירת CODEOWNERS לפרויקט

מטרה: ליצור קובץ 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
BypassAdmin תמיד יכול לעקוףBypass list מדויק — אפשר לקבוע מי יכול לעקוף ומי לא
Stackingכלל אחד per branch patternמספר rulesets יחולו — הכי מחמיר מנצח
StatusActive / DisabledActive / Evaluate / Disabled — evaluate מדווח בלי לאכוף
APIREST API מוגבלREST + GraphQL מלאים
Import/ExportאיןJSON import/export — ניתן לשכפל בין ריפוזיטורים

ההמלצה: אם אתם מתחילים מאפס — השתמשו ב-Rulesets. אם יש לכם branch protection קיים — אין צורך לעבור מייד, אבל כדאי לתכנן מעבר.

מסגרת החלטה: Branch Protection או Rulesets?
מצבההמלצהלמה
ריפו חדשRulesetsאין legacy, קל להתחיל נכון
ארגון חדשRulesets ברמת ארגוןruleset אחד שחל על כל הריפוזיטורים
ריפו קיים עם branch protection שעובדאל תשנו עכשיוBranch protection עדיין נתמך. העבירו כשיש סיבה.
צוות EnterpriseRulesets ברמת ארגוןBypass lists, evaluate mode, JSON export
צריך להגן על tagsRulesetsBranch protection לא תומך ב-tag protection

יצירת Ruleset

כנסו ל-Repository → Settings → Rules → Rulesets → New ruleset:

  1. Ruleset name: שם מתאר — למשל "main-branch-protection"
  2. Enforcement status:
    • Active — אוכף מייד
    • Evaluate — מדווח ב-insights בלי לאכוף (מצוין לבדיקה לפני הפעלה)
    • Disabled — כבוי
  3. Bypass list: מי יכול לעקוף את ה-ruleset — היו מינימליסטים. אפשר: roles, teams, apps.
  4. 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 checksCI חייב לעבור (ירוק) לפני 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)? רשמו לעצמכם מה מוגדר ומה חסר.

תרגיל 2: יצירת Repository Ruleset

מטרה: ליצור 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, בחרו:

דוגמה מעשית: ארגון עם 30 ריפוזיטורים רוצה שכל branch של main יהיה מוגן — חייב PR, חייב review, אסור force push. במקום 30 rulesets — ruleset אחד ברמת הארגון שחל על כולם. מפתח חדש יוצר ריפו? ה-ruleset חל אוטומטית.

Evaluate Mode — בדיקה לפני אכיפה

אחד הפיצ'רים החכמים ב-rulesets הוא Evaluate mode. כשמגדירים ruleset ב-evaluate, הוא מדווח אילו פעולות היו נחסמות — בלי באמת לחסום. זה מאפשר לכם:

  1. ליצור ruleset חדש ב-Evaluate
  2. לחכות שבוע ולבדוק ב-insights כמה פעולות היו נחסמות
  3. אם מעט מדי — אולי ה-ruleset רפוי מדי
  4. אם יותר מדי — אולי ה-ruleset מחמיר מדי ויפריע לצוות
  5. כשמרוצים — העבירו ל-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 הישן במקום rulesets

Branch protection עדיין עובד ונתמך, אבל הוא מוגבל: ברמת ריפו בלבד, Admin תמיד יכול לעקוף, ואין תמיכה ב-tags. אם אתם מקימים ארגון חדש — התחילו ישר עם rulesets. הם יותר גמישים, יותר מאובטחים (bypass list מדויק), וניתנים לניהול מרכזי ברמת הארגון.

Ruleset Stacking — מה קורה כשיש כמה rulesets?

אחד הפיצ'רים החזקים של rulesets הוא stacking — אפשר שמספר rulesets יחולו על אותו branch. כשזה קורה, הכלל הכי מחמיר מנצח:

זה שימושי כשיש 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 ועוד).

סוגי אירועים חשובים

קטגוריהאירועים לדוגמהלמה חשוב
orgmember_added, member_removed, role_changedמעקב אחרי שינויים בהרכב הצוות
repocreate, destroy, visibility_change, transferזיהוי מחיקות או חשיפת ריפוזיטורים
teamadd_member, remove_member, add_repositoryמעקב אחרי שינויי הרשאות
protected_branchcreate, destroy, policy_overrideזיהוי עקיפת מדיניות
hookcreate, destroy, config_changedwebhooks חדשים שעלולים לשלוח מידע החוצה
integration_installationcreate, destroy, repos_addedGitHub 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

חשוב לדעת גם מה לא מתועד:

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 הוא ההבדל בין "בלש" ל-"ניחוש":

עשו עכשיו

נסו חיפוש מתקדם ב-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 / SAML / SCIM — זרימת אימות מפתח/ת רוצה לגשת ל-GitHub Identity Provider Okta / Azure AD / OneLogin GitHub Org Service Provider Login (SAML) SAML Assertion SCIM Provisioning סנכרון משתמשים אוטומטי

למה SSO חשוב?

מסגרת החלטה: מתי צריך SSO?
מצבההמלצהלמה
סטארטאפ 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 (ניהול החשבונות):

בלי SCIM, כשעובד עוזב צריך לזכור להסיר אותו ידנית מ-GitHub. בארגון של 100 אנשים, עם 10 עזיבות בשנה — זה 10 הזדמנויות לשכוח ולהשאיר גישה פתוחה. SCIM מבטל את הסיכון הזה לגמרי.

ספקי זהות נתמכים

GitHub תומך רשמית ב-SAML SSO עם הספקים הבאים:

ספקSAMLSCIMהערות
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. הנה ההשוואה המעשית:

פיצ'רFreeTeam ($4/user/mo)Enterprise ($21/user/mo)
Public reposUnlimitedUnlimitedUnlimited
Private reposUnlimitedUnlimitedUnlimited
CollaboratorsUnlimitedUnlimitedUnlimited
CODEOWNERS
Branch protection / RulesetsPublic repos only☑ All repos☑ All repos + org-level
Required reviewersPublic repos only☑ All repos☑ All repos
Draft PRs
CODEOWNERS enforcementPublic repos only
Audit log90 days90 days180 days + streaming
SSO/SAML
SCIM
Custom roles
Internal repos
Actions minutes (private)2,000/mo3,000/mo50,000/mo
Packages storage500 MB2 GB50 GB

הנקודות הקריטיות

חישוב עלות מעשי

בואו נחשב עלות חודשית לתרחישים שונים:

תרחיש 1: סטארטאפ, 5 מפתחים, private repos, צריך code review מחייב.

תרחיש 2: חברה, 30 מפתחים, צריכים SSO + audit streaming.

תרחיש 3: פרויקט open source, 50 תורמים, public repos בלבד.

מסגרת החלטה: איזו תוכנית לבחור?
מצבהתוכניתלמה
פרויקט אישי / open sourceFreeכל מה שצריך — branch protection עובד על public repos
צוות 2-20 עם private repos שצריך code review מחייבTeamBranch protection/rulesets על private repos. $4/user — שווה את זה.
חברה שדורשת SSO, compliance, audit streamingEnterpriseSSO, 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?

כשמעבירים ריפוזיטורי מחשבון אישי לארגון:

צ'קליסט לפני מיגרציה

לפני שמעבירים ריפוזיטורי — עברו על הרשימה הזו ותעדו הכל:

פריטאיפה לבדוקמה לתעד
SecretsSettings → Secrets and variables → Actionsרשימת שמות (לא ערכים!) כדי לדעת מה צריך להגדיר מחדש
WebhooksSettings → WebhooksURLs, events, secrets — בדקו שה-URLs עדיין יהיו נכונים
Branch protectionSettings → Branchesכללים קיימים — הם נשמרים, אבל כדאי לבדוק
Deploy keysSettings → Deploy keysמפתחות — נשמרים, אבל בדקו שהם עדיין רלוונטיים
GitHub PagesSettings → Pagesהדומיין ישתנה — צריך לעדכן custom domain אם יש
GitHub Actions workflows.github/workflows/בדקו שאין hardcoded refs ל-username הישן

תהליך ההעברה

  1. לפני: ודאו שיש לכם Owner permission בארגון היעד
  2. לפני: תעדו את כל ה-secrets, webhooks ו-CI settings של הריפו (טבלה למעלה)
  3. לפני: הודיעו לכל חברי הצוות שה-URL ישתנה
  4. כנסו ל-Repository → Settings → General → גללו לתחתית → Transfer repository
  5. הקלידו את שם הארגון היעד
  6. אשרו את ההעברה (GitHub יבקש הקלדת שם הריפו לאישור)
  7. אחרי: הגדירו secrets מחדש — שימו לב שאם כבר יש org-level secrets, הריפו יכול לגשת אליהם
  8. אחרי: עדכנו remotes אצל כל חברי הצוות: git remote set-url origin NEW_URL
  9. אחרי: הוסיפו צוותות עם ההרשאות הנכונות
  10. אחרי: בדקו ש-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. אם אין לכם ריפוזיטורים להעביר — צרו ריפו חדש על החשבון האישי ותעבירו אותו לארגון התרגול כתרגול.

תרגיל 3: מיגרציה מחשבון אישי לארגון

מטרה: להעביר ריפוזיטורי מהחשבון האישי לארגון, ולהגדיר צוות והרשאות.

דרישות: ריפוזיטורי על החשבון האישי + ארגון שלכם.

שלב 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 החדש.

טעות נפוצה: להעביר ריפוזיטורי בלי להגדיר secrets מחדש

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
בדקו את עצמכם
  1. מה ההבדל בין Base Permission לבין הרשאה שניתנת דרך צוות? (רמז: base חלה על כולם אוטומטית)
  2. למה כדאי להגדיר CODEOWNERS אם כבר יש branch protection שמחייב reviewers? (רמז: CODEOWNERS קובע מי, branch protection קובע שחייב)
  3. מה היתרון של Rulesets על Branch Protection? (רמז: חשבו על org-level, tags, bypass lists)
  4. מתי צריך SSO/SAML? (רמז: גודל ארגון, compliance, offboarding)
  5. מה לא מועבר כשעושים 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 לא מועברים. תעדו לפני, הגדירו אחרי.
תרגיל 4: Audit log investigation

מטרה: להתרגל חיפוש באירועים ב-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, ואיך לבנות קהילה בריאה סביב הקוד. הארגון שבנינו בפרק הזה הוא הבסיס — עכשיו נלמד לפתוח אותו לעולם.

מה שמגיע בהמשך: