אם בנית Azure DevOps Pipeline כפתרון שלך ל- CI/CD pipeline, סביר להניח שנתקלת במצבים הדורשים ניהול דינמי של ערכי התצורה במהלך בניית ושחרור. בין אם זה לספק גרסת בנייה לתסריט PowerShell, להעביר פרמטרים דינמיים למשימות בנייה או להשתמש במחרוזות בכל אורכי הבנייה והשחרורים, אתה צריך משתנים.
אם אי פעם שאלת את עצמך שאלות כמו:
- איך אני משתמש במשתני בנייה של Azure DevOps בתסריט PowerShell?
- איך אני משתף משתנים בין בניות ושחרורים?
- איך משתנים קבועים מראש, משתנים שהמשתמש הגדיר ומשתנים סודיים שונים ביניהם?
- איך קבוצות משתנים עובדות?
…אז אתה ממש במזל! במאמר הזה, נענה על כל אחת מהשאלות הללו ועוד.
עד סופו של המאמר הזה, תבין איך משתני בנייה של Azure DevOps פועלים ב-Pipelines של Azure!
מהם משתני ה-Pipeline של Azure DevOps?
לפני שנעטוף בפרטים של משתנים, מהם הם וכיצד הם עוזרים לך לבנות ולאוטומט את צינון הבנייה והשחרור היעיל שלך?
משתנים מאפשרים לך להעביר חלקי מידע למקומות שונים בצינון הבנייה שלך. משתנים הם נפלאים לאחסון של טקסט ומספרים שעשויים להשתנות במהלך תהליך העבודה של צינון. בתהליך בנייה, אתה יכול להגדיר ולקרוא למשתנים בכמעט כל מקום במקום לקידוד קשוח של ערכים בתסריטים ובהגדרות YAML.
הערה: מאמר זה יתמקד רק בצינורות YAML. לא נכסה מידע על צינורות קלאסיות מורשות. בנוסף, למעט מספר קטן של יוצאי דופן, לא תלמדו כיצד לעבוד עם משתנים דרך ממשק המשתמש באינטרנט. אנו נצפה לעקוף בקפיצות את YAML באופן מוחלט.
משתנים מתייחסים ומוגדרים בריצה זמנית. כאשר צינור מתחיל עבודה, מספר תהליכים שולטים במשתנים אלו ומעבירים את ערכיהם לחלקים אחרים של המערכת. מערכת זו מספקת דרך להפעיל עבודות של צינור באופן דינמי מבלי לדאוג לשינויי הגדרות הבנייה והתסריטים בכל פעם.
אל תדאג אם כרגע אינך מבין את המושג של משתנים. שאר המאמר ילמד אותך את כל מה שאתה צריך לדעת.
סביבות משתנים
לפני שנקפוץ אל המשתנים עצמם, חשוב תחילה לכסות סביבות משתנים של צינור אזור התנאי. תראו התייחסויות שונות למונח זה במהלך המאמר.
בתוך צינור, ישנם שני מקומות באופן לא רשמי נקראים סביבות בהם תוכל לפעול עם משתנים. תוכל לעבוד עם משתנים בתוך הגדרת בניית YAML הנקראת סביבת הצינור או בתוך סקריפט שמבוצע דרך משימה הנקראת סביבת הסקריפט.
הסביבת צינור
כאשר אתה מגדיר או קורא משתנים בנייה מתוך הגדרת YAML, זה נקרא את סביבת הצינור. לדוגמה, מתחת ניתן לראות את קטע ה־variables
המוגדר בהגדרת בנייה של YAML המגדיר משתנה בשם foo
כ־bar
. בהקשר זה, המשתנה מוגדר בתוך סביבת ה־צינור
סביבת התסריט
ניתן גם לעבוד עם משתנים מתוך קוד שנקבע בהגדרת ה־YAML עצמה או בתסריטים. כאשר אין לך סקריפט קיים שכבר נוצר, ניתן להגדיר ולקרוא משתנים בתוך ההגדרת YAML כפי שמוצג למטה. תלמד את התחביר לגבי איך לעבוד עם משתנים בהקשר זה מאוחר יותר.
בנוסף, ניתן להישאר בסביבת התסריט על ידי הוספת אותו תחביר לתוך סקריפט Bash וביצועו. זהו המושג הכללי זהה.
משתני סביבה
בתוך סביבת התסריט, כאשר משתנה של צינור זמין, נעשה זאת על ידי יצירת משתנה סביבה. משתני הסביבה הללו יכולים להיגשר ולקורא דרך שיטות הסטנדרטיות של שפת התכנות לבחירה.
משתני צינור המוצגים כמשתני סביבה יהיו תמיד באותיות רישיות גדולות וכל נקודות המפרידה יוחלפו בקווים תחתונים. לדוגמה, ניתן לראות למטה איך כל שפת התסריטים יכולה לגשת למשתנה צינור foo
כמוצג למטה.
- בצע –
%FOO%
- סקריפט PowerShell –
$env:FOO
- סקריפט Bash –
$FOO
"שלבי ביצוע הצינור"
כאשר צינור מופעל, הוא לא רק "נפעל" פשוט. כמו השלבים שבו, הצינור עצמו עובר גם דרכים שונות בעת ביצועו. עקב החוסר של מונח רשמי בתיעוד של Microsoft, אני קורא לזה "שלבי ביצוע".
כאשר צינור מופעל, הוא עובר דרך שלושה שלבים עיקריים – המתנה, הקמפילציה ו־ הריצה. חשוב להבין את ההקשרים הללו משום שאם אתה ניווט בתיעוד של Microsoft, תראה הפניות למונחים אלו.
זמן המתנה
השלב הראשון של הצינור הוא זמן ההמתנה בעת הפעלתו בתור המתנה. בשלב זה, הצינור עדיין לא התחיל אך נמצא בתור ההמתנה ומוכן להתחיל כאשר הסוכן זמין. בעת הגדרת משתנים, ניתן להגדירם כך שיהיו זמינים בזמן ההמתנה על ידי שלא להגדירם בקובץ YAML.
תוכל להגדיר משתנים בזמן המתנה בעת הקמת הצינור בתור המתנה כפי שמוצג למטה. כאשר המשתנה הזה מתווסף, הוא יהיה זמין כמשתנה גלובלי בצינור וניתן לדרוס אותו על ידי אותו שם משתנה בקובץ YAML.

