גרסאות מבוזרות

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

שמירה במטמון מרחוק

הסוג הפשוט ביותר של גרסת build מבוזרת הוא זה שממנף רק אחסון במטמון, המוצג באיור 1.

גרסת build מבוזרת באמצעות שמירה במטמון מרחוק

איור 1. build מבוזר המציג שמירה במטמון מרחוק

כל מערכת שמבצעת build, כולל תחנות עבודה למפתחים ומערכות אינטגרציה רציפה, משתפת הפניה לשירות נפוץ של מטמון מרחוק. השירות הזה עשוי להיות מערכת אחסון מקומית ומהירה, כמו Redis או שירות ענן כמו Google Cloud Storage. בכל פעם שמשתמש צריך לבנות פריט מידע שנוצר בתהליך פיתוח (Artifact), בין אם ישירות או כתלות, המערכת בודקת תחילה עם המטמון מרחוק אם הוא כבר קיים. אם כן, הוא יכול להוריד את פריט המידע שנוצר בתהליך פיתוח (Artifact) במקום לבנות אותו. אם לא, המערכת בונה את העצם ומעלה את התוצאה חזרה למטמון. כלומר, אפשר לבנות יחסי תלות ברמה נמוכה שלא משתנים בתדירות גבוהה פעם אחת, ולשתף אותם בין משתמשים, במקום לבנות אותם מחדש על ידי כל משתמש. ב-Google, מוצגים של חפצים רבים ממטמון אך לא מהתחלה. הם מפחיתים מאוד את עלויות ההפעלה של מערכת ה-build שלנו.

כדי שמערכת שמירה מרחוק תפעל, מערכת ה-build חייבת להבטיח שניתן יהיה ליצור גרסאות build לחלוטין. כלומר, לכל יעד של גרסת build, ייתכן שתהיה אפשרות לקבוע את קבוצת הקלט עבור אותו יעד, כך שאותה קבוצת קלט תניב את אותו פלט בדיוק בכל מחשב. זו הדרך היחידה להבטיח שהתוצאות של הורדת פריט מידע שנוצר בתהליך פיתוח (Artifact) יהיו זהות לתוצאות של בניית הניסוי עצמו. שימו לב, לשם כך נדרש שכל פריט מידע שנוצר בתהליך פיתוח (Artifact) במטמון ימוקם גם על היעד וגם בגיבוב של הקלט שלו. כך, מהנדסים שונים יוכלו לבצע שינויים שונים באותו יעד בו-זמנית, והמטמון המרוחק יאחסן את כל פריטי המידע שנוצרו בתהליך פיתוח (Artifact), ויציג אותם ללא התנגשות.

כמובן, כדי ליהנות מיתרון של מטמון מרחוק, ההורדה של פריט מידע שנוצר בתהליך פיתוח צריכה להיות מהירה יותר מאשר בנייתו. לא תמיד זה קורה, במיוחד אם שרת המטמון נמצא רחוק מהמחשב. הרשת ומערכת הבנייה של Google מתנהלות בקפידה כדי לאפשר שיתוף מהיר של תוצאות build.

ביצוע מרחוק

שמירה במטמון מרחוק אינה גרסת build אמיתית. אם המטמון אבד או אם אתם מבצעים שינוי ברמה נמוכה שמחייב בנייה מחדש, עדיין תצטרכו לבצע את ה-build כולו במחשב באופן מקומי. המטרה האמיתית היא לתמוך בביצוע רחוק, שבו ניתן לפרוס את העבודה בפועל על כל מספר של עובדים. איור 2 מתאר מערכת ביצוע מרחוק.

מערכת הפעלה מרחוק

איור 2. מערכת הפעלה מרחוק

כלי ה-build שפועל במחשב של כל משתמש (כאשר המשתמשים הם מהנדסים או מערכות בנייה אוטומטיות) שולח בקשות למאסטר build מרכזי. ה-build של ה-build מפצל את הבקשות לפעולות הרכיבים שלהן ומתזמן את ביצוע הפעולות האלה בתוך מאגר עובדים שניתן להתאמה. כל עובד מבצע את הפעולות שהוא ביקש לבצע עם המידע שהוזן על-ידי המשתמש וכותב את פריטי המידע שנוצרו בתהליך הפיתוח. פריטי המידע האלה שנוצרים בתהליך פיתוח משותפים בין המכונות האחרות שמבצעות פעולות שדורשות אותם עד שניתן יהיה להפיק את הפלט הסופי ולשלוח אותם למשתמש.

