חיבור מארח קוד
Control Center עובד עם שלושה מארחי קוד, המכונים forges בכל האפליקציה: GitHub, GitLab ו־Bitbucket Cloud. אף אחד מהם אינו ברירת המחדל. חברו אחד והכול עובד; חברו כמה, וסביבת עבודה אחת תוכל להחזיק בבת אחת מאגרים מכולם.
ה־forge הוא מאפיין של כל מאגר, והוא נקרא מה־remote שלו בשם origin כשאתם רושמים אותו. לעולם אינכם בוחרים אותו בעצמכם, ואין הגדרה לפי סביבת עבודה שאפשר לטעות בה.
חיבור forge
קטע בשם “חיבור forge”- פתחו את הגדרות ← סביבת עבודה ← פרופיל וזהות (
/settings/workspace/profile). - אתרו את הכרטיס אחסון קוד. כל forge נתמך מופיע בו, מחובר או לא.
- לחצו על כניסה עם … אם השורה מציעה זאת, או על הוספת אסימון גישה והדביקו אחד.
כניסה מופיעה עבור forge שלשרת שלכם רשומה עבורו אפליקציה — נכון להיום זה GitHub, באמצעות device flow (ראו יצירת GitHub App). כל השאר הוא אסימון מודבק, וזו האפשרות הגלויה והכנה ולא כפתור שאינו יכול להשלים את הפעולה.
כך או כך, פרטי הגישה הם שלכם וחיים על השרת, והם מקושרים למזהה המשתמש שלכם: שום אסימון לא נשמר במחשב שאליו הקלדתם אותו, כל מכשיר שממנו תיכנסו משתמש באותו אסימון, ואף חבר אחר לא יכול לקרוא אותו. הוא נכנס לתוקף בבקשה הבאה — אין מה להפעיל מחדש, וניתוק מפסיק את שליחתו מיד.
כל שורה אומרת לכם מאין הגיעו פרטי הגישה שלה, כי זה ההבדל בין “האסימון שלי לא עובד” לבין “אסימון אחר עונה”:
| כותרת משנה | משמעות |
|---|---|
מחובר בתור octocat |
פרטי הגישה שלכם משמשים |
מחובר בתור octocat · דרך האפליקציה של השרת הזה |
זהות האפליקציה של השרת עונה — לא ביצעתם כניסה |
מחובר בתור octocat · ממשתני הסביבה |
משתנה סביבה של השרת עונה, ולא פרטי הגישה שלכם |
לא מחובר |
אין לכם פרטי גישה ל־forge הזה |
איזה אסימון כל forge רוצה
קטע בשם “איזה אסימון כל forge רוצה”| forge | אסימון | היכן ליצור אותו |
|---|---|---|
| GitHub | Classic: repo ו־read:org. Fine-grained: Contents + Pull requests (קריאה/כתיבה), Checks + Actions (קריאה) |
github.com → Settings → Developer settings → Tokens |
| GitLab | אסימון גישה אישי עם api |
gitlab.com → User settings → Access tokens |
| Bitbucket | אסימון API של Atlassian, בתוספת כתובת האימייל של החשבון שלכם | id.atlassian.com → Security → API tokens |
Bitbucket מאמת באמצעות כתובת האימייל של החשבון כשם המשתמש ואת האסימון כסיסמה. הגדירו BITBUCKET_EMAIL בסביבת השרת כדי שהוא ידע עם איזה אימייל לשייך את האסימון.
או להשתמש במשתני הסביבה
קטע בשם “או להשתמש במשתני הסביבה”בהתקנה ללא ממשק או ב־CI, השרת קורא את אלה:
- GitHub —
GITHUB_TOKEN, ואזGH_TOKEN - GitLab —
GITLAB_TOKEN, ואזCI_JOB_TOKEN - Bitbucket —
BITBUCKET_API_TOKEN, ואזBITBUCKET_TOKEN(עםBITBUCKET_EMAIL)
אלה פרטי הגישה של השרת, לא שלכם, וההבחנה הזו קריטית: בקשה שנעשית בשמכם משתמשת בפרטי הגישה שלכם ותו לא, כך שהסביבה לעולם לא מחליפה אתכם בשקט. עבודה בלי אדם מאחוריה — webhooks, סקר בקשות משיכה, סנכרון כרטיסים — פותרת תחילה את זהות האפליקציה של השרת, אחר כך את פרטי הגישה של בעל השרת, ואז את הסביבה. הסדר קבוע, כך ש“נכנסתי ולא השתנה כלום” אינו תוצאה נתמכת.
אתם אדם אחר בכל forge
קטע בשם “אתם אדם אחר בכל forge”אותו אדם הוא octocat ב־GitHub ומשהו אחר לגמרי ב־GitLab. Control Center פותר את הזהות שלכם לפי forge ומשתמש בזהות הנכונה לכל מאגר, וזה מה שהופך את “ממתין לסקירה שלי”, “נוצרו על ידיי” ו“אישרת את זה” לנכונים בסביבת עבודה משולבת.
אם הזהות של forge לא נפתרה, המאגרים שלו לא תורמים דבר לדואר הנכנס במקום להתאים להכול. הדואר הנכנס אומר זאת במקום לטעון שאתם מעודכנים בהכול.
דואר נכנס אחד, כל forge
קטע בשם “דואר נכנס אחד, כל forge”הדואר הנכנס ותור בקשות המשיכה מתפרסים על פני כל forge המיוצג בסביבת העבודה וממזגים את התוצאות לזרם אחד — בקשת משיכה מ־GitHub ובקשת משיכה מ־Bitbucket יושבות זו לצד זו, מסודרות לפי זמן ולא מקובצות לפי ספק.
כשלים מבודדים. forge שנפל, שמוגבל בקצב או שאינו מחובר לא תורם דבר ומשאיר את האחרים ללא פגע; הוא אף פעם לא מרוקן את כל הדואר הנכנס. המאגרים שלו ממשיכים להציג את המצב הידוע האחרון שלהם עד שהוא מתאושש.
מה כל forge יכול לעשות
קטע בשם “מה כל forge יכול לעשות”כל forge תומך בלולאה המרכזית: הצגה ופתיחה של בקשות משיכה, קריאת דיפים, תגובה בתוך השורה ומחוצה לה, סקירה, מיזוג וסגירה. מעבר לכך הם שונים באמת, ו־Control Center מסתיר את מה ש־forge לא יכול לעשות במקום להציג פקד שנכשל בשקט.
| יכולת | GitHub | GitLab | Bitbucket |
|---|---|---|---|
| סקירות מרוכזות (ממתינות) | ✓ | ✓ | — |
| בקשת שינויים | ✓ | ✓ | ✓ |
| מצב “נצפה” לכל קובץ מסונכרן | ✓ | — | — |
| תגובות אמוג’י | ✓ | ✓ | — |
| סוקרים מצוות / מקבוצה | ✓ | ✓ | — |
| סוקרים מוצעים | ✓ | — | ✓ |
| תוצאות CI בבקשת משיכה | ✓ | ✓ | ✓ |
| צלילה לשלבים/לוגים של משימת CI | ✓ | ✓ | — |
| בקשות משיכה מוערמות | ✓ | — | — |
| תבניות לתיאור בקשת משיכה | ✓ | ✓ | — |
| סקר התראות | ✓ | — | — |
| פרופילים עשירים של משתמשים | ✓ | ✓ | — |
| head ref של בקשת משיכה בצד השרת | ✓ | ✓ | — |
כשהיכולת חסרה, התכונה מתדרדרת בכנות:
- מצב נצפה עדיין עובד, אבל רק במכשיר שבו הגדרתם אותו.
- סקירות מרוכזות ב־Bitbucket מתפרסמות תגובה-תגובה, כך שסוקרים רואים אותן מגיעות בנפרד ולא בבת אחת.
- אין head ref לבקשת משיכה ב־Bitbucket, ומשמעות הדבר שכשעושים checkout לבקשת משיכה מביאים את ענף המקור לפי שמו, וזה נכשל ברגע שהענף הזה נמחק.
מינוח
קטע בשם “מינוח”GitLab מכנה בקשת משיכה merge request. Control Center אומר “בקשת משיכה” בכל המודל שלו, ומשתמש בשם העצם של כל forge במקום שבו הוא מדבר על אותו forge.
פתרון תקלות
קטע בשם “פתרון תקלות”רשימת בקשות המשיכה ריקה ואומרת ש־forge לא מחובר
קטע בשם “רשימת בקשות המשיכה ריקה ואומרת ש־forge לא מחובר”אין לכם פרטי גישה ל־forge הזה. היכנסו או הדביקו אסימון תחת הגדרות ← סביבת עבודה ← פרופיל וזהות ← אחסון קוד. המאגרים של forges אחרים אינם נפגעים.
חיברתי forge אבל המאגרים שלו עדיין לא מציגים כלום
קטע בשם “חיברתי forge אבל המאגרים שלו עדיין לא מציגים כלום”בדקו את כותרת המשנה של השורה. אם כתוב בה “דרך האפליקציה של השרת הזה” או “ממשתני הסביבה”, פרטי גישה אחרים עונים ולא אלה שציפיתם להם — פרטי הגישה שלכם גוברים בכל מה שאתם מבקשים, כך שאם כתוב אחרת, שלכם לא נשמרו.
מאגר לא נרשם
קטע בשם “מאגר לא נרשם”הרישום דורש את כל השלושה: הנתיב נמצא בתוך עץ עבודה של git, יש לו remote בשם origin, וה־remote הזה מצביע ל־github.com, ל־gitlab.com או ל־bitbucket.org. ראו הוספת מאגרים לסביבת עבודה.
הכול מפסיק לעבוד לזמן מה אחרי שימוש כבד
קטע בשם “הכול מפסיק לעבוד לזמן מה אחרי שימוש כבד”זהו מפסק הזרם של מגבלת הקצב. forge שמסמן את המגבלה הראשית שלו גורם ללקוח להיכשל בבקשות נוספות באופן מקומי, בלי קריאת רשת, עד שהחלון חולף — כך שסופת ניסיונות חוזרים לא יכולה להעמיק את המגבלה. כשלים חולפים מנוסים מחדש עם השהיה מדורגת אקספוננציאלית.