הגדרת התראות על בעיות ב-GitHub

‫Cloud Build יכול לשלוח לכם התראות על עדכונים ב-build לערוצים שתבחרו. בדף הזה מוסבר איך להגדיר התראות באמצעות הכלי לשליחת התראות על בעיות ב-GitHub.

לפני שמתחילים

  • מפעילים את ממשקי ה-API של Cloud Build,‏ Compute Engine,‏ Cloud Run,‏ Pub/Sub ו-Secret Manager.

    תפקידים שנדרשים להפעלת ממשקי API

    כדי להפעיל ממשקי API, נדרשת ההרשאה serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים

    הפעלת ממשקי ה-API

הגדרת התראות על בעיות ב-GitHub

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

כדי להגדיר את GitHub Issues:

  1. יוצרים GitHub Personal Access Token:

    1. כדי ליצור טוקן חדש, עוברים אל ההגדרות של GitHub.
    2. בוחרים את ההיקף repo.

    3. לוחצים על יצירת טוקן.

  2. מאחסנים את אסימון GitHub ב-Secret Manager:

    1. פותחים את הדף Secret Manager במסוף Google Cloud :

      פתיחת הדף Secret Manager

    2. לוחצים על Create secret (יצירת סוד).

    3. מזינים שם לסוד.

    4. בקטע Secret value (ערך סודי), מוסיפים את האסימון של GitHub.

    5. כדי לשמור את הסוד, לוחצים על Create secret (יצירת סוד).

  3. יכול להיות שלחשבון השירות של Cloud Run יש תפקיד עריכה בפרויקט, אבל התפקיד הזה לא מספיק כדי לגשת לסוד ב-Secret Manager. כדי לתת לחשבון השירות של Cloud Run גישה לסוד:

    1. נכנסים לדף IAM במסוף Google Cloud :

      פתיחת הדף IAM

    2. מאתרים את חשבון השירות של Compute Engine שמוגדר כברירת מחדל שמשויך לפרויקט:

      חשבון השירות של Compute Engine שמוגדר כברירת מחדל ייראה בערך כך:

      project-number-compute@
      

      שימו לב לחשבון השירות של Compute Engine שמוגדר כברירת מחדל.

    3. פותחים את הדף Secret Manager במסוף Google Cloud :

      פתיחת הדף Secret Manager

    4. לוחצים על שם הסוד שמכיל את הסוד של אסימון GitHub.

    5. בכרטיסייה Permissions, לוחצים על Add member.

    6. מוסיפים את חשבון השירות שמוגדר כברירת מחדל ב-Compute Engine שמשויך לפרויקט כחבר.

    7. בוחרים את ההרשאה Secret Manager Secret Accessor בתור התפקיד.

    8. לוחצים על Save.

  4. נותנים לחשבון השירות של Cloud Run הרשאה לקרוא מקטגוריות של Cloud Storage:

    1. נכנסים לדף IAM במסוף Google Cloud :

      פתיחת הדף IAM

    2. מאתרים את חשבון השירות של Compute Engine שמוגדר כברירת מחדל שמשויך לפרויקט:

      חשבון השירות של Compute Engine שמוגדר כברירת מחדל ייראה בערך כך:

      project-number-compute@
      
    3. לוחצים על סמל העיפרון בשורה שמכילה את חשבון השירות של Compute Engine שמוגדר כברירת מחדל. תוצג הכרטיסייה גישת עריכה.

    4. לוחצים על הוספת תפקיד נוסף.

    5. מוסיפים את התפקיד הבא:

      • צפייה באובייקט אחסון
    6. לוחצים על Save.

  5. כותבים קובץ הגדרות של תבנית כדי לתאר את הפורמט של בעיות GitHub שנוצרות:

    בקובץ התצורה של התבנית לדוגמה שבהמשך, השדות title ו-body משתמשים במשתני החלפה מה-build:

    {
        "title": "Build {{.Build.BuildTriggerId}}: {{.Build.Status}}",
        "body": "[{{.Build.ProjectId}}] {{.Build.BuildTriggerId}} status: **{{.Build.Status}}**\n\n[View Logs]({{.Build.LogUrl}})"
    }
    

    כדי לראות את הדוגמה, אפשר לעיין בקובץ ההגדרות של התבנית של כלי ההתראות על בעיות ב-GitHub.

    אפשר להגדיר שדות נוספים מפרמטרים הזמינים בגוף הבקשה מנקודת קצה ל-API של GitHub ליצירת בעיה.

  6. כותבים קובץ הגדרות של התראות כדי להגדיר את ההתראות על בעיות ב-GitHub ולסנן אירועים של בנייה:

    בדוגמה הבאה של קובץ הגדרות של כלי להודעות, השדה filter משתמש בCommon Expression Language עם המשתנה הזמין build כדי לסנן אירועי build עם סטטוס SUCCESS:

    apiVersion: cloud-build-notifiers/v1
    kind: GitHubIssuesNotifier
    metadata:
      name: example-githubissues-notifier
    spec:
      notification:
        filter: build.status == Build.Status.FAILURE
        template:
          type: golang
          uri: gs://BUCKET_NAME/TEMPLATE_FILE_NAME
        delivery:
          githubToken:
            secretRef: github-token
          githubRepo: MY_USER/MY_REPO
      secrets:
      - name: github-token
        value: projects/PROJECT_ID/secrets/SECRET_NAME/versions/latest
    

    כאשר:

    • githubToken הוא משתנה ההגדרה שמשמש בדוגמה הזו כדי להפנות לאסימון GitHub שמאוחסן ב-Secret Manager. שם המשתנה שמציינים כאן צריך להיות זהה לשם בשדה name בקטע secrets.
    • BUCKET_NAME הוא שם הקטגוריה.
    • TEMPLATE_FILE_NAME הוא שם קובץ התבנית.
    • MY_USER/MY_REPO הוא שם המאגר שבו ייווצרו הבעיות.
    • PROJECT_ID הוא מזהה Google Cloud הפרויקט.
    • SECRET_NAME הוא השם של הסוד שמכיל את הטוקן של GitHub.

    כדי לראות את הדוגמה, אפשר לעיין בקובץ ההגדרות של כלי ההתראה של GitHub Issues.

    במאמר בנושא Build מפורטים שדות נוספים שאפשר לסנן לפיהם. דוגמאות נוספות לסינון זמינות במאמר שימוש ב-CEL לסינון אירועי בנייה.

  7. מעלים את קובץ ההגדרות של כלי ההתראה ואת קובץ התבנית לקטגוריה של Cloud Storage:

    1. אם אין לכם קטגוריה של Cloud Storage, מריצים את הפקודה הבאה כדי ליצור קטגוריה, כאשר BUCKET_NAME הוא השם שרוצים לתת לקטגוריה, בכפוף לדרישות למתן שמות.

      gcloud storage buckets create gs://BUCKET_NAME/
      
    2. מעלים את קובץ ההגדרות של כלי ההתראות ואת קובץ התבנית לקטגוריה:

      gcloud storage cp CONFIG_FILE_NAME gs://BUCKET_NAME/CONFIG_FILE_NAME
      
      gcloud storage cp TEMPLATE_FILE_NAME gs://BUCKET_NAME/TEMPLATE_FILE_NAME
      

      כאשר:

      • BUCKET_NAME הוא שם הקטגוריה.
      • CONFIG_FILE_NAME הוא השם של קובץ ההגדרות.
      • TEMPLATE_FILE_NAME הוא שם קובץ התבנית.
  8. פורסים את כלי ההתראה ב-Cloud Run:

     gcloud run deploy SERVICE_NAME \
       --image=us-east1-docker.pkg.dev/gcb-release/cloud-build-notifiers/githubissues:latest \
       --no-allow-unauthenticated \
       --update-env-vars=CONFIG_PATH=CONFIG_PATH,PROJECT_ID=PROJECT_ID
    

    כאשר:

    • SERVICE_NAME הוא השם של שירות Cloud Run שבו פורסים את האימג'.
    • CONFIG_PATH הוא הנתיב לקובץ ההגדרות של כלי ההתראה של GitHub Issues, ‏ gs://BUCKET_NAME/CONFIG_FILE_NAME.
    • PROJECT_ID הוא מזהה Google Cloud הפרויקט.

    הפקודה gcloud run deploy שולפת את הגרסה העדכנית של התמונה המתארחת מ-Artifact Registry שבבעלות Cloud Build. ‫Cloud Build תומך בתמונות של כלי התראה למשך תשעה חודשים. אחרי תשעה חודשים, Cloud Build מוחק את גרסת התמונה. אם רוצים להשתמש בגרסה קודמת של תמונה, צריך לציין את הגרסה הסמנטית המלאה של תג התמונה במאפיין image של הפקודה gcloud run deploy. גרסאות קודמות של תמונות ותגים אפשר למצוא ב-Artifact Registry.

  9. יוצרים חשבון שירות שייצג את הזהות של המינוי ל-Pub/Sub:

    gcloud iam service-accounts create SUB_IDENTITY_SERVICE_ACCOUNT \
      --display-name "SUB_IDENTITY_SERVICE_ACCOUNT_DISPLAY_NAME"
    

    כאשר:

    • SUB_IDENTITY_SERVICE_ACCOUNT הוא שם לחשבון השירות.

    • SUB_IDENTITY_SERVICE_ACCOUNT_DISPLAY_NAME הוא השם המוצג של חשבון השירות.

  10. נותנים לחשבון השירות של זהות המנוי ב-Pub/Sub את ההרשאות שנדרשות ליצירת אסימוני אימות בGoogle Cloud פרויקט.

    gcloud iam service-accounts add-iam-policy-binding \
        SUB_IDENTITY_SERVICE_ACCOUNT@PROJECT_ID.i \
        --member=serviceAccount:service-PROJECT_NUMBER@gcp-sa-pubsub. \
        --role=roles/iam.serviceAccountTokenCreator
    

    כאשר:

    • PROJECT_ID הוא מזהה Google Cloud הפרויקט.

    • PROJECT_NUMBER הוא מספר הפרויקט Google Cloud .

  11. נותנים לחשבון השירות SUB_IDENTITY_SERVICE_ACCOUNT את התפקיד Invoker ב-Cloud Run:

    gcloud run services add-iam-policy-binding SERVICE_NAME \
       --member=serviceAccount:SUB_IDENTITY_SERVICE_ACCOUNT@PROJECT_ID. \
       --role=roles/run.invoker
    

    כאשר:

    • SERVICE_NAME הוא השם של שירות Cloud Run שבו פורסים את האימג'.

    • PROJECT_ID הוא מזהה Google Cloud הפרויקט.

  12. יוצרים את הנושא cloud-builds כדי לקבל הודעות עדכון לגבי הגרסה של כלי ההתראות:

    gcloud pubsub topics create cloud-builds
    

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

    gcloud pubsub topics create topic-name
    

    מידע נוסף זמין במאמר בנושא נושאי Pub/Sub להתראות על בנייה.

  13. יוצרים מנוי Pub/Sub מסוג push עבור כלי ההתראה:

     gcloud pubsub subscriptions create subscriber-id \
       --topic=cloud-builds \
       --push-endpoint=SERVICE_URL \
       --push-auth-service-account=SUB_IDENTITY_SERVICE_ACCOUNT@PROJECT_ID.

