יחידה 2 / 11

עיצוב צינורות CI/CD עם בינה מלאכותית: GitHub Actions ו-GitLab CI

רווחים:

  • יכולת להבין את מושג ה-CI/CD, אנטומיית הצינור (טריגר, עבודה, צעד, רץ, חפץ) וההבדלים בין GitHub Actions ו- GitLab CI ובינה מלאכותית לייצר צינורות עם ההקשר הנכון
  • יכולת לבדוק ולאבטח הפניות סודיות, הרשאות וקיומם של רכיבים נקראים בצנרת המיוצרים על ידי בינה מלאכותית
  • יכולת ליישם את העקרונות של אי כתיבת סודות בטקסט רגיל, מתן הרשאות מינימליות, ושמירה על פריסה מבוקרת על ידי הפרדתה מ-CI

לב ליבה של התוכנה המודרנית הוא הצינור האוטומטי שדרכו יוצא הקוד מהמחשב של המפתח עד שהוא מגיע בבטחה ללקוח. צינור זה נקרא CI/CD. CI (Integration Continuous Integration) הוא הידור ובדיקה אוטומטיים של כל שינוי בקוד; מטרתו לתפוס באג עוד לפני שהמפתח עוזב את המקלדת. CD (משלוח רציף/פריסה) הוא הכנה אוטומטית או אפילו שחרור של קוד שנבדק. צינור CI/CD הוא קובץ תצורה המגדיר את השלבים הללו לפי הסדר - בדרך כלל כתוב ב-YAML (פורמט טקסט תצורה הניתן לקריאה אנושית).

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

אנטומיה של צינור CI/CD

כל צינור מורכב מכמה מושגי יסוד. אתה לא יכול לשלוט בפלט AI בלי לדעת את אלה:

  • טריגר: מה מתחיל את ה-Pipeline? בדרך כלל דחיפה לסניף, בקשת משיכה (בקשת מיזוג) או לוח זמנים.
  • תפקיד: יחידה לוגית המבצעת סדרה של שלבים; למשל "בדיקה", "בנה", "פרוס".
  • שלב: פקודה או פעולה בודדת בתוך עבודה.
  • Runner: המכונה הווירטואלית או המכולה שעליה פועלות המשימות.
  • Artifact: הפלט שנוצר על ידי עבודה אחת ומשמש על ידי עבודות עוקבות (לדוגמה, קובץ קומפילציה).
  • סוד: מידע סודי שבו Pipeline משתמש אך לא אמור להישאר בטקסט רגיל במאגר.

