Continuous integration

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

Coding Shots Annual Plan high res-5.jpg
מתכנת בעבודתו

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

Crystal Clear | Scrum | Unified Process | Extreme Programming | Continuous integration

תחומים תומכים
ניהול פרויקטים | ניהול תצורה | תיעוד | הבטחת איכות | Profiling
כלים
מהדר | מקשר | IDE | ניהול גרסאות | אוטומציית בנייה

בהנדסת תוכנה, Continuous integration, בקיצור: CI (קונטיניוס אינטגריישן; בעברית: אינטגרציה רציפה או אינטגרציה מתמשכת) היא שיטת עבודה בה כל סביבות הפיתוח עוברות מיזוג עם מוקד מרכזי משותף (repository או mainline באנגלית), כמה פעמים ביום (ראו: ניהול גרסאות). שיטת עבודה זו התגבשה לראשונה כחלק מ-Extreme Programming. המטרה הראשית של CI היא למנוע תקלות אינטגרציה, המכונות לעתים integration hell ("גיהנום האינטגרציה"; על משקל תקלת תוכנה ידועה אחרת בשם DLL hell).

במקור CI יועדה לשימוש בשילוב עם בדיקות יחידה אוטומטיות אשר נכתבות כחלק מפיתוח מונחה-בדיקות. תחילה הרעיון היה להריץ בדיקות יחידה כדי לוודא שכולן עברו בהצלחה לפני הגשת הקוד החדש למוקד המרכזי (ביצוע commit ל-repository). פיתוחים מאוחרים יותר של השיטה הכניסו שימוש בשרתי בנייה (build servers) אשר מריצים אוטומטית בדיקות יחידה מעת לעת או אפילו לאחר כל commit, ומדווחים על תוצאות הבדיקות למפתחים. השימוש בשרתי בנייה (אשר לא בהכרח מריצים בדיקות יחידה) היה בשימוש גם על ידי צוותי פיתוח שאינם עובדים בשיטת ה-extreme programming. כעת הרבה ארגונים אימצו את שיטת ה-CI מבלי לאמץ את כל יתר השיטות של XP.

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

במסגרת אותה מתודולוגיית פיתוח תוכנה נכללת גם שיטת ה-continuous delivery (אספקה רציפה), אשר מרחיבה את שיטת ה-CI בכך שהיא מוודאת שהתוכנה כפי שהיא נמצאת ב-repository, תמיד נמצאת במצב שניתן לפרוס אותה אצל משתמשים, ובכך הופכת את תהליך פריסת התוכנה למהיר ביותר.

תאוריה[עריכת קוד מקור | עריכה]

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

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

בסופו של דבר ה-repository יכול להפוך לכל כך שונה מהעותק שנמצא אצל המפתח, עד שיווצר המצב שלעתים מכונה merge hell או integration hell ("גיהנום המיזוג" או "גיהנום האינטגרציה"), בו הזמן הנדרש לצורך ביצוע אינטגרציה עולה על הזמן שלקח לעשות את השינויים המקוריים. במקרה הגרוע ביותר, יכול להיות שהמפתח יאלץ לזרוק את השינויים שהוא ביצע ולעשות את כל העבודה מחדש.

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

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

ראו גם[עריכת קוד מקור | עריכה]