הקמפילציה
סוף סוף, כאשר צינור מעבד קובץ YAML ומגיע לשלבים שדורשים ביצוע סקריפט, הצינור נמצא בשלב ה"קימור". בהקשר זה, הסוכן מבצע את הקוד שהוגדר בשלבי הסקריפט.
זמן ריצה
השלב הבא הוא זמן הריצה. זהו השלב בו מעבדים את קובץ ה-YAML. במהלך זה, כל שלב, עבודה וצעד נעשים עיבוד, אך לא מופעלים סקריפטים.
הרחבת משתנים
נושא חשוב נוסף להבנה הוא הרחבת משתנים. הרחבת משתנים, במונחים הפשוטים ביותר, היא כאשר המשתנה מחזיר ערך סטטי. המשתנה מתרחב כדי לחשוף את הערך שהוא מחזיק. זה נעשה באופן אוטומטי עבורך כאשר אתה קורא משתנה, אך הרחבה זו יכולה להתבצע בזמנים שונים במהלך הרצת הצינור שעשויים להטעות אותך.
המושג של הרחבת משתנים וההבדל בין קימור לזמן ריצה יעלו לך הרבה פעמים כאשר תתעמק בהבנת תחביר המשתנים.
כמו שלמדת למעלה, הצינור מכסה "שלבים" שונים במהלכו. עליך להיות מודע לשלבים אלו בעיקר כאשר אתה מפתר בעיות של הרחבת משתנים.
אפשר לראות דוגמה למטה. המושג של ה"שלבים" הללו קשור באופן קרוב לסביבות המשתנים.
המשתנים מורחבים פעם אחת כאשר הצינור מתחיל לרוץ, ושוב, בתחילת כל שלב. למטה תראה דוגמה פשוטה להתנהגות זו.
תחביר משתנים
כמו שלמדת, אתה יכול להגדיר או לקרוא משתנים בשתי "סביבות" – סביבת הצינור וסביבת הסקריפט. בכל סביבה, הדרך שבה אתה מתייחס למשתנים מעט שונה. ישנם הרבה פרטים מעניינים שעליך להיות זהיר לגביהם.
משתני צינור
משתני הצינור מתייחסים בהגדרות בניית YAML וניתן להתייחס אליהם באמצעות שלושה שיטות תחביר שונות – מקרו, ביטוי תבנית וביטוי זמן ריצה.
תחביר מקרו
התחביר הנפוץ ביותר שתמצא הוא תחביר המקרו. תחביר המקרו מתייחס לערך של משתנה בצורת $(foo)
. הסוגריים מייצגים ביטוי שיש לו ערך כאשר התוכנה מריצה.
כאשר צינורי Azure מעבדים משתנה שהוגדר כביטוי מקרו, הם יחליפו את הביטוי עם תוכן המשתנה. בהגדרת משתנים עם תחביר מקרו, הם עוקבים אחר התבנית <שם משתנה>: $(<ערך משתנה>)
לדוגמה. foo: $(bar)
.
אם תנסה להתייחס למשתנה עם תחביר מקרו וערך לא קיים, המשתנה פשוט לא יתקיים. ההתנהגות הזו קצת שונה בין סוגי התחביר.
תחביר ביטוי תבנית
שורסת מינוס של סוג משתנה נקרא ביטוי תבנית. להגדרת משתני צינור בצורה זו, ניתן להשתמש בקוד הבא: ${{ variables.foo }} : ${{ variables.bar }}
. כפי שאתה רואה, זה קצת יותר ארוך מהתחביר של סינטקסיס מקרו.
לתחביר ביטוי תבנית יש גם תכונה נוספת. באמצעות התחביר הזה, תוכל גם להרחיב פרמטרי תבנית. אם משתנה הוגדר באמצעות סינטקסיס ביטוי תבנית מתייחס, הצינור יחזיר מחרוזת ריקה בניגוד לערך ריק בסינטקסיס מקרו.
משתני ביטוי תבנית עוברים עיבוד בזמן ההרכבה ואז מתווספים (אם הוגדרו) בזמן ריצה.
סינטקסיס ביטוי ריצה
כסוג התחביר, מומלץ להרחיב משתני ביטוי ריצה רק בזמן ריצה. סוגי משתנים אלו מיוצגים באמצעות הפורמט $[variables.foo]
. כמו משתני סינטקסיס ביטוי תבנית, סוגי משתנים אלו יחזירו מחרוזת ריקה אם לא יוחלף.
כמו סינטקסיס מקרו, סינטקסיס ביטוי ריצה דורש את שם המשתנה בצד שמאל של ההגדרה כמו foo: $[variables.bar]
.
משתנים תסריט
עבודה עם משתנים בתוך תסריטים קצת שונה ממשתנים בתוך צינורות. הגדרת והתייחסות למשתני צינור המוצגים בתסריטי משימה ניתן לבצע באחד משני הדרכים; עם תחביר פקודת הלוג או משתנים סביבתיים.
פקודות התחברות
דרך אחת להגדיר ולהתייחס למשתנים בצינורות בתסריטים היא להשתמש בתחביר של פקודת התחברות. תחביר זה קצת מורכב אך תלמדו שהוא נדרש במצבים מסוימים. משתנים שמוגדרים בדרך זו חייבים להיות מוגדרים כמחרוזת בתסריט.
הגדרת משתנה בשם foo
עם ערך של bar
באמצעות תחביר פקודת התחברות תיראה כך.
I could not find a way to get the value of variables using logging commands. If this exists, let me know!
משתני סביבה
כאשר משתני צינור מועברים להיות משתני סביבה בתסריטים, שמות המשתנים משתנים מעט. תגלו ששמות המשתנים מתהפכים לאותיות רומיות גדולות ונקודות משתנות לקווים תחתונים. תמצאו שישנם רבים משתנים מוגדרים מראש או משתנים מערכת עם נקודות בתוכם.
לדוגמה, אם הוגדר משתנה צינור בשם [foo.bar](<http://foo.bar>)
, תתייחסו למשתנה זה באמצעות שיטת התייחסות המשתנה המקומית של התסריט בכדי לקרוא למשתנה זה באמצעות $env:FOO_BAR
בפווורשל או $FOO_BAR
בבאש.
כיסינו עוד על משתני סביבה במקטע סביבת התסריט לעיל.
טווח המשתנים
A pipeline has various stages, tasks and jobs running. Many areas have predefined variable scopes. A scope is namespace where when a variable is defined, its value can be referenced.
לעיתים יש שלשה טווחי משתנים שונים בהיררכיה. הם משתנים שמוגדרים ברמה:
- הרמה העליונה שמאפשרת למשתנים להיות זמינים לכל המשימות בצינור
- רמת השלב שמאפשרת למשתנים להיות זמינים לשלב מסוים
- רמת המשימה שמאפשרת למשתנים להיות זמינים למשימה מסוימת
משתנים שהוגדרו ברמות "נמוכות" כמו עבודה ידרשו עדיפות על משתנה אותו הוגדר בשלב וברמת השורש, לדוד. משתנים שהוגדרו ברמת השלב ידרשו עדיפות על משתנים שהוגדרו ברמת ה"שורש", אך יידרשו על ידי משתנים שהוגדרו ברמת העבודה.
למטה תוכל לראות דוגמה להגדרת YAML בה כל טווח נעשה שימוש.
עדיפות משתנים
לפעמים תראה מצב שבו משתנה באותו שם מוגדר בטווחים שונים. כאשר זה קורה, ערך המשתנה יידרדר על פי סדר מסוים הנותן עדיפות לפעולה הקרובה ביותר.
למטה תראה את הסדר בו המשתנים יידרדרו החל ממשתנה שהוגדר ברמת העבודה, הנותן עדיפות גדולה ביותר.
- משתנה המוגדר ברמת העבודה (מוגדר בקובץ ה-YAML)
- משתנה המוגדר ברמת השלב (מוגדר בקובץ ה-YAML)
- משתנה המוגדר ברמת הצינור (גלובלי) (מוגדר בקובץ ה-YAML)
- משתנה המוגדר בזמן התור
- משתנה הצינור המוגדר בממשק הגדרות הצינור
לדוגמה, קח מבט על ההגדרה של YAML למטה. בדוגמה זו, אותה משתנה מוגדר באזורים שונים רבים אך בסופו מסתיים עם הערך המוגדר בעבודה. עם כל פעולה, ערך המשתנה נדרס והצינור מתקדם לעבודה.
סוגי משתנים
למדת על מהם המשתנים, איך הם נראים, ההקשרים בהם ניתן לבצע ועוד עד כה במאמר זה. אך מה שלא covered עד כה הוא שלא כל המשתנים זהים. יש משתנים שכבר קיימים כאשר פיסת הצינור מתחילה ולא ניתן לשנות אותם, בעוד אחרים ניתן ליצור, לשנות ולהסיר לפי רצונך.
יש ארבעה סוגים כלליים של משתנים – משתנים מוגדרים מראש או מערכתיים, משתנים מוגדרים על ידי המשתמש, משתנים פלט ומשתנים סודיים. בואו נתעמק בכל אחד מאלה ונבין כל סוג של משתנה.
משתנים מוגדרים מראש
בכל בנייה ושחרור, תמצא הרבה משתנים שונים שקיימים כבר לפי ברירת המחדל. משתנים אלו נקראים מוגדרים מראש או מערכתיים. משתנים מוגדרים מראש הם כולם לקריאה בלבד וכמו משתנים אחרים, מייצגים מחרוזות ומספרים פשוטים.
צינור Azure מתקרב ממספר רב של רכיבים מהסוכן התוכנה המבצע את הבנייה, דרכי עבודה שמתפעלות כאשר התקינה רצה ומידע נוסף שונה. כדי לייצג את כל אלה התחומים, משתנים מוגדרים מראש או משתנים מערכתיים מחולקים לאופן לא רשמי לחמישה קטגוריות ברורות:
- סוכן
- בנייה
- צינור
- עבודת הפרסום
- מערכת
יש עשרות משתנים מתופצלים בכל אחת מחמישת קטגוריות אלה. לא תלמדו על כולם במאמר זה. אם ברצונך לקבל רשימה של כל המשתנים המוגדרים מראש, תבדוק את תיעוד ה-Microsoft.
משתנים מוגדרים על ידי המשתמש
כאשר אתה יוצר משתנה בהגדרת YAML או דרך סקריפט, אתה יוצר משתנה מוגדר על ידי המשתמש. משתנים מוגדרים על ידי המשתמש הם פשוט כל המשתנים שאתה, המשתמש, מגדיר ומשתמש בצינור. אתה יכול להשתמש בכל שם שתרצה עבור משתנים אלה עם מספר חריגות קטנות.
אתה לא יכול להגדיר משתנים שמתחילים עם המילה קצה, קלט, סוד, או קובץ מאובטח. תוויות אלה אסורות משום שהן שמורות לשימוש במערכת ואינן תלויות בגודל האותיות.
בנוסף, כל המשתנים שתגדיר חייבים להיות מורכבים רק מאותיות, מספרים, נקודות או תווי קו תחתון. אם תנסה להגדיר משתנה שאינו עוקב אחר תבנית זו, ההגדרה שלך של YAML לא תעבוד.
משתנים פלט
A build definition contains one or more tasks. Sometimes a task sends a variable out to be made available to downstream steps and jobs within the same stage. These types of variables are called output variables.
משתנים פלט משמשים לשיתוף מידע בין רכיבי הצינור. לדוגמה, אם משימה אחת משאירה שאילתה מהבסיס נתונים ומשימות עתידיות זקוקות לתוצאה שהוחזרה, ניתן להשתמש במשתנה פלט. אז אין צורך לשאול את המסד נתונים בכל פעם. במקום זאת, ניתן פשוט להתייחס למשתנה.
הערה: משתני הפלט מוגדרים לשלב מסוים. אל תצפה שמשתנה הפלט יהיה זמין בשלב "בנייה" וגם בשלב "בדיקה", לדוגמה.
משתנים סודיים
הסוג הסופי של משתנה הוא המשתנה הסודי. מבחינה טכנית, זה לא סוג עצמאי משום שהוא יכול להיות משתנה מוגדר על ידי המערכת או המשתמש. אך המשתנים הסודיים צריכים להיות בקטגוריה משל עצמם מכיוון שהם נתפסים באופן שונה מאשר משתנים אחרים.
A secret variable is a standard variable that’s encrypted. Secret variables typically contain sensitive information like API keys, passwords, etc. These variables are encrypted at rest with a 2048-bit RSA key and are available on the agent for all tasks and scripts to use.
– אל תגדיר משתנים סודיים בתוך קבצי YAML שלך
– אל תחזיר את הסודים כמשתנים פלט או מידע דובר יומן
מומלץ להגדיר משתנים סודיים בעורך הצינור. זה מגדיר משתנים סודיים כמשתנים גלובליים, מה שהופך אותם לזמינים למשימות בצינור.
ערכים סודיים מוסתרים בלוגים אך לא לגמרי. לכן חשוב שלא לכלול אותם בקובץ YAML. כמו כן, יש לך גם לדעת שלא לכלול כל נתונים "מבניים" כסוד. לדוגמה, אם { "foo": "bar" }
מוגדר כסוד, bar
לא יוסתר מהלוגים.
הסודים אינם נפתחים ומפותחים אוטומטית ונמפתחים למשתני סביבה. אם אתה מגדיר משתנה סודי, אל תצפה שהוא יהיה זמין דרך
$env:FOO
בתסריט PowerShell, לדוגמה.
קבוצות משתנים
לבסוף, אנו מגיעים לקבוצות המשתנים. קבוצות משתנים, כפי שתיכנן, הם "קבוצות" של משתנים שניתן להפנות אליהם כאחת. המטרה העיקרית של קבוצת משתנים היא לאחסן ערכים שתרצה להפוך לזמינים למערכות צינורות מרובים.
שונה ממשתנים, קבוצות משתנים לא מוגדרות בקובץ YAML. במקום זאת, הן מוגדרות בדף ספריית המתחת לדף צינורות בממשק משתמש.
השתמש בקבוצת משתנים כדי לאחסן ערכים שברצונך לשלוט עליהם ולהפוך אותם לזמינים בכמה צינורות. בנוסף, ניתן להשתמש בקבוצות משתנים כדי לאחסן סודות וערכים אחרים שעשויים להיות נדרשים להעברה לצינור YAML. קבוצות משתנים מוגדרות ומנוהלות בדף ספרייה תחת צינורות כפי שמוצג למטה.

לאחר הגדרה בספריית הצינורות, תוכל להשתמש בקבוצת המשתנים הזו בקובץ YAML באמצעות התחביר הבא.
קבוצות המשתנים לא זמינות, ברירת המחדל, לכל הצינורות. הגדרה זו זמינה בעת יצירת הקבוצה. צריך לאשר את הצינורות להשתמש בקבוצת משתנים.
לאחר שקבוצת המשתנים נגישה בקובץ YAML, תוכל לגשת אליהם בדיוק כפי שתעשה עם כל משתנה אחר. שם הקבוצה של המשתנים לא משמש בעת הפניה למשתנים בקבוצה.
לדוגמה, אם הגדרת קבוצת משתנים בשם קבוצה1 עם משתנה בשם פו בתוכה, תשתמש במשתנה פו בדיוק כמו עם כל משתנה אחר, לדוגמה: $(פו)
.
משתנים סודיים שמוגדרים בקבוצת משתנים לא נגישים ישירות דרך תסריטים. במקום זאת, עליהם להיות מועברים כארגומנטים למשימה.
במקרה של שינוי במשתנה בתוך קבוצת משתנים, השינוי יהיה זמין אוטומטית לכל הצינורות שמורשות להשתמש בקבוצה הזו.
סיכום
עכשיו אמור לך להיות עם מודעות מוצקות למשתנים של Azure Pipelines. למדת כמעט כל רעיון שיש בנוגע למשתנים במאמר זה! עכשיו תפעל עם זה בצוותי העבודה שלך ב- Azure DevOps Pipelines ואוטומט את כל הדברים!
Source:
https://adamtheautomator.com/azure-devops-variables/