דלגו לתוכן

הרשאות role מול scope

rolescope
נקבע איפהProject → Manage → Membersביצירת ה-token
נקבע לפילכל project (ולכל group)לכל token
מי מחזיקuser / service accounttoken (ל-deploy token אין role)
טעות נפוצה"נשנה את ה-scope ל-Reporter" (זה role)"role גבוה יפתור" (scope חוסם)

היעילות = role וגם scope, לא "הגבוה מביניהם". דוגמאות:

rolescopepush ל-gitcloneהסבר
Developerread_repositoryנחסםעובדה-scope חוסם כתיבה
Reporterwrite_repositoryנחסםעובדה-role חוסם כתיבה
Developerwrite_repositoryעובד*עובד*ל-branch לא מוגן, או מוגן שמתיר Developer
Maintainerread_registryנחסםנחסםה-scope לא כולל git

מה כל role יכול (הרלוונטי כאן)

Section titled “מה כל role יכול (הרלוונטי כאן)”
פעולהGuestReporterDeveloperMaintainerOwner
clone / pull של repo פרטילאכןכןכןכן
משיכת image מה-registryלאכןכןכןכן
push ל-branch לא מוגןלאלאכןכןכן
push ל-main מוגן (ברירת מחדל)לאלאלאכןכן
דחיפת image ל-registryלאלאכןכןכן
הרצת pipelineלאלאכןכןכן
variables, runners, deploy tokens, protected branchesלאלאלאכןכן
ניהול ה-group ו-members שלולאלאלאלאכן

הטבלה מקורבת; פרטים שונים קלות בין גרסאות (למשל מי רשאי group variables: Maintainer או Owner). אם משהו קריטי, אמת בתיעוד ה-roles של גרסת ה-GitLab שלך.

scopeמתירסוגי tokenהערה
read_repositoryclone / fetch ב-HTTPSPAT, service account, deploy tokenקריאה בלבד
write_repositorypush (כולל קריאה)PAT, service account, project tokenלא זמין ל-deploy token
read_registrypull imagesPAT, service account, deploy token
write_registrypush imagesPAT, service account, deploy tokenב-CI לא צריך: יש CI_REGISTRY_PASSWORD
apiהכול כמו ה-userPAT, service accountהימנע: רחב מדי
GitLab UI
Project → Manage → Members → Invite members
Username or email: <USER> Select a role: Reporter | Developer | Maintainer
Access expiration date: optional → Invite
Change/remove later: same page → role dropdown / the trash icon on the member row

ב-versions ישנות התפריט הוא Project information → Members. אפשר גם להזמין ברמת ה-group (Group → Manage → Members) והגישה יורשת לכל ה-projects.

איך מוודאים: ה-user מופיע ברשימה עם ה-role הנכון, ו-git ls-remote מהזהות שלו מצליח.

GitLab UI
Project → Settings → Repository → Protected branches → Expand
Branch: main
Allowed to merge: Maintainers | Developers + Maintainers
Allowed to push and merge: No one | Maintainers | Developers + Maintainers
Allow force push: OFF
→ Protect / change an existing rule via its dropdowns
  • ברירת המחדל ל-main ב-project חדש תלויה בהגדרת ה-group/instance (לרוב: push רק ל-Maintainers). בדוק בטבלת ה-Protected branches.
  • ב-Free בוחרים role בלבד, לא user ספציפי (רשימת users מוכרים היא Premium).
  • כדי ש-CI promote (Developer) ידחוף ל-main ב-gitops: Allowed to push and merge = Developers + Maintainers. הפתרון הנגדי (להעלות את הבוט ל-Maintainer) הפוך מ-least privilege.
  • הגנה משפיעה גם על variables עם Protect (ראה variables): ה-variable זמין רק ב-branch מוגן.

אבחון: 403 / Access denied בגישה ל-repo

Section titled “אבחון: 403 / Access denied בגישה ל-repo”

סדר בדיקה לאותו 403 (הרחב: אל תישאר בקטגוריה אחת):

בדוקאיך
ה-user member ב-ה-repo הזה?Project → Manage → Members
role מספיק לפעולה (קריאה: Reporter, כתיבה: Developer)?הטבלה למעלה
ה-scope מכסה את הפעולה?scopes למעלה
ה-token לא פג / בוטל?Access tokens של הזהות
ה-token נוצר על ה-project הנכון / זהות נכונה?שם ה-token ו-owner
ה-branch מוגן ויש push מ-role נמוך?Protected branches
ה-variable ריק כי Protect ON ב-branch לא מוגן?variables
ה-URL נכון (group path, לא display name)?git remote -v

אבחון נוסף ל-Argo: בממשק Argo: Settings → Repositories, עמודת CONNECTION STATUS. מצב ה-Secret לבד (register-repository.sh --verify) בודק רק צורה, לא ש-GitLab מקבל את ה-credential. פרטים: argocd/operate. טבלת התסמינים הכללית: debugging/symptoms.