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

מה עוד רץ על המארח הזה

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

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

האם העבודה הזו בכלל זקוקה לגישה פרטית?

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

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

המצב שהעבודה הבאה יורשת

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

MomentWhat proves itWhat leaks if it is skipped
Job start: pre-flight route checkThe route table shows no tunnel from an earlier job, and the profile list is emptyA stale route sends deployment traffic into a dead tunnel
Job end: disconnect and shredThe profile is down and the temporary key file is goneThe next job inherits an open tunnel and a usable credential
Cancelled job: reboot or disposalThe host is replaced or rebooted before the next job startsA killed process leaves the tunnel up with no owner

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

עצרו את החיבור, לא את התוכנית

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

vpn-cli disconnect --profile "$PROFILE"
rm -f "$RUNNER_TEMP/client.key"

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

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

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

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

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

מאמרים קשורים