VPN לריצות CI: האם המנהרה שורדת את הבנייה?
מריץ CI משותף שומר על נתיבים ותהליכים בין עבודות. תכננו את מצבי ה-VPN לפני העבודה, במהלכה ואחריה, ונקו רק את החיבור שהעבודה מחזיקה.
עבודת פריסה מתחברת, מעתיקה את הארטיפקט שלה ומדווחת על הצלחה. המנהרה שהיא פתחה עשויה עדיין להיות פעילה כשהעבודה הבאה מתחילה, והנתיב שהיא שינתה שייך לכל המארח. תוצאת בנייה מתארת את הפקודה, לא את המצב שהיא השאירה מאחור. התייחסו ל-VPN כמשאב בעל תוחלת חיים, ולא כשורה אחת בתחילת שלב.
מה עוד רץ על המארח הזה
צומת Jenkins יכול להריץ כמה מריצים בו-זמנית, ועבודה שמשנה נתיבי מארח, הגדרות פותר שמות או חיבור ברמת המערכת משנה אותם עבור כולם. האם עבודה אחרת תבחין בכך תלוי במדיניות הנתיבים והסינון, לא בכלל כללי על VPN. גישה למאגר, גישה לארטיפקטים וערוץ הבקרה הם דרישות נפרדות שהמריץ עדיין זקוק להן. הוסיפו אותן לרשימת יעדי הפריסה לפני בחירת מנהרה מלאה.
אם ערוץ הבקרה אמור לחצות את המנהרה, התכנון חייב לומר זאת במכוון. גילוי זה בזמן החזרה לאחור אינו תוכנית. כתבו את שתי הרשימות: למה העבודה חייבת להגיע באופן פרטי, ולמה המריץ חייב להגיע בכל מקרה.
האם העבודה הזו בכלל זקוקה לגישה פרטית?
שאלו לפני הוספת המנהרה אם שלב הבנייה זקוק לה. סוכן פריסה פרטי יכול להביא ארטיפקט מאושר ולבצע את הפריסה, מה שמשאיר את שלב הבנייה הכללי מחוץ לרשת הפרטית. פיצול כזה זול בדרך כלל מללמד כל שלב בנייה לנתב דרך מנהרה.
בחרו את הגבול מתוך זרימת העבודה, לא מתוך הרגל. אם התשובה היא לא, שאר העמוד הזה מיותר, וזו התוצאה הטובה ביותר הזמינה.
המצב שהעבודה הבאה יורשת
תארו מה צריך להיות נכון לפני העבודה, בזמן שיש לה גישה פרטית, ואחרי שהיא מסתיימת, כולל ביטול. מצב הסיום הוא זה שלרוב נשאר מרומז, והוא זה שהעבודה הבאה יורשת. כתבו אותו לצד ה-pipeline במקום להשאיר אותו בזיכרון של מישהו.
| Moment | What proves it | What leaks if it is skipped |
|---|---|---|
| Job start: pre-flight route check | The route table shows no tunnel from an earlier job, and the profile list is empty | A stale route sends deployment traffic into a dead tunnel |
| Job end: disconnect and shred | The profile is down and the temporary key file is gone | The next job inherits an open tunnel and a usable credential |
| Cancelled job: reboot or disposal | The host is replaced or rebooted before the next job starts | A killed process leaves the tunnel up with no owner |
סוכן ייעודי או חד-פעמי מקל על אכיפת הגבולות האלה. מכולה או מרחב שמות עוזרים רק אם סידור הרשת וההרשאות שלהם באמת מבודד את השינוי.
עצרו את החיבור, לא את התוכנית
השתמשו בנתיב הסיום של ה-pipeline כדי לסגור את החיבור שהעבודה הזו פתחה ולהסיר את האישורים הזמניים שלה. אל תתאימו תהליכים לפי שם תוכנית במארח שעבודות אחרות משתמשות בו; עצרו את החיבור הספציפי במקום. שתי הפקודות למטה הן כל הניקוי, ואף אחת מהן אינה תלויה במציאת תהליך.
vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"
סיום אינו בידוד: מריץ שמת משאיר את המנהרה שפתח, ותהליך שנעצר בכוח מדלג על הבלוק לגמרי. לכן פקודת הניקוי לבדה אינה יכולה להיות כל התכנון. כך זה נכשל בפועל: עבודת פריסה מבוטלת בשלב ההעתקה, בלוק הסיום לא רץ מעולם, והעבודה הבאה על אותו מארח מתחילה עם מנהרה חיה ונתיב שמצביע על רשת שהיא אינה יכולה להגיע אליה. התקלה נראית כמו בעיית 'DNS' בבנייה הבאה, שעות אחרי שהעבודה שגרמה לה הסתיימה.
תעדו את שם הפרופיל ואת נתיב האישור בפלט העבודה. פקודת ניתוק חשופה בלי מזהה קשה לביקורת בדיעבד. שורת הלוג היא גם מה שמוכיח שהבלוק רץ כשחקירה מאוחרת שואלת על כך.
תנו לעבודה מארח שאיש אחר אינו משתמש בו
תשתית חד-פעמית מסירה את בעיית הירושה במקום לנהל אותה. סוכן חדש לכל עבודה מתחיל בלי נתיב, בלי פרופיל ובלי אישורים של אחרים, והשמדתו מנקה את מה שהעבודה השאירה. זה עולה יותר לכל בנייה, וזה המחיר הכנה של גבול שאינו תלוי בקוד ניקוי. לעבודות שנוגעות ברשתות ייצור, זו בדרך כלל האפשרות הזולה יותר ברגע שסופרים תקלות.
היכן שמריץ משותף חייב להישאר, בדקו כשל וביטול בקפידה כמו את ההעתקה המוצלחת. הבדיקה צריכה להראות מה העבודה הבאה תראה אילו זו הייתה מבוטלת באמצע הדרך. עבודה מסתיימת כשהגישה שלה והמצב הזמני שלה הסתיימו, לא כשפקודת ההעתקה מחזירה אפס.