יצירת צינור עיבוד נתונים של CI/CD באמצעות Azure Pipelines ו-Compute Engine

Last reviewed 2023-03-09 UTC

במדריך הזה נסביר איך להשתמש ב-Azure Pipelines וב-Compute Engine כדי ליצור צינור עיבוד נתונים של אינטגרציה רציפה (CI) ופריסה רציפה (CD) לאפליקציית אינטרנט של ASP.NET MVC. האפליקציה משתמשת ב-Microsoft Internet Information Services ופועלת ב-Windows Server.

צינור עיבוד הנתונים של CI/CD משתמש בשתי סביבות נפרדות, אחת לבדיקה ואחת לייצור.

בתחילת הצינור, מפתחים מבצעים קומיט של שינויים בבסיס הקוד לדוגמה. הפעולה הזו מפעילה את צינור הנתונים כדי ליצור את האפליקציה, לארוז אותה כקובץ ZIP ולהעלות את קובץ ה-ZIP ל-Cloud Storage.

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

המדריך הזה מיועד למפתחים ולמהנדסי DevOps. ההנחה היא שיש לכם ידע בסיסי ב-NET Framework, ב-Windows Server, ב-IIS, ב-Azure Pipelines וב-Compute Engine. בנוסף, כדי לבצע את ההדרכה, צריכה להיות לכם הרשאת אדמין בחשבון Azure DevOps.

מטרות

  • משתמשים ב-Compute Engine Managed Instance Groups כדי להטמיע פריסות מתגלגלות.
  • מגדירים צינור עיבוד נתונים של CI/CD ב-Azure Pipelines כדי לתזמן את תהליכי הבנייה, היצירה והפריסה.

עלויות

במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:

כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.

משתמשים חדשים של Google Cloud ? יכול להיות שאתם זכאים לתקופת ניסיון בחינם.

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

כדאי לעיין בדף התמחור של Azure DevOps כדי לבדוק אם יש עמלות שחלות על השימוש ב-Azure DevOps.

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

בדרך כלל מומלץ להשתמש בפרויקטים נפרדים לעומסי עבודה של פיתוח וייצור, כדי שאפשר יהיה להעניק הרשאות ותפקידים בניהול זהויות והרשאות גישה (IAM) באופן נפרד. כדי לפשט את המדריך, נשתמש בפרויקט יחיד לסביבות הפיתוח והייצור.

  1. בדף לבחירת הפרויקט במסוף Google Cloud , בוחרים פרויקט ב- Google Cloud או יוצרים אותו.

    תפקידים שנדרשים כדי לבחור או ליצור פרויקט

    • Select a project: כדי לבחור פרויקט לא צריך תפקיד IAM ספציפי – אפשר לבחור כל פרויקט שקיבלתם בו תפקיד.
    • יצירת פרויקט: כדי ליצור פרויקט, צריך את התפקיד Project Creator (יצירת פרויקטים) (roles/resourcemanager.projectCreator), שכולל את ההרשאה resourcemanager.projects.create. איך מקצים תפקידים

    כניסה לדף לבחירת הפרויקט

  2. מפעילים את ממשקי ה-API של Compute Engine ו-Cloud Storage.

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

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

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

  3. מוודאים שהחיוב מופעל בפרויקט Google Cloud .

  4. מוודאים שיש לכם חשבון Azure DevOps ושיש לכם הרשאת אדמין בו. אם עדיין אין לכם חשבון ב-Azure DevOps, אתם יכולים להירשם בדף הבית של Azure DevOps.

יצירת פרויקט ב-Azure DevOps

