פיתוח, בדיקה והעברה לקונטיינרים של אפליקציות Go

בדף הזה מוסבר איך להשתמש ב-Cloud Build כדי ליצור, לבדוק, להכניס לקונטיינר ולפרוס אפליקציות Go, ואיך לשמור את יומני הבדיקה ב-Cloud Storage.

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

ההוראות בדף הזה מניחות שאתם מכירים את Go. בנוסף:

  • מפעילים את Cloud Build API,‏ Cloud Run API ו-Artifact Registry API.

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

    כדי להפעיל ממשקי API, צריך את תפקיד ה-IAM 'אדמין של Service Usage' (roles/serviceusage.serviceUsageAdmin), שכולל את ההרשאה serviceusage.services.enable. איך מקצים תפקידים

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

  • כדי להריץ את הפקודות gcloud שבדף הזה, צריך להתקין את Google Cloud CLI.
  • הפרויקט שלכם ב-Go צריך להיות בהישג יד.
  • אם רוצים להכניס את אפליקציית Go שלכם לקונטיינר באמצעות Cloud Build, תצטרכו Dockerfile וגם את קוד המקור.
  • אם רוצים לאחסן את הקונטיינר שנבנה ב-Artifact Registry, צריך ליצור מאגר Docker ב-Artifact Registry.
  • אם רוצים לאחסן יומני בדיקה ב-Cloud Storage, צריך ליצור קטגוריה ב-Cloud Storage.

הרשאות IAM נדרשות

הוראות להקצאת התפקידים האלה מופיעות במאמר הקצאת תפקיד באמצעות הדף IAM.

הגדרת קובצי build של Go

קובץ האימג' הציבורי golang מ-Docker Hub תומך ביצירה באמצעות מודולים של Go. אם משתמשים בקובץ האימג' הזה כשלב build בקובץ ההגדרות של Cloud Build, אפשר להפעיל פקודות go בתוך קובץ האימג'. הארגומנטים שמועברים לשלב הבנייה הזה מועברים ישירות לכלי golang, כך שאפשר להריץ כל פקודה של golang בתמונה הזו.go

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