כאשר: + SUBSCRIBER_ID הוא השם שרוצים לתת למינוי. ‫+ SERVICE_URL היא כתובת ה-URL שנוצרה על ידי Cloud Run עבור השירות החדש. ‫+ PROJECT_ID הוא מזהה הפרויקט. Google Cloud

Note: By default, [subscriptions expire after 31 days of inactivity](/pubsub/docs/subscription-overview#lifecycle).
You can adjust or disable the expiration period by including the
[`--expiration-period` flag](/sdk/gcloud/reference/pubsub/subscriptions/create#--expiration-period)
when creating the subscription.

ההתראות על הפרויקט שלכם ב-Cloud Build מוגדרות עכשיו. בפעם הבאה שתפעילו build, אם ה-build יתאים למסנן שהגדרתם, ייווצר issue במאגר GitHub שהגדרתם.

שימוש ב-CEL לסינון אירועים של בנייה

‫Cloud Build משתמש ב-CEL עם המשתנה build בשדות שמופיעים במשאב Build כדי לגשת לשדות שמשויכים לאירוע הבנייה, כמו מזהה הטריגר, רשימת התמונות או ערכי ההחלפה. אפשר להשתמש במחרוזת filter כדי לסנן אירועי בנייה בקובץ ההגדרות של הבנייה באמצעות כל שדה שמופיע במשאב Build. כדי למצוא את התחביר המדויק שמשויך לשדה, אפשר לעיין בקובץ cloudbuild.proto.

סינון לפי מזהה טריגר

כדי לסנן לפי מזהה טריגר, מציינים את ערך מזהה הטריגר בשדה filter באמצעות build.build_trigger_id, כאשר trigger-id הוא מזהה הטריגר כמחרוזת:

filter: build.build_trigger_id == trigger-id

סינון לפי סטטוס

כדי לסנן לפי סטטוס, מציינים את סטטוס הבנייה שרוצים לסנן לפיו בשדה filter באמצעות build.status.

בדוגמה הבאה אפשר לראות איך מסננים אירועי build עם סטטוס SUCCESS באמצעות השדה filter:

filter: build.status == Build.Status.SUCCESS

אפשר גם לסנן את הגרסאות עם סטטוסים שונים. בדוגמה הבאה מוצג סינון של אירועי בנייה עם סטטוס SUCCESS, FAILURE או TIMEOUT באמצעות השדה filter:

filter: build.status in [Build.Status.SUCCESS, Build.Status.FAILURE, Build.Status.TIMEOUT]

כדי לראות ערכי סטטוס נוספים שאפשר לסנן לפיהם, אפשר לעיין בסטטוס בקטע 'הפניה למשאב Build'.

סינון לפי תג

כדי לסנן לפי תג, מציינים את הערך של התג בשדה filter באמצעות build.tags, כאשר tag-name הוא השם של התג:

filter: tag-name in build.tags

אפשר לסנן לפי מספר התגים שצוינו באירוע הבנייה באמצעות size. בדוגמה הבאה, השדה filter מסנן אירועי build שיש להם בדיוק שני תגים, כאשר אחד מהתגים הוא v1:

filter: size(build.tags) == 2 && "v1" in build.tags

סינון לפי תמונות

כדי לסנן לפי תמונות, מציינים את הערך של התמונה בשדה filter באמצעות build.images, כאשר image-name הוא השם המלא של התמונה כפי שמופיע ב-Artifact Registry, למשל us-east1-docker.pkg.dev/my-project/docker-repo/image-one:

filter: image-name in build.images

בדוגמה הבאה, המסנן filter פועל על אירועי בנייה שבהם us-east1-docker.pkg.dev/my-project/docker-repo/image-one או us-east1-docker.pkg.dev/my-project/docker-repo/image-two מצוינים כשמות תמונות:

filter: "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images || "us-east1-docker.pkg.dev/my-project/docker-repo/image-one" in build.images

סינון לפי שעה

אפשר לסנן אירועים של בנייה לפי זמן היצירה, זמן ההתחלה או זמן הסיום של הבנייה. כדי לעשות זאת, צריך לציין אחת מהאפשרויות הבאות בשדה filter: build.create_time,‏ build.start_time או build.finish_time.

בדוגמה הבאה, השדה filter משתמש ב-timestamp כדי לסנן אירועי בנייה עם זמן בקשה ליצירת הבנייה ב-20 ביולי 2020 בשעה 6:00 בבוקר:

filter: build.create_time == timestamp("2020-07-20:T06:00:00Z")

אפשר גם לסנן אירועי בנייה לפי השוואות בין תקופות. בדוגמה הבאה, השדה filter משתמש ב-timestamp כדי לסנן אירועי בנייה עם שעת התחלה בין 20 ביולי 2020 בשעה 6:00 לבין 30 ביולי 2020 בשעה 6:00.

filter: timestamp("2020-07-20:T06:00:00Z") >= build.start_time && build.start_time <= timestamp("2020-07-30:T06:00:00Z")

מידע נוסף על האופן שבו אזורי זמן מבוטאים ב-CEL זמין בהגדרת השפה של אזורי זמן.

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

filter: build.finish_time - build.start_time >= duration("5m")

סינון לפי החלפה

כדי לסנן לפי החלפה, מציינים את משתנה ההחלפה בשדה filter באמצעות build.substitutions. בדוגמה הבאה, השדה filter מפרט את הגרסאות שמכילות את משתנה ההחלפה substitution-variable, ובודק אם substitution-variable תואם ל-substitution-value שצוין:

filter: build.substitutions[substitution-variable] == substitution-value

כאשר:

  • substitution-variable הוא השם של משתנה ההחלפה.
  • substitution-value הוא השם של ערך ההחלפה.

אפשר גם לסנן לפי ערכי ברירת מחדל של משתני החלפה. בדוגמה הבאה, השדה filter מציג גרסאות build עם שם הענף master וגרסאות build עם שם המאגר github.com/user/my-example-repo. משתני ההחלפה שמוגדרים כברירת מחדל, BRANCH_NAME ו-REPO_NAME, מועברים כמפתחות אל build.substitutions:

filter: build.substitutions["BRANCH_NAME"] == "master" && build.substitutions["REPO_NAME"] == "github.com/user/my-example-repo"

אם רוצים לסנן מחרוזות באמצעות ביטויים רגולריים, אפשר להשתמש בפונקציה המובנית matches. בדוגמה שלמטה, השדה filter מסנן גרסאות build עם סטטוס FAILURE או TIMEOUT, וגם גרסאות build עם משתנה החלפה TAG_NAME עם ערך שתואם לביטוי הרגולרי v{DIGIT}.{DIGIT}.{3 DIGITS}).

filter: build.status in [Build.Status.FAILURE, Build.Status.TIMEOUT] && build.substitutions["TAG_NAME"].matches("^v\\d{1}\\.\\d{1}\\.\\d{3}$")

רשימה של ערכי החלפה שמוגדרים כברירת מחדל מופיעה במאמר שימוש בהחלפות שמוגדרות כברירת מחדל.

המאמרים הבאים