אתם משתמשים ב-Azure DevOps כדי לנהל את קוד המקור, להריץ גרסאות build ובדיקות ולתזמן את הפריסה ב-Compute Engine. כדי להתחיל, יוצרים פרויקט בחשבון Azure DevOps.

  1. עוברים לדף הבית של Azure DevOps ‏(https://dev.azure.com/YOUR_AZURE_DEVOPS_ACCOUNT_NAME).
  2. לוחצים על פרויקט חדש.
  3. מזינים שם לפרויקט, למשל CloudDemo.
  4. מגדירים את Visibility (חשיפה) למצב Private (פרטי) ולוחצים על Create (יצירה).
  5. אחרי שיוצרים את הפרויקט, בתפריט שמימין לוחצים על Repos (מאגרי מידע).
  6. לוחצים על Import (ייבוא) כדי ליצור הסתעפות של מאגר dotnet-docs-samples מ-GitHub, ואז מגדירים את הערכים הבאים:
    • סוג המאגר: Git
    • כתובת ה-URL של השיבוט: https://github.com/GoogleCloudPlatform/dotnet-docs-samples.git
  7. לוחצים על Import.

    בסיום תהליך הייבוא, קוד המקור של מאגר dotnet-docs-samples מוצג.

  8. בתפריט, לוחצים על Repos > Branches.

  9. מעבירים את העכבר מעל הענף main. בצד שמאל יופיע הלחצן ....

  10. לוחצים על ... > הגדרה כענף ברירת מחדל.

גרסת Build רציפה

עכשיו אפשר להשתמש ב-Azure Pipelines כדי להגדיר צינור עיבוד נתונים לבנייה. לכל קומיט שנשלח למאגר Git,‏ Azure Pipelines בונה את הקוד, אורז אותו בקובץ ZIP ומפרסם את החבילה שנוצרת באחסון הפנימי של Azure Pipelines.

בהמשך, מגדירים צינור עיבוד נתונים להפצה שמשתמש בחבילות מאחסון Azure Pipelines ופורס אותן ב-Compute Engine.

יצירת הגדרת build

יוצרים הגדרת build חדשה ב-Azure Pipelines באמצעות תחביר YAML:

  1. באמצעות Visual Studio או לקוח git של שורת פקודה, משכפלים את ה-repository החדש של Git.
  2. בשורש המאגר, יוצרים קובץ בשם azure-pipelines.yml.
  3. מעתיקים את הקוד הבא ומדביקים אותו בקובץ:

    resources:
    - repo: self
      fetchDepth: 1
    trigger:
    - main
    variables:
      artifactName: 'CloudDemo.Mvc'
    jobs:
    - job: Build
      displayName: Build application
      condition: succeeded()
      pool:
        vmImage: windows-latest
        demands:
        - msbuild
        - visualstudio
      variables:
        Solution: 'applications/clouddemo/net4/CloudDemo.Mvc.sln'
        BuildPlatform: 'Any CPU'
        BuildConfiguration: 'Release'
        ArtifactName: 'CloudDemo.Web'
      steps:
      - task: NuGetCommand@2
        displayName: 'NuGet restore'
        inputs:
          restoreSolution: '$(Solution)'
      - task: VSBuild@1
        displayName: 'Build solution'
        inputs:
          solution: '$(Solution)'
          msbuildArgs: '/p:DeployOnBuild=true /p:WebPublishMethod=Package /p:PackageAsSingleFile=true /p:SkipInvalidConfigurations=true /p:PackageLocation="$(build.artifactstagingdirectory)\\"'
          platform: '$(BuildPlatform)'
          configuration: '$(BuildConfiguration)'
      - task: PublishBuildArtifacts@1
        displayName: 'Publish Artifact'
        inputs:
          PathtoPublish: '$(build.artifactstagingdirectory)/CloudDemo.Mvc.zip'
          ArtifactName: '$(ArtifactName)'
  4. שומרים את השינויים ודוחפים אותם אל Azure Pipelines.

    Visual Studio

    1. פותחים את Team Explorer ולוחצים על סמל דף הבית.
    2. לוחצים על שינויים.
    3. מזינים הודעת קומיט כמו Add pipeline definition.
    4. לוחצים על Commit All and Push (ביצוע Commit של הכול והעלאה).

    שורת הפקודה

    1. העברת כל הקבצים ששונו אל אזור ההכנה:

      git add -A
      
    2. שומרים את השינויים במאגר המקומי:

      git commit -m "Add pipeline definition"
      
    3. שולחים את השינויים ל-Azure DevOps:

      git push
      
  5. בתפריט Azure DevOps, בוחרים באפשרות Pipelines ואז לוחצים על Create Pipeline.

  6. בוחרים באפשרות Azure Repos Git.

  7. בוחרים את המאגר.

  8. בדף Review your pipeline YAML (בדיקת קובץ ה-YAML של צינור הנתונים), לוחצים על Run (הפעלה).

    מופעלת בנייה חדשה. יכול להיות שיחלפו כ-2 דקות עד שהבנייה תושלם. בסיום הבנייה, חבילת האפליקציה CloudDemo.Mvc.zip, שמכילה את כל הקבצים של אפליקציית האינטרנט, זמינה באזור האחסון הפנימי של Azure Pipelines.

פריסה רציפה

עכשיו, כש-Azure Pipelines יוצר באופן אוטומטי את הקוד שלכם לכל פעולת commit, אתם יכולים להתפנות לפריסה.

בניגוד למערכות אחרות של אינטגרציה רציפה (CI), ב-Azure Pipelines יש הבחנה בין בנייה לפריסה, והמערכת מספקת קבוצה מיוחדת של כלים שנקראת Release Management לכל המשימות שקשורות לפריסה.

הכלי Azure Pipelines Release Management מבוסס על המושגים הבאים:

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

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

  1. בשלב הראשון, הפייפליין לוקח את חבילת האפליקציה מאזור האחסון של Azure Pipelines artifact ומפרסם אותה בקטגוריה של Cloud Storage, כדי ש-Compute Engine יוכל לגשת לחבילה.
  2. בשלב השני, צינור הנתונים מעדכן את סביבת הפיתוח באמצעות עדכון הדרגתי.
  3. בשלב האחרון, אחרי האישור, צינור העברת הנתונים מעדכן את סביבת הייצור באמצעות עדכון מתגלגל.

יצירת קטגוריה של Cloud Storage עבור ארטיפקטים של בנייה

יוצרים קטגוריה של Cloud Storage לאחסון חבילות של אפליקציות. בהמשך, מגדירים את Compute Engine כך שמכונות וירטואליות חדשות יוכלו לשלוף באופן אוטומטי חבילות של אפליקציות מהקטגוריה הזו.

  1. במסוף Google Cloud , עוברים לפרויקט החדש שיצרתם.
  2. פותחים את Cloud Shell.

    כניסה ל-Cloud Shell

  3. כדי לחסוך זמן, כדאי להגדיר ערכי ברירת מחדל למזהה הפרויקט ולאזור Compute Engine:

    gcloud config set project PROJECT_ID
    gcloud config set compute/zone ZONE

    מחליפים את PROJECT_ID במזהה הפרויקט ב- Google Cloud , ואת ZONE בשם התחום (zone) שבו רוצים ליצור את המשאבים. אם אתם לא בטוחים באיזה אזור לבחור, השתמשו באפשרות us-central1-a.

    דוגמה:

    gcloud config set project devops-test-project-12345
    gcloud config set compute/zone us-central1-a
  4. יוצרים קטגוריה חדשה של Cloud Storage לחבילות אפליקציות:

    gcloud storage buckets create gs://$(gcloud config get-value core/project)-artifacts
    

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

הגדרה של חשבון שירות ל-Azure Pipelines

יוצרים Google Cloud חשבון שירות ש-Azure Pipelines יכול להשתמש בו כדי לגשת לפרויקט Google Cloud .

  1. יוצרים חשבון שירות ל-Azure Pipelines:

    AZURE_PIPELINES_SERVICE_ACCOUNT=$(gcloud iam service-accounts create azure-pipelines --format "value(email)")
    
  2. מקצים את תפקידי ה-IAM 'צפייה באובייקט אחסון' (roles/storage.objectViewer) ו'יצירת אובייקטים של אחסון' (roles/storage.objectCreator) לחשבון השירות azure-pipelines כדי ש-Azure Pipelines יוכל להעלות חבילות של אפליקציות ל-Cloud Storage:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/storage.objectViewer
    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/storage.objectCreator
    
  3. מקצים לחשבון השירות azure-pipelines את התפקיד אדמין Compute ‏ (roles/compute.admin) כדי ש-Azure Pipelines יוכל לנהל מכונות וירטואליות:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/compute.admin
    
  4. יוצרים מפתח לחשבון השירות:

    gcloud iam service-accounts keys create azure-pipelines-key.json \
      --iam-account=$AZURE_PIPELINES_SERVICE_ACCOUNT
    
    cat azure-pipelines-key.json | base64 -w 0;echo
    
    rm azure-pipelines-key.json
    

    תצטרכו את המפתח של חשבון השירות באחד מהשלבים הבאים.

הגדרת סביבת הפיתוח

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

  1. ב-Cloud Shell, יוצרים חשבון שירות לקבוצת מופעי מכונה מנוהלים:

    DEV_SERVICE_ACCOUNT=$(gcloud iam service-accounts create clouddemo-dev --format "value(email)")
    
  2. מקצים לחשבון השירות את התפקיד 'צפייה באובייקט אחסון' ב-IAM (roles/storage.objectViewer) כדי שמופעי מכונות וירטואליות יוכלו להוריד חבילות של אפליקציות מ-Cloud Storage:

    gcloud projects add-iam-policy-binding $(gcloud config get-value core/project) \
        --member serviceAccount:$DEV_SERVICE_ACCOUNT \
        --role roles/storage.objectViewer
    
  3. נותנים לחשבון השירות azure-pipelines הרשאה להשתמש בחשבון השירות clouddemo-dev:

    gcloud iam service-accounts add-iam-policy-binding $DEV_SERVICE_ACCOUNT \
        --member serviceAccount:$AZURE_PIPELINES_SERVICE_ACCOUNT \
        --role roles/iam.serviceAccountUser
    
  4. יוצרים תבנית של הגדרות מכונה שמשתמשת בקובץ אימג' רגיל של Windows Server 2019 Core. תשתמשו בתבנית הזו רק בהתחלה, כי כל בנייה תיצור תבנית חדשה.

    gcloud compute instance-templates create clouddemo-initial \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account $DEV_SERVICE_ACCOUNT \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend
    
  5. יצירת בדיקת תקינות HTTP. מכיוון שלאפליקציה אין נקודת קצה ייעודית לבדיקת תקינות, אפשר לשלוח שאילתה לנתיב /.

    gcloud compute http-health-checks create clouddemo-dev-http \
        --check-interval=10s --unhealthy-threshold=10 \
        --request-path=/
    
  6. יוצרים קבוצת מופעי מכונה מנוהלים שמבוססת על תבנית המכונה הראשונית. כדי לפשט את התהליך, הפקודות הבאות יוצרות קבוצה של מופעי מכונה מנוהלים באזור. עם זאת, אפשר להשתמש באותה גישה לקבוצות של מכונות מנוהלות ברמה אזורית שמפיצות מכונות וירטואליות ביותר מאזור זמינות אחד.

    gcloud compute instance-groups managed create clouddemo-dev \
        --template=clouddemo-initial \
        --http-health-check=clouddemo-dev-http \
        --initial-delay=2m \
        --size=1 && \
    gcloud compute instance-groups set-named-ports clouddemo-dev --named-ports http:80
    
  7. יוצרים שירות לקצה העורפי של מאזן עומסים שמשתמש בבדיקת תקינות HTTP ובקבוצת מופעי מכונה מנוהלים שיצרתם קודם:

    gcloud compute backend-services create clouddemo-dev-backend \
        --http-health-checks clouddemo-dev-http \
        --port-name http --protocol HTTP --global && \
    gcloud compute backend-services add-backend clouddemo-dev-backend \
        --instance-group clouddemo-dev --global \
        --instance-group-zone=$(gcloud config get-value compute/zone)
    
  8. יוצרים קצה קדמי של מאזן עומסים:

    gcloud compute url-maps create clouddemo-dev --default-service clouddemo-dev-backend && \
    gcloud compute target-http-proxies create clouddemo-dev-proxy --url-map=clouddemo-dev && \
    gcloud compute forwarding-rules create clouddemo-dev-fw-rule --global --target-http-proxy clouddemo-dev-proxy --ports=80
    
  9. יוצרים כלל חומת אש שמאפשר למאזן העומסים של Google לשלוח בקשות HTTP למופעים שסומנו בתג gclb-backend. בהמשך תפעילו את התג הזה על מכונות וירטואליות של שירותי אינטרנט.

    gcloud compute firewall-rules create gclb-backend --source-ranges=130.211.0.0/22,35.191.0.0/16 --target-tags=gclb-backend --allow tcp:80
    

הגדרת סביבת הייצור

הגדרת סביבת הייצור דורשת רצף של שלבים שדומים לאלה של הגדרת סביבת הפיתוח.

  1. ב-Cloud Shell, יוצרים בדיקת תקינות HTTP:

    gcloud compute http-health-checks create clouddemo-prod-http \
        --check-interval=10s --unhealthy-threshold=10 \
        --request-path=/
    
  2. יוצרים עוד קבוצת מופעי מכונה מנוהלים שמבוססת על תבנית של הגדרות מכונה הראשונית שיצרתם קודם:

    gcloud compute instance-groups managed create clouddemo-prod \
        --template=clouddemo-initial \
        --http-health-check=clouddemo-prod-http \
        --initial-delay=2m \
        --size=1 && \
    gcloud compute instance-groups set-named-ports clouddemo-prod --named-ports http:80
    
  3. יוצרים שירות לקצה העורפי של מאזן עומסים שמשתמש בבדיקת תקינות HTTP ובקבוצת מופעי מכונה מנוהלים שיצרתם קודם:

    gcloud compute backend-services create clouddemo-prod-backend --http-health-checks clouddemo-prod-http --port-name http --protocol HTTP --global && \
    gcloud compute backend-services add-backend clouddemo-prod-backend --instance-group clouddemo-prod --global --instance-group-zone=$(gcloud config get-value compute/zone)
    
  4. יוצרים קצה קדמי של מאזן עומסים:

    gcloud compute url-maps create clouddemo-prod --default-service clouddemo-prod-backend && \
    gcloud compute target-http-proxies create clouddemo-prod-proxy --url-map=clouddemo-prod && \
    gcloud compute forwarding-rules create clouddemo-prod-fw-rule --global --target-http-proxy clouddemo-prod-proxy --ports=80
    

הגדרת צינור עיבוד הנתונים להפצה

יצירת הגדרה חדשה של גרסה:

  1. בתפריט Azure DevOps, בוחרים באפשרות Pipelines > Releases.
  2. לוחצים על New pipeline (צינור חדש).
  3. ברשימת התבניות, בוחרים באפשרות Empty job (משימה ריקה).
  4. כשמתבקשים להזין שם לשלב, מזינים Publish.
  5. בחלק העליון של המסך, נותנים שם לגרסה clouddemo-ComputeEngine.
  6. בתרשים של צינור הנתונים, לצד Artifacts (פריטי מידע), לוחצים על Add (הוספה).
  7. לוחצים על Build (בנייה) ומוסיפים את ההגדרות הבאות:

    • מקור: בוחרים את מאגר ה-Git שמכיל את הקובץ azure-pipelines.yml.
    • גרסת ברירת מחדל: Latest
    • כינוי של המקור: CloudDemo.Web
  8. לוחצים על הוספה.

  9. בתיבה Artifact (ארטיפקט), לוחצים על Continuous deployment trigger (הסמל של חץ ברק) כדי להוסיף טריגר לפריסה.

  10. בקטע Continuous deployment trigger (טריגר לפריסה רציפה), מעבירים את המתג למצב Enabled (מופעל).

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

  12. אם רוצים, כותבים תגובה ומאשרים בלחיצה על אישור.

עכשיו צינור המכירות נראה כך:

צילום מסך של צינור העיבוד ב-Azure Pipelines

פרסום ב-Cloud Storage

אחרי שיצרתם את הגדרת הגרסה, אתם יכולים להוסיף את השלבים לפרסום חבילת האפליקציה ב-Cloud Storage.

  1. ב-Azure Pipelines, עוברים לכרטיסייה Tasks (משימות).
  2. לוחצים על Agent job ומגדירים את ההגדרות הבאות:
    • מאגר סוכנים: Azure Pipelines
    • Agent specification: ubuntu-latest
  3. לצד Agent job, לוחצים על Add a task to agent job .
  4. בוחרים את משימת bash ולוחצים על הוספה.
  5. לוחצים על המשימה שנוספה ומגדירים את ההגדרות הבאות:

    • שם לתצוגה: Publish to Cloud Storage
    • Type: inline
    • סקריפט:

      cat << "EOF" > CloudDemo.Mvc.deploy.ps1
          $ErrorActionPreference = "Stop"
      
          # Download application package from Cloud Storage
          gcloud storage cp gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).zip $env:TEMP\app.zip
      
          # Install IIS
          Enable-WindowsOptionalFeature -Online -FeatureName `
              NetFx4Extended-ASPNET45, `
              IIS-WebServerRole, `
              IIS-WebServer, `
              IIS-CommonHttpFeatures, `
              IIS-HttpErrors, `
              IIS-HttpRedirect, `
              IIS-ApplicationDevelopment, `
              IIS-HealthAndDiagnostics, `
              IIS-HttpLogging, `
              IIS-LoggingLibraries, `
              IIS-RequestMonitor, `
              IIS-HttpTracing, `
              IIS-Security, `
              IIS-RequestFiltering, `
              IIS-Performance, `
              IIS-WebServerManagementTools, `
              IIS-IIS6ManagementCompatibility, `
              IIS-Metabase, `
              IIS-DefaultDocument, `
              IIS-ApplicationInit, `
              IIS-NetFxExtensibility45, `
              IIS-ISAPIExtensions, `
              IIS-ISAPIFilter, `
              IIS-ASPNET45, `
              IIS-HttpCompressionStatic
      
          # Extract application package to wwwroot
          New-Item -ItemType directory -Path $env:TEMP\app
          Add-Type -AssemblyName System.IO.Compression.FileSystem
          [System.IO.Compression.ZipFile]::ExtractToDirectory("$env:TEMP\app.zip", "$env:TEMP\app")
          Remove-Item $env:TEMP\app.zip
          Move-Item -Path $(dir -recurse $env:TEMP\app\**\PackageTmp | % { $_.FullName }) -Destination c:\inetpub\wwwroot\app -force
      
          # Configure IIS web application pool and application
          Import-Module WebAdministration
          New-WebAppPool clouddemo-net4
          Set-ItemProperty IIS:\AppPools\clouddemo-net4 managedRuntimeVersion v4.0
          New-WebApplication -Name clouddemo -Site 'Default Web Site' -PhysicalPath c:\inetpub\wwwroot\app -ApplicationPool clouddemo-net4
      
          # Grant read/execute access to the application pool user
          &icacls C:\inetpub\wwwroot\app\ /grant "IIS AppPool\clouddemo-net4:(OI)(CI)(RX)"
      EOF
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud storage cp $(System.ArtifactsDirectory)/CloudDemo.Web/CloudDemo.Web/CloudDemo.Mvc.zip gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).zip
      gcloud storage cp CloudDemo.Mvc.deploy.ps1 gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1
      

    הסקריפט הזה מבצע את הפעולות הבאות:

    1. יוצר סקריפט לטעינה בזמן ההפעלה שמגדיר את IIS.
    2. מגדירה את Google Cloud CLI כך שישתמש במפתח של חשבון השירות מתוך משתנה הסביבה כדי לבצע אימות ל- Google Cloud.
    3. העלאה של חבילת האפליקציה ושל סקריפט לטעינה בזמן ההפעלה ל-Cloud Storage.
  6. עוברים לכרטיסייה משתנים ומוסיפים את המשתנים הבאים.

    שם ערך Secret
    ServiceAccountKey נוצר מפתח לחשבון השירות azure-pipelines-deployer קודם לכן. כן
    CloudDemo.ProjectId מזהה הפרויקט של Google Cloud הפרויקט.
    CloudDemo.Zone האזור שציינתם קודם כשמריצים את gcloud config set compute/zone (לדוגמה, us-central1-a)
  7. לוחצים על Save.

  8. אם רוצים, כותבים תגובה ומאשרים בלחיצה על אישור.

פריסת סביבת הפיתוח

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

  1. ב-Azure Pipelines, עוברים לכרטיסייה Pipeline.
  2. בתיבה שלבים, בוחרים באפשרות הוספה > שלב חדש.
  3. ברשימת התבניות, בוחרים באפשרות Empty job (משימה ריקה).
  4. כשמתבקשים להזין שם לשלב, מזינים Dev.
  5. לוחצים על סמל הברק של השלב החדש שנוצר.
  6. מגדירים את ההגדרות הבאות:

    • Select trigger (בחירת טריגר): After stage
    • שלבים: Publish
  7. מעבירים את העכבר מעל הכרטיסייה משימות ולוחצים על משימות > פיתוח.

  8. לוחצים על Agent job ומגדירים את ההגדרות הבאות:

    • מאגר סוכנים: Azure Pipelines
    • Agent specification: ubuntu-latest
  9. לצד Agent job, לוחצים על Add a task to agent job .

  10. בוחרים את משימת bash ולוחצים על הוספה.

  11. לוחצים על המשימה שנוספה ומגדירים את ההגדרות הבאות:

    • שם לתצוגה: Rolling deploy
    • Type: inline
    • סקריפט:

      INSTANCE_TEMPLATE=clouddemo-$(Build.BuildId)-$(Release.ReleaseId)
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud compute instance-templates create $INSTANCE_TEMPLATE \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account clouddemo-dev@$(CloudDemo.ProjectId).iam.gserviceaccount.com \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend \
        --metadata sysprep-specialize-script-url=gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1 \
        --project $(CloudDemo.ProjectId) \
      
      gcloud compute instance-groups managed set-instance-template clouddemo-dev \
        --template $INSTANCE_TEMPLATE \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
      gcloud compute instance-groups managed rolling-action start-update clouddemo-dev \
        --version template=$INSTANCE_TEMPLATE \
        --type proactive \
        --max-unavailable 0 \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      

    הסקריפט הזה מבצע את הפעולות הבאות:

    1. מגדירה את Google Cloud CLI כך שישתמש במפתח של חשבון השירות מתוך משתנה הסביבה כדי לבצע אימות ל- Google Cloud.
    2. יוצר תבנית חדשה של הגדרות מכונה שמשתמשת בסקריפט ההפעלה שנוצר בשלב הקודם.
    3. מעדכנים את קבוצת המופעים הקיימת כך שתשתמש בתבנית החדשה של המופעים. הערה: הפקודה הזו לא גורמת עדיין להחלפה או לעדכון של אף אחת מהמכונות הווירטואליות הקיימות. במקום זאת, הוא מוודא שכל מכונות ה-VM העתידיות בקבוצת המופעים הזו ייצרו מהתבנית החדשה.
    4. מתחילים עדכון בהדרגה (rolling), שגורם לקבוצת המכונות הקיימת להחליף מכונות וירטואליות קיימות במכונות וירטואליות חדשות, באופן מתגלגל.
  12. לוחצים על Save.

  13. אם רוצים, כותבים הערה ומאשרים בלחיצה על אישור.

פריסת סביבת הייצור

לבסוף, צריך להגדיר את הפריסה בסביבת הייצור.

  1. ב-Azure Pipelines, עוברים לכרטיסייה Pipeline.
  2. בתיבה שלבים, בוחרים באפשרות הוספה > שלב חדש.
  3. ברשימת התבניות, בוחרים באפשרות Empty job (משימה ריקה).
  4. כשמתבקשים להזין שם לשלב, מזינים Prod.
  5. לוחצים על סמל הברק של השלב החדש שנוצר.
  6. מגדירים את ההגדרות הבאות:

    • Select trigger (בחירת טריגר): After stage
    • שלבים: Dev
    • אישורים לפני פריסה: (מופעל)
    • מאשרים: בוחרים את שם המשתמש שלכם.
  7. מעבירים את העכבר מעל הכרטיסייה משימות ולוחצים על משימות > Prod.

  8. לוחצים על Agent job ומגדירים את ההגדרות הבאות:

    • מאגר סוכנים: Azure Pipelines
    • Agent specification: ubuntu-latest
  9. לצד Agent job, לוחצים על Add a task to agent job כדי להוסיף שלב לשלב.

  10. בוחרים את משימת bash ולוחצים על הוספה.

  11. לוחצים על המשימה שנוספה ומגדירים את ההגדרות הבאות:

    • שם לתצוגה: Rolling deploy
    • Type: inline
    • סקריפט:

      INSTANCE_TEMPLATE=clouddemo-$(Build.BuildId)-$(Release.ReleaseId)
      
      gcloud auth activate-service-account \
          --quiet \
          --key-file <(echo $(ServiceAccountKey) | base64 -d)
      
      gcloud compute instance-templates create $INSTANCE_TEMPLATE \
        --machine-type n1-standard-2 \
        --image-family windows-2019-core \
        --image-project windows-cloud \
        --service-account clouddemo-prod@$(CloudDemo.ProjectId).iam.gserviceaccount.com \
        --scopes https://www.googleapis.com/auth/devstorage.read_only \
        --tags gclb-backend \
        --metadata sysprep-specialize-script-url=gs://$(CloudDemo.ProjectId)-artifacts/CloudDemo.Mvc-$(Build.BuildId)-$(Release.ReleaseId).deploy.ps1 \
        --project $(CloudDemo.ProjectId) \
      
      gcloud compute instance-groups managed set-instance-template clouddemo-prod \
        --template $INSTANCE_TEMPLATE \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
      gcloud compute instance-groups managed rolling-action start-update clouddemo-prod \
        --version template=$INSTANCE_TEMPLATE \
        --type proactive \
        --max-unavailable 0 \
        --project $(CloudDemo.ProjectId) \
        --zone $(CloudDemo.Zone)
      
  12. לוחצים על Save.

  13. אם רוצים, כותבים הערה ומאשרים בלחיצה על אישור.

הרצת צינור עיבוד הנתונים

אחרי שהגדרתם את כל צינור העיבוד, אתם יכולים לבדוק אותו על ידי ביצוע שינוי בקוד המקור:

  1. במחשב המקומי, פותחים את הקובץ applications\clouddemo\net4\CloudDemo.Mvc\Views\Home\Index.cshtml ממאגר Git ששיבטתם קודם.
  2. הערך של ViewBag.Title השתנה מ-Home Page ל-This app runs on GKE.
  3. שומרים את השינויים ודוחפים אותם אל Azure Pipelines.

    Visual Studio

    1. פותחים את Team Explorer ולוחצים על סמל דף הבית.
    2. לוחצים על שינויים.
    3. מזינים הודעת קומיט כמו Change site title.
    4. לוחצים על Commit All and Push (ביצוע Commit של הכול והעלאה).

    שורת הפקודה

    1. העברת כל הקבצים ששונו אל אזור ההכנה:

      git add -A
      
    2. שומרים את השינויים במאגר המקומי:

      git commit -m "Change site title"
      
    3. שליחת השינויים אל Azure Pipelines:

      git push
      
  4. בתפריט Azure DevOps, בוחרים באפשרות Pipelines (צינורות).

    מופעל build.

  5. אחרי שהבנייה מסתיימת, בוחרים באפשרות Pipelines > Releases. A מתחיל תהליך פרסום.

  6. לוחצים על Release-1 כדי לפתוח את דף הפרטים, ומחכים שהסטטוס של שלב הפיתוח ישתנה להצלחה.

  7. במסוף Google Cloud , בוחרים באפשרות Network Services (שירותי רשת) > Load balancing (איזון עומסים) > clouddemo-dev.

    שימו לב לכתובת ה-IP של חזית האתר.

  8. פותחים חלון חדש בדפדפן ועוברים לכתובת הבאה:

    http://IP_ADDRESS/clouddemo/
    

    כאשר IP_ADDRESS היא כתובת ה-IP של חזית האתר.

    שימו לב שהאפליקציה נפרסה ושהיא משתמשת בכותרת המותאמת אישית.

    יכול להיות שתראו שגיאה בהתחלה כי מאזן העומסים יהיה זמין רק אחרי כמה דקות.

  9. ב-Azure Pipelines, לוחצים על הלחצן Approve (אישור) שנמצא מתחת לשלב Prod (ייצור) כדי להעביר את הפריסה לסביבת הייצור.

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

  10. אם רוצים, כותבים תגובה ואז לוחצים על אישור.

  11. מחכים שהסטטוס של סביבת הייצור ישתנה להצלחה.

  12. במסוף Google Cloud , בוחרים באפשרות Network Services > Load balancing > clouddemo-prod.

    שימו לב לכתובת ה-IP של חזית האתר.

  13. פותחים חלון חדש בדפדפן ועוברים לכתובת הבאה:

    http://IP_ADDRESS/clouddemo/
    

    כאשר IP_ADDRESS היא כתובת ה-IP של חזית האתר.

    שימו לב שהאפליקציה נפרסה ושהיא משתמשת בכותרת המותאמת אישית.

הסרת המשאבים

כדי להימנע מחיובים נוספים אחרי שתסיימו את המדריך הזה, מומלץ למחוק את הישויות שיצרתם.

מחיקת הפרויקט ב-Azure Pipelines

כדי למחוק את פרויקט Azure Pipelines, אפשר לעיין במסמכי Azure DevOps Services. מחיקת הפרויקט ב-Azure Pipelines תגרום לאובדן של כל השינויים בקוד המקור.

מחיקת הפרויקטים Google Cloud של הפיתוח והייצור

  1. במסוף Google Cloud , נכנסים לדף Manage resources.

    כניסה לדף Manage resources

  2. ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
  3. כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.

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