כדי ליצור את אפליקציית Go:

  1. בתיקיית השורש של הפרויקט, יוצרים קובץ הגדרות של Cloud Build בשם cloudbuild.yaml.

  2. Build ובדיקה: אם הגדרתם בדיקות יחידה באפליקציה, אתם יכולים להגדיר את Cloud Build להפעלת הבדיקות על ידי הוספת השדות הבאים לשלב build:

    • name: מגדירים את הערך של השדה הזה ל-golang כדי להשתמש בתמונה של golang מ-Docker Hub למשימה.
    • entrypoint: מגדירים את הערך של השדה הזה ל-/bin/bash. כך תוכלו להריץ פקודות bash מרובות שורות ישירות משלב הבנייה.
    • args: השדה args של שלב בנייה מקבל רשימה של ארגומנטים ומעביר אותם לתמונה שאליה יש הפניה בשדה name. בדוגמה הבאה, השדה args מקבל את הארגומנטים של:

      • מריצים את הכלי לעיצוב יומן הבדיקה כדי להוריד את הפלט של יומן הבדיקה.
      • הדפסת הפלט של היומן.
      • תוצאות הבדיקה נשמרות ב-sponge.log.
      • התוצאות מועברות בפורמט sponge.log לקובץ XML של JUNIT. השם של קובץ ה-XML של JUNIT מורכב מהגרסה הקצרה של מזהה הקומיט שמשויך ל-build. בשלב הבא של ה-build, היומנים יישמרו בקובץ הזה ב-Cloud Storage.
      steps:
        # Run tests and save to file
        - name: golang:1.26-trixie
          entrypoint: /bin/bash
          args:
            - -c
            - |
              go install github.com/jstemmer/go-junit-report/v2@latest
              2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
  3. הוספת האפליקציה לקונטיינר: אחרי שמוסיפים את שלב ה-build כדי לוודא שהבדיקות עברו בהצלחה, אפשר לבצע build של האפליקציה. ‫Cloud Build מספק קובץ אימג' של Docker שנבנה מראש שאפשר להשתמש בו כדי להכניס את אפליקציית Go שלכם לקונטיינר. כדי להוסיף את האפליקציה לקונטיינר, מוסיפים את השדות הבאים בשלב הבנייה:

    • name: מגדירים את הערך של השדה הזה ל-gcr.io/cloud-builders/docker כדי להשתמש בתמונת Docker מוכנה מראש למשימה.
    • args: מוסיפים את הארגומנטים של הפקודה docker build כערכים בשדה הזה.

    שלב ה-build הבא יוצר את קובץ האימג' myimage ומתייג אותו עם הגרסה הקצרה של מזהה הקומיט. בשלב הבנייה נעשה שימוש בהחלפות של מזהה הפרויקט, שם המאגר וערכי SHA קצרים, ולכן הערכים האלה מוחלפים אוטומטית בזמן הבנייה. שימו לב: כדי לאחסן את התמונה, תצטרכו ליצור מאגר Docker ב-Artifact Registry או להשתמש במאגר קיים.

    # Docker Build
    - name: 'gcr.io/cloud-builders/docker'
      args: ['build', '-t',
             'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA', '.']
  4. דחיפת הקונטיינר ל-Artifact Registry: אפשר לאחסן את הקונטיינר שנבנה ב-Artifact Registry, שהוא Google Cloud שירות שמאפשר לאחסן, לנהל ולאבטח ארטיפקטים של גרסאות build. כדי לעשות את זה, צריך שיהיה לכם מאגר Docker קיים ב-Artifact Registry. כדי להגדיר את Cloud Build לאחסון התמונה במאגר Docker ב-Artifact Registry, מוסיפים שלב build עם השדות הבאים:

    • name: מגדירים את הערך של השדה הזה ל-gcr.io/cloud-builders/docker כדי להשתמש בתמונה הרשמית של docker לבנייה של המשימה.
    • args: מוסיפים את הארגומנטים לפקודה docker push כערכים של השדה הזה. בכתובת היעד, מזינים את מאגר Docker ב-Artifact Registry שבו רוצים לאחסן את התמונה.

    שלב ה-build הבא מעביר את קובץ האימג' שיצרתם בשלב הקודם אל Artifact Registry:

    # Docker push to Google Artifact Registry
    - name: 'gcr.io/cloud-builders/docker'
      args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA']
  5. פריסת הקונטיינר ב-Cloud Run: כדי לפרוס את האימג' ב-Cloud Run, מוסיפים שלב בנייה עם השדות הבאים:

    • name: מגדירים את הערך של השדה הזה ל-google/cloud-sdk כדי להשתמש בתמונה של ה-CLI של gcloud להפעלת הפקודה gcloud לפריסת התמונה ב-Cloud Run.
    • args: מוסיפים את הארגומנטים של הפקודה gcloud run deploy כערכים של השדה הזה.

    שלב ה-build הבא פורס את האימג' שנוצר קודם ב-Cloud Run:

    # Deploy to Cloud Run
    - name: 'gcr.io/cloud-builders/gcloud'
      args: ['run', 'deploy', 'helloworld-${SHORT_SHA}',
             '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA',
             '--region', 'us-central1', '--platform', 'managed']
  6. שמירת יומני בדיקה ב-Cloud Storage: אתם יכולים להגדיר את Cloud Build לאחסון יומני בדיקה ב-Cloud Storage על ידי ציון מיקום של קטגוריה קיימת ונתיב ליומני הבדיקה.

    שלב ה-build הבא שומר את יומני הבדיקה ששמרתם בקובץ JUNIT XML בקטגוריה של Cloud Storage:

    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml

    בקטע הקוד הבא מוצג קובץ התצורה המלא של ה-build עבור השלבים הקודמים:

    steps:
      # Run tests and save to file
      - name: golang:1.26-trixie
        entrypoint: /bin/bash
        args:
          - -c
          - |
            go install github.com/jstemmer/go-junit-report/v2@latest
            2>&1 go test -timeout 1m -v ./... | /go/bin/go-junit-report -set-exit-code -iocopy -out ${SHORT_SHA}_test_log.xml
    
      # Docker Build
      - name: 'gcr.io/cloud-builders/docker'
        args: ['build', '-t',
               'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA', '.']
    
      # Docker push to Google Artifact Registry
      - name: 'gcr.io/cloud-builders/docker'
        args: ['push', 'us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA']
    
      # Deploy to Cloud Run
      - name: 'gcr.io/cloud-builders/gcloud'
        args: ['run', 'deploy', 'helloworld-${SHORT_SHA}',
               '--image=us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA',
               '--region', 'us-central1', '--platform', 'managed']
    
    # Save test logs to Google Cloud Storage
    artifacts:
      objects:
        location: gs://$_BUCKET_NAME/
        paths:
          - ${SHORT_SHA}_test_log.xml
    # Store images in Google Artifact Registry
    images:
      - us-central1-docker.pkg.dev/$PROJECT_ID/$_AR_REPO_NAME/myimage:$SHORT_SHA
  7. מתחילים את הבנייה באמצעות ה-CLI של gcloud או טריגרים של בנייה. כשמתחילים את הבנייה, צריך לציין את שם המאגר של Artifact Registry.

    כדי לציין את מאגר Artifact Registry כשמתחילים את ה-build באמצעות ה-CLI של gcloud:

    gcloud builds submit --region=us-west2 --config=cloudbuild.yaml \
        --substitutions=_AR_REPO_NAME="AR_REPO_NAME"
    

    מחליפים את AR_REPO_NAME בשם המאגר שלכם ב-Artifact Registry.

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

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