מידול זרימת עבודה מורכבת עם שלבים מקבילים ותלות בין שלבים.
→השתמש ב-YAML multi-stage pipelines. השתמש במילת המפתח `dependsOn` עבור תלויות שלבים והגדר משימות מקבילות בתוך שלבים.
למה: YAML מספק את הגישה הגמישה ביותר, מבוססת קוד, עבור תזמור מורכב, עדיפה על פני Pipelines קלאסיים או שרשור Pipelines נפרדים.
יישום פריסה עם אפס זמן השבתה, בסיכון נמוך, עבור יישום אינטרנט עם יכולת חזרה מיידית לאחור.
→השתמש ב-Azure App Service deployment slots. פרוס ל-staging (ירוק) slot, אמת, ולאחר מכן בצע החלפת slot עם production (כחול).
למה: החלפת slot היא פעולה אטומית, כמעט מיידית, המנתבת מחדש תעבורה. חזרה לאחור פשוטה כמו החלפה חזרה.
מקור↗
מזעור כפילות Pipeline עבור microservices רבים החולקים שלבי בנייה/פריסה נפוצים אך דורשים התאמות אישיות ספציפיות.
→צור תבניות YAML במאגר מרכזי. בכל Pipeline ספציפי לשירות, השתמש במילת המפתח `extends` והעבר פרמטרים להתאמה אישית.
למה: `extends` מקדם עקרונות DRY ואוכף סטנדרטים תוך מתן גמישות באמצעות פרמטרים. עוצמתי יותר מקבוצות משימות עבור מבני Pipeline שלמים.
הגבלת שלב Pipeline (לדוגמה, פריסת production) לרוץ רק על מיזוגים לענף ספציפי (לדוגמה, main).
→השתמש ב-`condition` על השלב או המשימה. לדוגמה, `condition: and(succeeded(), eq(variables['Build.SourceBranch'], 'refs/heads/main'))`.
למה: בניות אימות PR משתמשות בהפניית ענף מקור שונה (לדוגמה, `refs/pull/...`), ולכן תנאי זה מונע נכון פריסה במהלך מחזור חיי ה-PR.
פריסת יישומים מ-Azure DevOps לשרתים מקומיים מאחורי חומת אש ארגונית.
→התקן סוכנים עצמאיים (self-hosted agents) על השרתים המקומיים. רשום אותם למאגר סוכנים ב-Azure DevOps.
למה: סוכנים עצמאיים יוזמים תקשורת יוצאת ל-Azure DevOps, כך שאין צורך בכללי חומת אש נכנסים. הם יכולים לגשת למשאבי רשת מקומיים לפריסה.
דרישת אישור רב-אישי לפריסות Production והגבלתן לחלונות תחזוקה ספציפיים.
→הגדר Azure DevOps Environment עבור Production. הגדר אישורים עם מאשרים נדרשים. הוסף בדיקת "שעות עבודה" כשער לאכיפת חלון הזמן.
למה: Environments מרכזים בקרות פריסה. אישורים ושערים מספקים אכיפת מדיניות חזקה ואוטומטית לפני הפעלת שלב.
שליטה בחשיפת תכונות למשתמשים ללא פריסה מחדש של היישום, עם עדכונים כמעט בזמן אמת.
→השתמש ב-Azure App Configuration לניהול תכונות. הצב כלי אינסטרומנטציה ביישום כדי לקרוא את ה-flags ולאפשר את יכולות הרענון הדינמי שלו.
למה: מפריד בין שחרור תכונות לפריסות. App Configuration מספק ממשק משתמש מרכזי ו-SDKs לעדכונים דינמיים, ובכך מונע הפעלות מחדש של יישומים.
ניהול מצב אשכול Kubernetes באופן דקלרטיבי, כאשר Git הוא מקור האמת היחיד והשינויים מיושמים אוטומטית.
→פרוס סוכן GitOps כמו Flux או ArgoCD לאשכול AKS. הגדר את הסוכן לנטר מאגר Git המכיל Kubernetes manifests ולסנכרן אוטומטית את מצב האשכול.
למה: מודל מבוסס משיכה זה מאפשר התאמה מתמדת וזיהוי סחף, שהם ליבת ה-GitOps. הוא איתן יותר מ-Pipelines מבוססי `kubectl` מבוססי דחיפה.
ניהול מצב Terraform לשיתוף פעולה בצוות, תוך הבטחת אבטחה ומניעת שינויים מקבילים.
→הגדר את ה-Terraform backend לשימוש בחשבון Azure Storage Account. זה מספק אחסון מצב מרוחק, עם נעילת מצב המטופלת באמצעות Azure Blob lease.
למה: מונע השחתת קבצי מצב מפעולות `apply` בו-זמניות ושומר נתוני מצב רגישים מחוץ לבקרת מקור.
מקור↗
ב-monorepo, הפעל Pipeline CI של יישום רק כאשר קבצים בספרייה הספציפית שלו (או בספרייה משותפת) משתנים.
→ב-YAML של ה-Pipeline, השתמש במסנן `trigger.paths.include` כדי לציין את הספריות הרלוונטיות, לדוגמה, `include: ['/apps/frontend/**', '/apps/shared/**']`.
למה: זה מונע בנייה מיותרת עבור שינויי קוד לא קשורים, וחוסך זמן CI ומשאבי מחשוב.
אופטימיזציה של שלב בדיקה עם בדיקות מהירות (יחידה) ואיטיות (אינטגרציה) למשוב מהיר יותר.
→הרץ בדיקות יחידה ובדיקות אינטגרציה במשימות מקבילות בתוך אותו שלב.
למה: ביצוע מקבילי מספק תוצאות בדיקות יחידה מהר יותר באופן משמעותי בזמן שבדיקות איטיות יותר רצות במקביל. משך השלב הכולל נקבע על ידי המשימה הארוכה ביותר, לא הסכום.
גרסא אוטומטית של חבילת ספרייה בהתבסס על היסטוריית commit כדי לתקשר בבירור את השפעת השינויים (שובר, תכונה, תיקון).
→שלב כלי כמו GitVersion ב-CI Pipeline. הוא מנתח הודעות commit, ענפים ותגים כדי לחשב אוטומטית גרסת SemVer (Major.Minor.Patch).
למה: SemVer מספק גרסאות משמעותיות שצרכנים יכולים לסמוך עליהן לניהול תלויות, בניגוד למספרי בנייה או hashes של commit.
פריסת יישום למספר אזורים גיאוגרפיים בזה אחר זה, עם אימות לאחר כל פריסה אזורית.
→השתמש ב-YAML Pipeline מרובה שלבים עם שלבים עוקבים, אחד לכל אזור, תוך שימוש ב-`dependsOn` לאכיפת סדר. השתמש בשערי Environment בין שלבים לאימות.
למה: מודל פריסה מבוסס טבעת זה מכיל את רדיוס הפיצוץ של פריסה כושלת לאזור יחיד, ומאפשר חזרה לאחור לפני פגיעה בכל המשתמשים.
הגדרת Pipeline לתמיכה במודל פיתוח מבוסס trunk, המבטיח שהענף הראשי תמיד ניתן לפריסה.
→הגדר טריגר CI בענף `main`. אכוף PRs עם מדיניות אימות בנייה המריצה בדיקות מהירות ומקיפות. שלב התראות מהירות (לדוגמה, ל-Teams/Slack) עבור שברי בנייה.
למה: משוב מיידי חיוני בפיתוח מבוסס trunk. שילוב זה מונע מיזוג קוד שבור ומבטיח תיקון מהיר בעת התרחשות בעיות.
העברת Artifacts גדולים (לדוגמה, מודלי ML, >5GB) בין שלבי Pipeline ביעילות.
→העלה את ה-Artifact הגדול ל-Azure Blob Storage בשלב היצרן. העבר את ה-URI של ה-blob לשלב הצרכן כמשתנה פלט.
למה: Azure Blob Storage חסכוני וביצועי יותר מ-Artifacts מובנים של Pipeline עבור קבצים בגודל מספר גיגה-בייט.
קיצור זמני בנייה על ידי מניעת הורדה מחדש של תלויות (לדוגמה, NuGet, npm) בכל הרצה.
→השתמש במשימת `Cache@2`. הגדר מפתח בהתבסס על קובץ נעילת החבילה (לדוגמה, `packages.lock.json`). המשימה תאחסן ותשחזר את תיקיית התלויות.
למה: יכול לחסוך מספר דקות לכל בנייה על ידי שחזור ממטמון מהיר ומקומי במקום אחזור ממאגרים חיצוניים.
בנייה או פריסה של אותו קוד מול מספר יעדים (לדוגמה, מערכות הפעלה שונות, אזורים שונים) במקביל.
→השתמש ב-`strategy: matrix` במשימת ה-YAML Pipeline. הגדר משתנים עבור כל שילוב, אשר יצור משימה עבור כל כניסת matrix.
למה: אסטרטגיית matrix שומרת על הגדרת ה-Pipeline יבשה (DRY), יוצרת וריאציות מרובות של משימות מהגדרה אחת ומריצה אותן במקביל.
יישום פריסת canary על AKS המסיטה תעבורה אוטומטית ומקדמת או מחזירה לאחור בהתבסס על מדדי זמן אמת.
→השתמש בבקר מסירה מתקדמת כמו Flagger, המשולב עם service mesh (לדוגמה, Istio) וספק מדדים (לדוגמה, Prometheus).
למה: Flagger מבצע אוטומציה של כל תהליך ניתוח ה-canary, ומספק מסירה מתקדמת בטוחה ואמינה יותר מסקריפטים ידניים.
Pipeline של יישום צריך להיות מופעל כאשר קוד משתנה במאגר שלו או במאגר ספרייה משותפת נפרד.
→ב-YAML של היישום, הגדר את הספרייה המשותפת תחת `resources.repositories` והגדר בלוק `trigger` על משאב זה.
למה: יוצר תלות דקלרטיבית בין מאגרים, ומבטיח שהיישום נבנה מחדש תמיד עם הרכיבים המשותפים העדכניים ביותר.
Pipeline צריך ליצור תשתית זמנית לבדיקה ולוודא שהיא נהרסת לאחר מכן, גם אם הבדיקות נכשלות.
→השתמש ב-Pipeline מרובה שלבים עם שלבי apply ו-destroy נפרדים עבור IaC (Terraform/Bicep). הגדר את שלב ה-destroy עם `condition: always()`
למה: התנאי `always()` מבטיח ששלב הניקוי ירוץ ללא קשר להצלחה או כישלון של שלבים קודמים, ובכך מונע משאבים יתומים.
מניעת פריסת production מלהתקדם אלא אם קיימת בקשת שינוי מאושרת בכלי ITSM כמו ServiceNow.
→הגדר שער Environment המפעיל את שער "Query ServiceNow" כדי לבדוק את סטטוס בקשת השינוי.
למה: מבצע אוטומציה של אינטגרציה עם תהליכי ניהול שינויים ארגוניים, ומבטיח תאימות ללא העברות ידניות.
אספקת מאגר של סוכני בנייה עצמאיים המתרחב באופן דינמי עם הביקוש כדי לצמצם זמני תור ולשלוט בעלויות.
→הגדר מאגר סוכנים של Azure DevOps באמצעות Azure Virtual Machine Scale Set (VMSS), המוגדר להתרחב אוטומטית בהתבסס על מספר המשימות הממתינות.
למה: סוכני VMSS משלבים את ההתאמה האישית של סוכנים עצמאיים עם הגמישות של סוכנים מבוססי ענן, ובכך מייעלים ביצועים ועלויות.
פריסת שינויים בסכמת מסד נתונים באופן המונע אובדן נתונים ותומך בחזרות לאחור.
→השתמש בכלי הגירה (לדוגמה, Flyway, DbUp). יישם את תבנית ה-expand/contract עבור שינויים בסכמה כדי לשמור על תאימות לאחור.
למה: כלי הגירה מספקים גרסאות ובקרה. תבנית ה-expand/contract מפרידה בין חזרות לאחור של יישומים ומסדי נתונים, ומאפשרת פריסות בטוחות יותר.
לסוכנים עצמאיים נגמר שטח הדיסק עקב הצטברות artifacts בנייה.
→ב-YAML של ה-Pipeline, ברמת המשימה, הגדר `workspace: clean: all`.
למה: תצורת Pipeline מונעת זו פותרת את שורש הבעיה ללא צורך בהתערבות ידנית או שינויים מתמשכים בתשתית.
בדיקות אינטגרציה דורשות מופע מסד נתונים מבודד עבור כל ריצת Pipeline.
→הגדר משאב קונטיינר (לדוגמה, SQL Server, Postgres) כשירות ב-YAML של ה-Pipeline. משימת הבדיקה יכולה אז להתחבר לשירות ארעי זה.
למה: מספק תלויות מהירות, מבודדות, ומונחות אוטומטית לבדיקות, מונע הפרעות בבדיקות ומפשט את ההתקנה.
שיפור אמינות וביצועי שחזור חבילות ממאגרים ציבוריים (לדוגמה, npmjs, nuget.org).
→ב-Azure Artifacts, צור feed והגדר upstream sources המצביעים על המאגרים הציבוריים. בקש מלקוחות לצרוך חבילות מ-feed של Azure Artifacts.
למה: ה-feed מטמון חבילות ממקורות upstream, מגן מפני השבתות של מאגרים ציבוריים ומאיץ שחזורים עבור חבילות בשימוש תכוף.
פריסת Helm chart למספר סביבות (dev, prod) עם ערכי תצורה שונים.
→השתמש בקבצי `values-<env>.yaml` נפרדים לכל סביבה. במשימת `HelmDeploy`, השתמש בקלט `valueFile` כדי לציין את הקובץ המתאים וב-`overrideValues` כדי להזריק ערכים דינמיים כמו image tags.
למה: תבנית זו מפרידה תצורת סביבה סטטית ממשתני Pipeline דינמיים, שומרת על פריסות נקיות וקלות לתחזוקה.