פריסה אוטומטית בעת מיזוג ל-main: הגדרה וערבויות

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

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

שאלות נפוצות

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

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

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

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

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

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

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

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

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

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

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

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

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

מצבי הוצאה של שינויים: השוואה ומגבלות

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

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

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

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

הטמעה שלב אחר שלב: אאודיט, סכימה, הגדרה, בדיקה

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

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

סדר העבודות:

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

מה מועבר לידיים: קבצי הגדרות ותקנונים

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

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

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

מקרה בוחן: הוצאה לפי מיזוג בלי משמרות לילה ובלי חזרות לאחור

הצוות «סבני קונטור» החזיק את ההוצאה ידנית: ריליסים הותקנו בלילה, כי ביום חלון של חוסר זמינות היה בלתי מתקבל על הדעת. ההוצאה גזלה 40–60 דקות משלושה מהנדסים, החזרה לאחור נעשתה ביד וארכה כשתיים וחצי שעות, וכשל במעגל העבודה קרה בערך בכל הוצאה רביעית.

מה שינו

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

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

מה קיבלו

ההוצאה אורכת 10–12 דקות ומתבצעת בכל שעה ביום, משמרות לילה ותורנויות כבר אין. תדירות הכשלים ירדה למקרה אחד לעשרים הוצאות, וההתאוששות — 3–4 דקות במקום שעות, כי החזרה לאחור מתבצעת בהחזרה לארטיפקט הקודם ולא בפירוק שלב־שלב.

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

מיזוג לענף הראשי או תגית גרסה: מה לבחור

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

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

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

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

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

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

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

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

שאלות טכניות נפוצות על הגדרת ההוצאה

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

כיצד עוברות מיגרציות של בסיס הנתונים?

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

מה עם תאימות לאחור וחזרה לאחור?

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

מה אם הבדיקות לא עברו?

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

מי מקבל גישה לסודות והרשאה להוצאה?

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

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

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

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

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