SonarQube: מדוע הגדרות ברירת המחדל מפספסות פגיעויות
המנתח פרוס, דוחות ניתוח סטטי של קוד נפתחים בכל מיזוג — אך פגם קריטי מגיע לריליס ונמצא כבר בפרודקשן. הסיבה בדרך כלל אינה בכלי עצמו, אלא בכך שפרופיל החוקים וספי האיכות נשארו כפי שהגיעו מהקופסה: המנתח עובד פורמלית, אך אינו מונע שחרור פגיעות.
פרופיל ברירת המחדל מיועד לפרויקט ממוצע. הוא מכסה חוקים כלליים, אך אינו מכיר את ההקשר של הסטאק שלכם, ולכן נשארים מוחמצים פגמים אופייניים לפריימוורק: עבודה לא מאובטחת עם סשנים, שרשור ערכים בשאילתות, אלגוריתמי גיבוב חלשים לסיסמאות.
כך בדיוק מופיעות פגיעויות מוחמצות — Quality Gate נמצא במצב אזהרה, הבנייה עוברת בירוק, וההערות מצטברות בתור.
חוב הקוד גדל מהר יותר מכפי שהצוות מספיק לטפל בו. בדיקה על קוד חדש מופעלת לא עבור כל הענפים, איש אינו בוחן מחדש מודולים ישנים, ומאות הערות ללא עדיפות מתמזגות לרעש אחד — הסוקרים מפסיקים לפתוח את הדוח, והוא הופך לפורמליות.
הגדרת SonarQube עובדת נבנית מההפך: פרופיל החוקים נבנה לסטאק מסוים, Quality Gate חוסם מיזוג ולא מקשט דוח, ובנפרד מוגדרת תקופת קוד חדש כדי שמודולים ישנים לא יסוו שינויים טריים. מוסיפים חריגים לקוד מיוצר וספים לכיסוי בבדיקות.
בהמשך נפרט כיצד זה נסגר בפועל — מפריסה ופרופיל ועד לספים שתופסים פגמים לפני ריליס ואינם מאטים את הצוות.
מה משתנה לאחר הטמעת ניתוח סטטי
האפקט המדיד הראשון — רגע הגילוי. כל עוד הבדיקה מתקיימת רק בבניות לילה, הפגם צף יממה לאחר התיקון, כשההקשר כבר אבד. SonarQube בשילוב עם מערכת בקרת גרסאות מפעיל ניתוח בכל בקשת מיזוג וחוסם אותה כאשר יש הפרות חדשות — מחיר התיקון הוא שורה אחת בתיאור, ולא תחקור תקרית בפרודקשן.
זמן מעבר הבדיקה נשמר בטווח 2–4 דקות: מנותחים רק קבצים שהשתנו, ומעבר מלא על כל בסיס הקוד עובר ללוח זמנים לילי. זה מסיר את הטיעון המרכזי נגד ניתוח סטטי — "הבנייה התארכה, הצוות ממתין".
חוב הקוד מפסיק לגדול כאשר החוק מנוסח כ"אפס הפרות חדשות": ב-legacy לא נוגעים, וקוד חדש חייב לעבור נקי. מדד החוב לא יורד מיד, אך מפסיק להתרחב — ניתן כבר לתכנן אותו כמשימה נפרדת, ולא כרקע בלתי נשלט.
ממחלקות הכשלים נעלמים אלה שנתפסים פורמלית: דה-רפרנס למצביע ריק, זרמים וחיבורים שלא נסגרו, בניית שאילתה ממחרוזות, פרטי התחברות בקוד המקור. אלה לא "כל השגיאות", אלא חתך מסוים שזול יותר לא להתיר מלכתחילה.
בתוצר מופיעה תחזית לפי ריליסים: Quality Gate פועל כקריטריון פורמלי — גרסה או עוברת אותו או לא. ראש התחום מקבל לא "השתדלנו", אלא הערכת סיכון משוחזרת לפני ההפצה.
אפשרויות פריסה: סביבה עצמאית, קונטיינרים, ענן
ניתן למקם את המנתח בכמה דרכים, והבחירה כאן נקבעת לא לפי נוחות הניהול, אלא לפי שני אילוצים: היכן פיזית נשמר קוד המקור ומי אחראי לעדכונים.
פריסת המנתח במערכת סגורה מונעת העברת קוד החוצה, הרצה בקונטיינר נותנת תצורה זהה בכל הסביבות, ואילו מצב ניתוח בענן מסיר את הדאגה לתשתית אך משנה את מודל האמון בקוד.
השוואת מצבי פריסה
| אפשרות | מתי מתאימה | מגבלות |
|---|---|---|
| סביבה עצמאית על שרתים שלכם | מתחם סגור, דרישות לאחסון קוד מקור בתוך הפרימטר, עשרות פרויקטים | עדכונים, גיבויים והרחבה — באחריות הצוות שלכם |
| הרצה בקונטיינר | צריך להעלות במהירות מנתח ולחזור על תצורה אחת בסביבות שונות | מצב ובסיס ניתוח מוציאים לכרכים נפרדים, אחרת התוצאות הולכות לאיבוד בעת יצירה מחדש |
| מצב ניתוח בענן | צוותים מפוזרים, זמן הקמה קצר, אין תשתית משלכם | קוד המקור יוצא מהפרימטר — חלק מהפרויקטים לא יאשרו זאת לפי הכללים שלהם |
| היברידי: ניתוח במתחם סגור, דוחות במשותף | צריך תמונה אחידה לכל הצוותים תחת כללים נוקשים לקוד | נדרשים שני מתחמים וסנכרון פרופילים ושערי איכות |
הבחירה מצטמצמת לשאלה אחת: האם מותר שקוד המקור יצא מהפרימטר שלכם. אם לא — נשארות סביבה עצמאית או קונטיינרים בתוך המתחם, וענן נשקל רק עבור פרויקטים פתוחים. עבור צוות של עד עשרה מפתחים, הרצה בקונטיינר בדרך כלל נותנת את אותה קבוצת בדיקות כמו התקנה מלאה, אך עולה מהר יותר באופן ניכר.
הגדרת SonarQube לסטאק שלכם: סדר העבודות
הגדרת SonarQube מתחילה לא בהתקנת שרת, אלא בניתוח של האופן שבו הקוד מגיע כעת לענף הראשי ואילו בדיקות כבר קיימות שם. כך רואים היכן המנתח ייתן אפקט מידי, והיכן תחילה יהיה צורך לסדר את צינור הבנייה — אחרת לחלק מהפרויקטים פשוט לא יהיה מה לנתח. להלן המסלול שבו אנו הולכים בהטמעה.
- ביקורת צינור הבנייה. מנתחים מערכות בנייה, מודל ענפים, מחזור ריליס והרשאות גישה למאגרים. בתוצר — רשימת פרויקטים שמחברים ראשונים, וצווארי בקבוק שמפריעים לניתוח.
- סכמת פריסה. קובעים מיקום שרת הניתוח, בסיס הנתונים ומאגר הדוחות, ומתארים כיצד משימת הניתוח משתלבת בבנייה ומה המפתח רואה בממשק.
- הגדרת פרופיל חוקים. מרכיבים פרופיל לסטאק שלכם: שפות, פריימוורקים, בדיקות קריטיות לעסק. מכבים רעש שיוצר התראות שווא ומערער את האמון בדוח.
- מאגר פיילוט. מפעילים ניתוח על פרויקט אחד בדרגת מורכבות בינונית ובוחנים את זרימת ההערות בפועל ואת זמן מעבר הבנייה. תיקונים לפרופיל מבצעים לפי המצב בשטח, ולא לפי תיעוד.
- בדיקת ספי איכות. מקבעים תנאי מעבר לענף ולריליס, בודקים התנהגות על קוד מלוכלך ונקי, בוחנים חסימת בנייה ואת בהירות הפלט.
- מסירה לתחזוקה. מוסרים לצוות תצורות, נוהל להוספת חוקים והוראות לניתוח התראות שווא. בהמשך — סקירה מתוכננת של הפרופיל ככל שהקוד גדל.
סדר כזה נותן תוצאה צפויה: עד לפריסה על כל הפרויקטים הספים כבר מכוילים, והצוות מבין מה לעשות עם כל הערה.
מה נשאר אצלכם: פרופילים, חוקים, סכמות אינטגרציה
התוצאה ההנדסית של ההטמעה — לא שרת ניתוח פועל, אלא ארטיפקטים שנשארים במאגר שלכם ועובדים בלעדינו. להלן מה בדיוק מועבר לצוות, ולפי אילו מסמכים ממשיך SonarQube לחיות בצינור שלכם.
- פרופיל חוקים — סט פעיל לסטאק שלכם, המיוצא למאגר כקובץ: נפרס במתחם חדש בפקודה אחת, ולא בהגדרה מחדש ידנית בממשק.
- תנאי סף לאיכות — נפרדים לקוד חדש ולענף ריליס: כיסוי שורות חדשות, שיעור כפילויות, היעדר הערות חוסמות.
- מדיניות חריגים — מסכות על קוד מיוצר, מיגרציות, ספריות ספק ומודולים מיושנים, כדי שהניתוח יציג בעיות בקוד שאתם באמת משנים.
- סכמת אינטגרציה עם הצינור — היכן נכנס שלב הניתוח, מה נשמר במטמון בין בניות, כיצד הערות מגיעות לבקשת המיזוג ומה בדיוק חוסם מיזוג.
- נוהל טיפול בהערות — מי מטפל בזרימה, תוך איזה פרק זמן נסגרת הערה חוסמת, ומתי מותר לדכא אותה עם תגית חובה ומועד לסקירה מחודשת.
- דיווח על איכות — ייצוא מדדים לפי ריליסים: צפיפות פגמים, כיסוי, דינמיקת חוב טכני, בלי איסוף ידני של מספרים.
- תיעוד תפעולי — סכמת מתחמים, תפקידים והרשאות, נוהל עדכון חוקים ונוהל השבתת ניתוח אם הוא מעכב את הבנייה.
מקרה בוחן: הסרנו מחלקת פגמים וצמצמנו חוב קוד
לפני ההטמעה: דוח שעקפו אותו
ניתוח SonarQube הופעל ידנית, לרוב על ענף הריליס, ו-Quality Gate עמד על ספי ברירת מחדל. הספים האלה היו חסרי תועלת: החוק או ששתק והחמיץ הכול, או שחסם בנייה בגלל עיצוב וכללי סגנון שנויים במחלוקת — תוך חודשיים הצוות התרגל לעקוף את הבדיקה.
צפיפות הפגמים עמדה על 1.2 לאלף שורות של קוד חדש, טיפול בהערות ארך עד 40 דקות לשינוי, וחוב הקוד הוסיף 5-7% לרבעון: הדוח גדל, אבל איש לא טיפל בו לפי עדיפות.
מה נבנה מחדש
הרכבנו פרופיל חוקים לסטאק שלנו — הסרנו בדיקות רועשות, השארנו חוסמות בתחומי אבטחה ואמינות, והפעלנו ניתוח רק על שורות חדשות בשינוי, כדי שהדוח לא ישקע בקוד מורשת. קישרנו את Quality Gate לקוד חדש: כיסוי הלוגיקה החדשה בבדיקות, אפס ממצאים חוסמים, הגבלה על כפילויות.
הבדיקה הפכה לשלב חובה בצינור לפני מיזוג, וההערות נכנסו אוטומטית למעקב עם עדיפות וזמן תגובה לפי רמת הקריטיות.
מדדים אחרי
- צפיפות פגמים לאלף שורות: 1.2 → 0.4
- זמן טיפול בהערות לשינוי: 40 → 12 דקות
- שיעור חסימות בנייה: 32% → 4%, וכמעט כולן — בגלל ממצאים קריטיים, לא בגלל סגנון
- חוב קוד: הגידול נעצר, ובשני רבעונים ההיקף הצטמצם פי 2.5
האפקט המרכזי אינו במספרי הדוח, אלא בכך שפגמים קריטיים הפסיקו להגיע לענף הריליס — בתקופת התצפית לא היו החזרות לאחור מסיבות שניתוח סטטי תופס.
במה תנאי סף לאיכות שונה מבדיקת בנייה
בדיקה בבנייה עונה רק על השאלה "האם הניתוח הופעל". תפקיד השלב — לנתח קוד, לאסוף דוח ולשמור אותו לצד הבנייה. אם המנתח עצמו לא קרס, השלב נחשב מוצלח גם עם מאה הערות: הצינור ירוק, והשינוי ממשיך הלאה.
תנאי סף לאיכות — זהו החלטה על קבלה. השרת מחשב מדדים עבור שינוי מסוים ומשווה אותם לגבולות שהוגדרו: שיעור כיסוי בקוד חדש, מספר הערות חוסמות, היקף כפילויות, פגיעויות קריטיות. הגבולות לא מולאו — הסטטוס "לא עבר", ומערכת בקרת הגרסאות לא מאפשרת לבצע מיזוג.
פרט מעשי שקובע אם הסף יתפוס: לחשב אותו לפי קוד חדש, ולא לפי כל בסיס הקוד. בקוד מורשת תנאי על כל הקבצים לעולם לא יהיה ירוק, והצוות יתרגל להתעלם ממנו. עבור קוד ישן מחזיקים גבולות רכים נפרדים ומחמירים אותם ככל שסוגרים חובות.
ב-SonarQube זה מוגדר כתנאי על ענף או בקשת מיזוג, בתוספת חוק חסימה בצד מאגר הקוד: כל עוד הסטטוס אינו ירוק, כפתור המיזוג אינו פעיל. שלב הצינור מקבל קוד החזרה שאינו אפס — הבנייה נעצרת, ולא רק מסמנת את הדוח.
טעות נפוצה — להשאיר את הבדיקה "אינפורמטיבית": ממצאים יש, אבל איש לא חוסם את הענף. אז קריטריוני קבלת הקוד נשארים על מצפונו של הסוקר, והמדדים בהדרגה מדרדרים. ההבדל פשוט: בדיקה מראה מה נמצא, ותנאי סף מחליט אם השינוי ייכנס לענף הראשי.
ספקות טכניים שצוותים מגיעים איתם
לפני תחילת העבודה צוותים מעלים אותן שאלות — זה סימן תקין לתהליך בוגר. ריכזנו את אלה שעולים לרוב בעת תיאום המתודולוגיה, יחד עם תשובות המהנדסים שלנו.
יש לנו legacy גדול — הניתוח יטובע בממצאים
מפעילים ניתוח אינקרמנטלי: נבדקות רק השורות שהשתנו, ולא כל המאגר. המצב הנוכחי מתקבע כקו בסיס, והוא אינו חוסם בנייה — החוב יורד ככל שמתקנים בקבצים שנגעו בהם, בלי לעצור את הפיתוח.
האם אפשר לתאר חוקים משלנו לפי ההסכמות הפנימיות?
כן. חוקים משלנו מכסים את מה שסטים סטנדרטיים לא מכסים: איסור על עטיפות עצמאיות מעל ספריות מערכת, כותרות רישיון חובה, הגבלות על פנייה למודולים מיושנים. החוקים חיים בפרופיל ומנוהלים בגרסאות יחד עם הקוד.
כמה מתחמים — איך הם לא מפריעים זה לזה?
מפרידים פרויקטים למתחמים מבודדים: כתובות נפרדות, סטים משלהם של תנאי איכות, טוקני גישה בלתי תלויים. בניות טרום-ריליס לא דורסות דוחות של הענף הראשי, ותקלה במתחם אחד לא חוסמת את האחרים.
האם קוד בדיקות צריך ספים אחרים?
כן, ספים נפרדים הם חובה. עבור קוד בדיקות מחשבים אחרת כיסוי וכפילויות — ערכים נמוכים שם צפויים ולא צריכים לעצור את הבנייה. מגדירים תנאי איכות נפרדים כדי שתבניות לא ייצרו חסימות שווא.
נדון במשימה: ננתח את המקרה שלכם ונחזור עם תוכנית
כדי שהערכת היקף העבודה תהיה עניינית, ולא "ממוצעת בתעשייה", אנחנו צריכים נתוני פתיחה על הקוד והצינור שלכם. ככל שנתוני הפתיחה ספציפיים יותר, כך תוכנית ההטמעה מדויקת יותר ופחות עבודות מחדש בדרך: כלי לניתוח סטטי משתלב בתהליך קיים, ולא מחליף אותו.
- מבנה המאגרים: כמה פרויקטים, באילו שפות, מונומאגר או סט נפרדים;
- הצינור הנוכחי: במה נבנה, אילו שלבים כבר קיימים, היכן הבנייה נופלת לרוב;
- מה נבדק כעת: לינטרים, סקירה מחייבת, בדיקה ידנית — ומה מזה אסור לכבות;
- דרישות איכות: אילו חוקים להיחשב חוסמים ומי רשאי לעצור את הבנייה;
- הרשאות וסביבה: היכן ממוקם שירות הניתוח, כיצד הוא מתחבר למאגרים ולמערכות בנייה;
- אופן עבודה: כמה זמן הבנייה יכולה להוסיף, מה קריטי בלוחות הזמנים של השחרור;
- היסטוריית אירועים: אילו פגמים כבר הגיעו לפרודקשן ובאיזה שלב ניתן היה לתפוס אותם.
מצדנו מחדדים גבולות: היכן עוברות בניות מהימנות ולא מהימנות, כיצד להפריד הרשאות לשינוי חוקים, האם נדרש מתחם נפרד לקוד legacy כדי שלא יחסום עבודה על קוד חדש. כל זה משפיע על עומק ההגדרה ועל כמה צינורות יהיה צריך לבנות מחדש.
נחזור עם הערכת היקף העבודה, תוכנית הטמעה לפי שלבים וניתוח הצינור: אילו בדיקות מתי נכנסות, מה יהפוך לחוסם מיד, ומה מוצג בהדרגה. בסעיף נפרד — מסירת תיעוד: תצורות, חוקים, הוראות למפתחים ולתורנים.
תארו את המשימה בצורה חופשית — לפי נתוני הפתיחה האלה נרכיב הערכה ונחזור עם תוכנית עבודה.







