| **הנדסת תוכנה** |
| --- |
| ערך זה שייך לקטגוריית הנדסת תוכנה |
| **פעילויות** ו**שלבים** |
| דרישות • ניתוח • אפיון • ארכיטקטורה • עיצוב • תכנות • דיבוג • בדיקה • אימות • בנייה • פריסה • תפעול • תחזוקה |
| **מתודולוגיות** |
| זריזות • מפל המים • תכנת ותקן • Crystal Clear • Scrum • Unified Process • Extreme Programming • אינטגרציה רציפה • DevOps |
| **תחומים תומכים** |
| ניהול פרויקטים • ניהול תצורה • תיעוד • הבטחת איכות • Profiling |
| **כלים** |
| מהדר • מקשר • מפרש • IDE • ניהול גרסאות • אוטומציית בנייה |

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

* הידור קוד מקור לקוד בינארי
* אריזה של קוד בינארי לחבילות תוכנה
* הרצת בדיקות תוכנה
* פריסת תוכנה לסביבות ייצור (production)
* יצירת תיעוד (דוקומנטציה) ומסמכי הפצה (release notes)

יתרונות
-------

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

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

סוגים
-----

* **אוטומציה על פי דרישה (on-demand)**: לדוגמה, משתמש המריץ סקריפט משורת הפקודה.
* **אוטומציה מתוזמנת (scheduled)**: לדוגמה, שרת continuous integration שמריץ בניות ליליות (nightly build).
* **אוטומציה המופעלת על ידי אירועים (triggered)**: לדוגמה, שרת continuous integration שמבצע בנייה עם כל commit למערכת ניהול גרסאות.

היסטוריה
--------

היסטורית, מתכנתים השתמשו באוטומציה לבניית תוכנה כדי לקרוא למהדרים ולמקשרים (linkers) מתוך סקריפט במקום לעשות זאת משורת הפקודה. זה לא קשה להשתמש בממשק שורת הפקודה כדי להעביר מודוּל אחד של קוד מקור אל המהדר ואז אל המקשר על מנת לקבל את התוצר הסופי. אולם הניסיון להדר ולקשור הרבה מודולים של קוד מקור, לפי סדר מסוים, הוא אינו פתרון מעשי על ידי שימוש בממשק שורת הפקודה. שפת הסקריפטים Make הציעה אלטרנטיבה טובה יותר. היא אפשרה לכתוב סקריפט בנייה שקורא לפי הסדר לשלבי ההידור והקישור כדי לבנות את היישום. גרסת ה-GNU Make הציעה גם אפשרויות נוספות כדוגמת makedepend שאפשרה גם ניהול מסוים של תלויות בקוד המקור (dependency management) ובנייה אינקרמנטלית. זאת הייתה ההתחלה של אוטומציית בנייה והיא התמקדה באוטומציה של הקריאות למהדרים ולינקרים. ככל שתהליך הבנייה הפך מורכב יותר, מפתחים החלו להוסיף פעולות לפני ואחרי הקריאות למהדר, כגון הוצאה של קוד מקור ממערכת ניהול גרסאות (check-out) והעתקה של האובייקטים המוכנים לפריסה לסביבת הבדיקות. כיום המושג "אוטומציית בנייה" כולל את הניהול של פעולות ההידור והקישור עצמן, כמו גם הפעולות שבאות לפני ואחרי פעולות אלה.

כלים מזן חדש
------------

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

אוטומציית בנייה מתקדמת
----------------------

אוטומציית בנייה מתקדמת מאפשרת לבצע בנייה ו/או עיבוד עיבוד מבוזר באמצעות סוכן (agent) מרוחק. משמעות המושג "בניות מבוזרות" (distributed builds) היא שהקריאות למהדר ולמקשר יכולות להשלח למספר מקומות שונים על מנת לשפר את מהירות הבנייה. לעיתים קרובות מבלבלים מושג זה עם המושג "עיבוד מבוזר" (distributed processing).

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

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

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

לא כל הכלים לאוטומציית בנייה יודעים לבצע בניות מבוזרות. רובם תומכים רק בעיבוד מבוזר. בנוסף, רוב המוצרים שתומכים בבנייה מבוזרת יודעים לטפל רק בקוד בשפות C ו-++C. מוצרים לאוטומציית בנייה שתומכים בעיבוד מבוזר בדרך כלל מבוססים על Make, ורובם אינם תומכים ב-Maven או Ant.

ראו גם
------

* בניית תוכנה
* Continuous integration
* Apache Ant
* ג'נקינס
* Apache Maven
* appium