הגדרת צינור CI/CD באמצעות Jenkins: ביקורת והגירה

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

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

שאלות נפוצות

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

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

מדוע הגדרת Jenkins נתקעת בשלבים ידניים

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

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

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

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

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

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

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

זמן בנייה: מטמון תלויות ושלבים מקבילים

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

מספר פעולות ידניות וקטגוריות כשלים שנעלמו

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

השבתת שחרור ללא תלות במהנדס אחד

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

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

מצבי בנייה: השוואה בין אפשרויות ומגבלות

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

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

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

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

שלבי הגדרת Jenkins: מאודיט ועד מסירה

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

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

מה מוסרים לידיים: תצורות ונהלים

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

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

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

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

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

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

מה השתנה במספרים

  • זמן שחרור: 90–120 דקות של עבודה ידנית → 12 דקות של ריצה אוטומטית.
  • פעולות ידניות לשחרור: 14 → 2 (אישור וקבלה).
  • שיעור שחרורים עם חזרה לאחור: כל חמישי → אחד משלושים.
  • חזרה לגרסה קודמת: כ-40 דקות → פחות מחמש.
  • שחרורים בשבוע: 1–2 → 8–10 ללא גידול בעומס על הצוות.

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

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

במה שונה סוכן בנייה משלך מסוכן ענן?

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

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

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

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

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

ספקות טכניים נפוצים לפני תחילת העבודה

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

חלק מהבניות שלנו כבר מוגדרות — להתחיל מאפס?

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

אפשר לפרוס הכל על השרתים שלנו?

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

איך נשמרים סודות ועם אילו מאגרים זה עובד?

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

תעבירו את ההיסטוריה ותעבירו בלי השבתה?

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

מה נשאר אחרי המסירה?

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

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

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

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

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