יומן שינויים ב-CI/CD: הגדרת יצירה מתוך קומיטים

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

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

שאלות נפוצות

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

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

מדוע changelog generation ידני שובר את מחזור השחרור

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

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

בלי תיוג קומיטים — קידומות, הפניות למשימות, סימן «שינוי גלוי למשתמש» — אין במה להבדיל בין משמעותי לתפעולי.

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

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

מה נותנת בנייה אוטומטית של יומן השינויים

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

בודקים את התוצאה לפי מדדים מדידים:

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

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

דרכים לבניית יומן השינויים: השוואת גישות

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

ארבע אפשרויות ונקודות התורפה שלהן

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

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

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

שלבי הטמעת changelog generation בקו הבנייה

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

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

קונפיגורציות, תקנונים ותיעוד בפלט

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

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

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

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

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

מה היה לפני האוטומציה

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

מה שינו ומה קיבלו בסופו של דבר

הודעות הקומיטים הובאו לפורמט Conventional Commits, בדיקת הפורמט הוצבה בשלב קליטת השינויים, ובניית רשימת השינויים עצמה — על תג הגרסה. הקטגוריות «נוסף / שונה / תוקן» נגזרות מסוג הקומיט, ההפניות למשימות — מגוף ההודעה, והתוצאה אינה דורשת ליטוש ידני.

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

מה לעשות אם במאגר כבר יש היסטוריה כאוטית

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

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

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

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

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

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

כמה מאגרים — לאחד את היומן לאחד?

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

איך לנהל יומן בשחרורים מקבילים?

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

משימות בלי קומיטים — הן נכנסות ליומן?

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

קונפליקטים בענפים שוברים את בניית היומן?

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

הצוות כותב קומיטים כמו שהוא רגיל — צריך ללמד מחדש?

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

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

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

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

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