אופטימיזציה של צינור CI/CD ב-Travis CI: מטמונים, סודות, האצה

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

היכולות שלנו:

שאלות נפוצות

העבודות האחרונות

  • פיתוח אפליקציית ווב עבור FEEDME
    פיתוח אפליקציית ווב עבור FEEDME
    1359
  • פיתוח חנות מקוונת לחברת FURNORO
    פיתוח חנות מקוונת לחברת FURNORO
    1330
  • עיצוב לוגו לחברת B2B Advance
    עיצוב לוגו לחברת B2B Advance
    776
  • פיתוח אפליקציית ווב עבור Enviok
    פיתוח אפליקציית ווב עבור Enviok
    1077
  • פיתוח לוגו חברת AIDER
    פיתוח לוגו חברת AIDER
    1022
  • פיתוח CRM עבור Chasseurs
    פיתוח CRM עבור Chasseurs
    1113

מה באמת נשבר בבניות על Travis CI

הדבר הראשון שמתחיל להאט את צינור הבנייה ב-Travis CI הוא מטמון התלויות. הוא גדל מהר יותר מהפרויקט עצמו: כלל הניקוי קשור לקובץ הנעילה, אך התיקיות שורדות החלפת ענף ותמונה, ולכן השחזור מהמטמון אורך כמעט כמו התקנה נקייה.

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

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

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

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

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

מה נותן צינור בנייה ואספקה מחודש

מטמון של תלויות וארטיפקטים בין הרצות יחד עם פיצול שלב ארוך למשימות מקבילות נותנים את הרווח העיקרי: ריצה שנמשכה 18 דקות והחזיקה תור נכנסת ל-5–6.

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

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

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

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

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

השוואה בין מצבי בנייה ב-Travis CI: ענן, סוכנים, היברידי

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

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

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

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

בפועל בוחרים את Travis CI לפי שני סימנים: האם הבנייה נכנסת למכסות הענן והאם היא זקוקה לגישה אל תוך הרשת. אם לפחות תשובה אחת שלילית — עוברים לסוכנים משלכם או להיברידי.

סדר העבודה: מביקורת הצינור ועד מסירה ללקוח

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

  1. ביקורת הצינור. אוספים רשימת משימות, זמן של כל שלב, שלבים חוזרים ותנאי הפעלה לפי ענפים — ומקבלים רשימת צווארי בקבוק עם הערכה כמה זמן כל אחד מהם גובה.
  2. תכנית הבנייה. מתכננים את הגרף הרצוי: מה רץ במקביל, אילו תוצאות נעשות בהן שימוש חוזר בין משימות, והיכן נפרדים שלבי הבדיקה והפריסה.
  3. הגדרת משימות ומטמונים. מפתחות המטמון מקשרים לקובץ התלויות כדי שיתבטל רק בשינוי אמיתי, ואת השלבים המשותפים מוציאים לבלוקים לשימוש חוזר.
  4. הפרדת סודות. משתנים מונפקים ממוקד — לפי ענפים ומשימות, ערכים מוצפנים, והגישה לפריסה מופרדת מהבדיקות.
  5. בדיקת הבנייה על ענף ניסוי. מריצים את הקונפיגורציה החדשה על עותק, משווים זמן והרכב ארטיפקטים לתוצאה הקודמת ובודקים את תרחיש החזרה לגרסה הישנה.
  6. מסירת תיעוד והדרכה. מוסרים את תכנית הצינור, פירוט מפתחות המטמון ותקנון שינויים: כיצד להוסיף משימה בלי לפגוע בשכנות.

קונפיגורציות, סודות ומדיניות גישה במאגר

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

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

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

מקרה בוחן: כיצד השתנו מדדי הבנייה לפני ואחרי העבודה מחדש

הפרויקט הוא מונורפו של כמה שירותים עם מערך בדיקות משותף לכל קומיט. לפני העבודה מחדש Travis CI ביצע משימה אחת ארוכה ורצופה: התלויות הורדו מחדש בכל הרצה, והבדיקה נמשכה 18–22 דקות. המהנדסים הפסיקו לחכות לתוצאה ושלחו שינויים «על עיוור» — הנפילה התגלתה רק לאחר המיזוג, בשלב השחרור.

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

מדד לפני אחרי
זמן בנייה לשינוי 18–22 דק' 6–8 דק'
שיעור הבניות שנפלו 24% 6%
פעולות ידניות בשחרור 7 2
סוג הכשלים שגיאות סביבה, דליפות מפתחות רק שגיאות בקוד

מה נתן ניתוח הכשלים

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

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

מה עושים אם הצינור כבר פרוס על שירות אחר?

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

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

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

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

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

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

שאלות טכניות נפוצות על בניות וסודות

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

האם סודות דולפים לבניות מענפים חיצוניים?

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

מי רואה את הגישות ואת הלוגים של הבנייה?

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

הבנייה גוררת תלויות מיושנות מהמטמון?

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

כיצד לוודא שבנייה ירוקה לא משקרת?

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

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

הערכה מדויקת נשענת על עובדות על הבנייה הנוכחית, ולא על תיאור «נבנה הרבה זמן ולפעמים נופל». מספיקים קונפיגורציה של Travis CI, לוגים של ריצה מוצלחת אחת ושל ריצה בעייתית אחת, רשימת סודות ולוחות זמנים רצויים: מה נחשב לזמן בנייה סביר ומה כבר מעכב שחרורים.

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

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

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

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