החלק הבעייתי ביותר בהטמעה של מערכת כזו הוא ניהול התקשורת בין העובדים, המאסטר, למחשב המקומי של המשתמש. הפועלים עשויים להיות תלויים בפריטי ביניים שנוצרו על ידי עובדים אחרים, והפלט הסופי צריך להישלח בחזרה למחשב המקומי של המשתמש. לשם כך, אנחנו מתבססים על המטמון המופץ שתואר קודם לכן על ידי בקשה של כל עובד לקבל את התוצאות שלו ולקרוא את ההתחייבויות שלו מהמטמון. המאסטר חוסם את העבודה של עובדים עד לסיומו של כל מה שהם תלויים בו. במקרה כזה הם יוכלו לקרוא את הקלט שלהם מהמטמון. המוצר הסופי גם נשמר במטמון, ומאפשר למחשב המקומי להוריד אותו. שימו לב, אנחנו צריכים גם אמצעי נפרד לייצוא השינויים המקומיים בעץ המקור של המשתמש כדי שעובדים יוכלו ליישם שינויים אלה לפני הבנייה.

כדי לפתור את הבעיה, כל החלקים של מערכות הבנייה המבוססות על חפצי אומנות מתוארים מוקדם יותר. סביבות הבנייה צריכות להתנהל במלואן כדי שהמשתתפים יוכלו "לנפח" את העובדים ללא התערבות אנושית. כל תהליכי הבנייה עצמם צריכים להיות עצמאיים, מפני שכל שלב עשוי להתבצע במחשב אחר. התפוקה חייבת להיות דטרמיניסטית לחלוטין כדי שכל עובד יוכל לסמוך על התוצאות שהוא מקבל מעובדים אחרים. ערובות כאלה קשות מאוד לספק מערכת מבוססת משימות, ולכן קשה מאוד לבנות מערכת ביצוע מרחוק.

גרסאות build מבוזרות ב-Google

משנת 2008, Google משתמשת במערכת בנייה מבוזרת שמשתמשת בשמירה במטמון ובהפעלה מרחוק, כפי שניתן לראות באיור 3.

מערכת build ברמה גבוהה

איור 3. מערכת ה-build המבוזרת של Google

המטמון המרוחק של Google נקרא ObjFS. הממשק מורכב מ קצה עורפי שמאחסן פלטי build ב-Bigtables המופצים בכל צי מכונות הייצור ודיימון FUSE בשם objfsd, העובר במחשב של כל מפתח. הדימון של FUSE מאפשר למהנדסים לעיין בפלט של ה-build כאילו היו קבצים רגילים המאוחסנים בתחנת העבודה, אך כאשר תוכן הקובץ יורד לפי דרישה, רק עבור מספר קטן של קבצים שהתבקשו ישירות על ידי המשתמש. הנתונים. הצגת תוכן של קבצים על פי דרישה מפחיתה במידה משמעותית את השימוש ברשת וגם בדיסק. בנוסף, המערכת יכולה לבנות פי שניים במהירות בהשוואה למצב שבו אחסנו את כל פלט ה-build בדיסק המקומי של המפתח.

מערכת ההפעלה המרוחקת של Google נקראת Forge. לקוח Forge ב-Blaze (המקביל הפנימי של Bazel) שנקרא המפיץ שולח בקשות לכל פעולה למשרה שפועלת במרכזי הנתונים שלנו, בשם The Scheduler. המתזמן שומר מטמון של תוצאות פעולה, ומאפשר לו להחזיר תגובה באופן מיידי אם הפעולה כבר נוצרה על ידי משתמש אחר במערכת. אם לא, התוצאה היא פעולה בתור. מאגר גדול של מטלות לביצוע קורא באופן רציף פעולות מהתור הזה, מבצע אותן ומאחסן את התוצאות ישירות ב-ObjFS Bigtables. תוצאות אלה זמינות למנהלים לביצוע פעולות עתידיות, או להורדת משתמש הקצה על ידי objfsd.

התוצאה הסופית היא מערכת שמותאמת משמעותית לתמיכה בכל הדגמים שמבוצעים ב-Google. קנה המידה של ה-build של Google הוא עצום במיוחד: Google מפעילה מיליונים של גרסאות build שמבצעים מיליוני מקרי ניסיון, ומפיקה פטה-בייטים של מבנים של מיליארדי שורות של קוד מקור מדי יום. לא רק שמערכת כזו מאפשרת למהנדסים שלנו לבנות בסיסי קוד מורכבים במהירות, היא גם מאפשרת לנו ליישם מספר עצום של כלים ומערכות אוטומטיים המסתמכים על הבנייה שלנו.