GitHub Actions שומרת את ההגדרה הזו בקבצי .github/workflows/*.yml; היחידה היא זרימת עבודה → עבודה → היררכיית צעדים. GitLab CI, לעומת זאת, משתמש במבנה השלב → העבודה בקובץ .gitlab-ci.yml. ה-AI מכיר את שני התחבירים, אבל עליך לומר במפורש איזה מהם אתה רוצה.

טיפ: כאשר מבקשים מ-AI עבור צינורות, ציין תמיד: פלטפורמה (GitHub Actions או GitLab CI), שפה/מסגרת (Node, .NET, Python...), טריגר והאם הוא ייפרס. ארבע פיסות המידע הללו מכפילות את התועלת של הפלט.

שלב אחר שלב: תכנון צינור עם AI

  1. הבהירו את המטרה. כמו "להריץ בדיקות בדחיפה לראשי, לבנות תמונה, אבל לפרוס רק כאשר תג נזרק".
  2. יש לייצר את השלד. בקש מה-AI את זרימת העבודה הבסיסית.
  3. קרא והבין את השלבים. ודא מה עושה כל קו הפעלה ושימוש.
  4. סמן הפניות סודיות. האם הסודות נקראים עם ${{ secrets.NAME }} או שהם מוטמעים בקוד?
  5. נסה את זה מקומי/CI. הפעל אותו על מאגר בדיקה קטן, ראה את התנהגות האדום-ירוק (נכשל).
  6. הרחב בהדרגה. תחילה פשוט הוסף CI (בדיקה), ואז בנה, הוסף אחרון פריסה.

אבטחה: סוד והרשאה בצנרת

CI/CD הוא אחד המקומות שבהם הסודות דולפים הכי הרבה. שלושה כללי זהב:

  1. לעולם אל תכתוב סודות בטקסט רגיל ב-YAML. השתמש במאגר הסודי של הפלטפורמה (GitHub Secrets, GitLab CI/CD Variables) וקרא לו עם ${{ secrets.X }}.
  2. הכי פחות זכות. לאסימון שאתה נותן ל-Pipeline תהיה רק ​​סמכות רבה ככל הדרוש. צמצם את זה עם ההרשאות: חסום בפעולות GitHub.
  3. אל תלחץ על סוד ביומן. שורות כמו הד $TOKEN חושפות את הסוד ביומן. פלטפורמות מסיכות, אבל גם היזהר.
זהירות: מטעמי נוחות, AI לפעמים מכניס ערכים משובצים כמו סיסמה: 123456 או הרשאות רחבות מדי: כתוב הכל בצינורות לדוגמה. תמיד תקן את זה: שנה סוד להפניה, הרשאת כיווץ.

טבלת השוואה

מושג

פעולות GitHub

GitLab CI

קובץ תצורה

.github/workflows/*.yml

.gitlab-ci.yml

יחידת בניין

זרימת עבודה → עבודה → שלב

שלב → עבודה

טריגר

עשר:

כללים: / בלבד:

לזמן סוד

${{ secrets.NAME }}

$NAME (משתני CI/CD)

רכיב מוכן

משתמש: action@v4

כוללים: /template

רץ

ריצות:

תגים:

שלושה מיני תיקים

מקרה 1 - מופחת ל-6 שעות ו-40 דקות. צוות רצה להפוך את תהליך הבדיקה-בנייה-פריסה הידני שלו, אך איש לא הכיר את YAML. הם תיארו את YZ כ"פרויקט Node.js, GitHub Actions, npm test ו-npm build בדחיפה ל-main, לפרוס רק בתג v*". AI ייצר שלד עובד של 40 קווים; הצוות אימת כל שלב ועלה לאוויר תוך 40 דקות. אם היו כותבים את זה ביד, זה היה יום עבודה.

מקרה 2 - אימות תפס פגיעות אבטחה. מהנדס ביקש מה-AI לפרוס זרימת עבודה. הפלט כלל הרשאות: write-all - כלומר האסימון יכול לכתוב למאגר, חבילות, הכל. המהנדס שם לב לכך וצמצם אותו עם הרשאות: { contents: read, packages: write }. זה מבטל את הסיכון של תלות חטופה שתחליף את המאגר כולו.

מקרה 3 - פעולה הזויה. צוות אחד הפעיל את השימושים המוצעים בבינה מלאכותית: actions/deploy-to-aws@v3 line; לא הייתה פעולה רשמית כזו, AI המציא את השם. צינור התפוצץ עם "פעולה לא נמצאה". שיעור: ודא ב-Marketplace שכל רכיב שנקרא עם uses: אכן קיים.

ארבע תבניות הניתנות להעתקה

1) זרימת עבודה בסיסית של CI:

כתוב זרימת עבודה של CI עבור GitHub Actions. פרויקט: [שפה/מסגרת]. טריגר: בקשה לדחיפה ומשיכה לסניף הראשי. שלבים: התקנת תלות, הפעלת בדיקות, הפעלת lint. NO Deploy.Runner אובונטו-האחרון. אין צורך בסוד. הערה YAML.

2) זרימת עבודה של תקליטורים פרוסים (מאובטח):

כתוב את זרימת העבודה של הפריסה עבור [PLATFORM]. זה אמור לעבוד רק בתג 'v*'. יעד: [מדיה/ענן]. כללים: - לעולם אל תכתוב סודות בטקסט רגיל, קרא להם עם ${{ סודות.

3) תאר את הצינור הקיים:

תאר את הצינור הבא [PLATFORM] שורה אחר שורה: מה עושה כל עבודה, באיזה סדר היא פועלת, באיזה סוד היא משתמשת, ומהן שתי הנקודות המסוכנות ביותר שלה? לבסוף, הצע 3 שיפורים. צינור: [YAML CONTENT]

4) האצת צינור:

צינור ה-CI הבא פועל באיטיות (משך: [X דקות]). בדוק שימוש במטמון, עבודות מקבילות ושלבים מיותרים. תן 5 הצעות האצה קונקרטיות שניתן לפעול ורשום את ההשפעה המשוערת של כל אחת מהן. צינור: [YAML]

הנחיה חלשה / הנחיה חזקה

חלש: "כתוב זרימת עבודה של GitHub Actions."

תוצאה: לא ברור איזו שפה, איזה מפעיל, אם יש פריסה; AI נותן מופע גנרי של Node, כנראה לא יתאים לפרויקט שלך, ויכול לקודד קשה את הסוד.

חזק: "כתוב את זרימת העבודה של GitHub Actions. פרוייקט Python 3.12, הרץ pytest + ruff ב-pull request ו-push main; NO deploy; האצת תלות עם pip cache; אין צורך בסודות. ייצא YAML עם הערות."

הבדל: ההנחיה השנייה נותנת את השפה, הטריגר, ההיקף (ללא פריסה), תוחלת הביצועים ומגבלות האבטחה. הפלט עובד ישירות.

טעויות נפוצות

  • הטמעת הסוד ב-YAML. סיסמה/אסימון בטקסט רגיל הוא פגיעות ה-CI הנפוצה ביותר.
  • היתר רחב מדי. תן את ההרשאה המינימלית הנדרשת במקום לכתוב הכל.
  • הסתמכות על פעולה/תבנית שלא קיימת. אמת את השימושים שנעשו ב-AI: שורות ב-Marketplace.
  • מבלבל את הפריסה עם CI. הבדיקה יכולה לפעול בכל דחיפה, אבל הפריסה חייבת להיות מבוקרת ומאושרת.
  • לא משתמש במטמון. התקנת תלות מאפס בכל ריצה מאטה את הצינור בדקות.
  • מנסה את זרימת העבודה הראשונה ישירות במאגר הראשי. תחילה הפעל אותו על מאגר בדיקה.

לסיכום

צינורות CI/CD הם צינורות אוטומטיים המעבירים קוד בבטחה ל-prod ומוגדרים עם YAML. AI מייצרת במהירות שרטוטים עובדים עבור GitHub Actions ו- GitLab CI - אבל אתה צריך להיות ברור לגבי הפלטפורמה, השפה, הטריגר והיקף הפריסה. ישנם שלושה כללים באבטחה: סודות התקשרו לפי הפניה, הענקת הרשאות מינימום, אין להדפיס סודות ביומן. באחריותך לוודא שכל משתמש:/include: רכיב אכן קיים ומה עושה כל שלב.

משימת יישום

בחר פרויקט פשוט לדוגמה (אפילו "שלום עולם" בשפה שלך יתאים). בקש מ-AI לייצר זרימת עבודה עם התבנית "זרימת עבודה בסיסית של CI" למעלה. לאחר מכן: (1) כתוב במילים שלך מה עושה כל צעד; (2) לוודא שאין סודות מוטבעים וההרשאות מצומצמות; (3) אם אפשר, הפעל אותו במיכל בדיקה וצפה בהתנהגות האדום-ירוק.

רשימת בדיקה

  • [ ] הוספתי להנחיה שלי את הפלטפורמה, השפה/המסגרת, טווח ההפעלה והפריסה.
  • [ ] אני מבין מה כל עבודה ושלב עושה ב-YAML שנוצר.
  • [ ] אין סוד הוא טקסט פשוט; כל ${{ secrets.X }} / משתנה CI.
  • [ ] צמצמתי את ההרשאות לסמכות המינימלית.
  • [ ] וידאתי שכל הפעולות/תבניות שנקראו אכן קיימות.
  • [ ] עשיתי את שלב הפריסה מבוקר עם אישור/הגנה.