בדף הזה מוסבר איך ליצור צינור עיבוד נתונים לאינטגרציה רציפה ופיתוח רציף (CI/CD) ב- Google Cloud באמצעות מוצרים מתארחים בלבד והשיטה הפופולרית GitOps.
מהנדסי Google מאחסנים קובצי הגדרה ופריסה במאגר קודי המקור הראשי שלנו כבר הרבה זמן. המתודולוגיה הזו מתוארת בספר Site Reliability Engineering, Chapter 8 (Beyer et. al., 2016), והוצג על ידי קלסי הייטאואר במהלך הנאום המרכזי שלו ב-Google Cloud Next '17.
חלק מרכזי ב-GitOps הוא הרעיון של 'סביבות כקוד': תיאור הפריסות באופן הצהרתי באמצעות קבצים (לדוגמה, מניפסטים של Kubernetes) שמאוחסנים במאגר Git.
במדריך הזה יוצרים פייפליין של CI/CD שמבצע באופן אוטומטי את הפעולות הבאות: בניית קובץ אימג' של קונטיינר מקוד מחויב, אחסון התמונה ב-Artifact Registry, עדכון מניפסט של Kubernetes במאגר Git ופריסת האפליקציה ב-Google Kubernetes Engine (GKE) באמצעות המניפסט הזה.
במדריך הזה נשתמש בשני מאגרי Git:
- מאגר האפליקציות: מכיל את קוד המקור של האפליקציה עצמה
- env repository: מכיל את המניפסטים של Kubernetes Deployment
כשמעבירים בדחיפה שינוי למאגר האפליקציה, צינור הנתונים של Cloud Build מריץ בדיקות, יוצר קובץ אימג' בקונטיינר ומעביר אותו בדחיפה ל-Artifact Registry. אחרי שמעבירים בדחיפה את קובץ האימג', Cloud Build מעדכן את מניפסט הפריסה ומעביר אותו בדחיפה למאגר env. הפעולה הזו מפעילה צינור עיבוד נתונים נוסף של Cloud Build שמחיל את המניפסט על אשכול GKE, ואם הפעולה מצליחה, מאחסן את המניפסט בענף אחר של מאגר env.
אנחנו שומרים את מאגרי האפליקציות והסביבות בנפרד כי יש להם מחזורי חיים ושימושים שונים. המשתמשים העיקריים במאגר האפליקציה הם בני אדם, והמאגר הזה מוקדש לאפליקציה ספציפית. המשתמשים העיקריים במאגר env הם מערכות אוטומטיות (כמו Cloud Build), ויכול להיות שמאגר זה משותף לכמה אפליקציות. מאגר env יכול לכלול כמה ענפים, שכל אחד מהם ממופה לסביבה ספציפית (במדריך הזה משתמשים רק בסביבת הייצור) ומפנה לקובץ אימג' של קונטיינר ספציפי, בעוד שמאגר app לא יכול לכלול כמה ענפים.
בסיום המדריך הזה, תהיה לכם מערכת שבה תוכלו בקלות:
- כדי להבחין בין פריסות שנכשלו לבין פריסות שהצליחו, אפשר לעיין בהיסטוריה של Cloud Build.
- כדי לגשת למניפסט שבו נעשה שימוש כרגע, צריך לעיין בענף production במאגר env,
- אפשר לחזור לכל גרסה קודמת על ידי הפעלה מחדש של גרסת ה-build המתאימה ב-Cloud Build.
מידע על המדריך הזה
במדריך הזה נעשה שימוש ב-Cloud Source Repositories לאירוח מאגרי Git, אבל אפשר להשיג את אותן תוצאות גם באמצעות מוצרים אחרים של צד שלישי, כמו GitHub, Bitbucket או GitLab.
בצינור הזה לא מיושם מנגנון אימות לפני הפריסה. אם אתם משתמשים ב-GitHub, ב-Bitbucket או ב-GitLab, אתם יכולים לשנות את הצינור כדי להשתמש בבקשת משיכה למטרה הזו.
מומלץ להשתמש ב-Spinnaker אם רוצים להטמיע דפוסי פריסה מתקדמים (כחול/ירוק, ניתוח קנרי, ריבוי עננים וכו'), אבל יכול להיות שאין צורך בתכונות האלה כדי ליצור אסטרטגיית CI/CD מוצלחת בארגונים ובפרויקטים קטנים יותר. במדריך הזה נסביר איך ליצור צינור עיבוד נתונים של CI/CD שמתאים לאפליקציות שמארחות ב-GKE באמצעות כלי פיתוח.
כדי לפשט את המדריך, השתמשנו בסביבה אחת – סביבת הייצור – במאגר env, אבל אפשר להרחיב את ההגדרה כך שתתבצע פריסה לכמה סביבות אם צריך.
מטרות
- יוצרים מאגרי Git ב-Cloud Source Repositories.
- יצירת קובץ אימג' של קונטיינר באמצעות Cloud Build ואחסון שלו ב-Artifact Registry.
- יוצרים צינור CI.
- יצירת צינור עיבוד נתונים של CD.
- בודקים את צינור ה-CI/CD.
עלויות
במסמך הזה משתמשים ברכיבים הבאים של Google Cloud, והשימוש בהם כרוך בתשלום:
כדי להעריך את ההוצאות בהתאם לתחזית השימוש שלכם, אתם יכולים להיעזר במחשבון העלויות.
כשמסיימים את המשימות שמתוארות במסמך הזה אפשר למחוק את המשאבים שיצרתם כדי להימנע מחיובים נוספים. מידע נוסף זמין בקטע הסרת המשאבים.
לפני שמתחילים
בוחרים או יוצרים Google Cloud פרויקט.
מפעילים את החיוב בפרויקט.
פותחים את Cloud Shell כדי להריץ את הפקודות שמפורטות במדריך הזה. Cloud Shell היא סביבת מעטפת אינטראקטיבית של Google Cloud שמאפשרת לכם לנהל את הפרויקטים והמשאבים שלכם מדפדפן האינטרנט.
אם הפקודה
gcloud config get-value projectלא מחזירה את המזהה של הפרויקט שבחרתם, צריך להגדיר את Cloud Shell לשימוש בפרויקט.gcloud config set project [PROJECT_ID]
ב-Cloud Shell, מפעילים את ממשקי ה-API הנדרשים.
gcloud services enable container.googleapis.com \ cloudbuild.googleapis.com \ sourcerepo.googleapis.com \ artifactregistry.googleapis.comיוצרים מאגר Docker ב-Artifact Registry בשם
my-repositoryבאזורus-central1כדי לאחסן את קובצי האימג' של הקונטיינרים.gcloud artifacts repositories create my-repository \ --repository-format=docker \ --location=us-central1ב-Cloud Shell, יוצרים אשכול GKE שבו תשתמשו כדי לפרוס את האפליקציה לדוגמה של המדריך הזה.
טייס אוטומטי
יוצרים אשכול Autopilot בשם
hello-cloudbuild:gcloud container clusters create-auto hello-cloudbuild \ --location us-central1רגילה
יוצרים אשכול רגיל עם צומת אחד בשם
hello-cloudbuild:gcloud container clusters create hello-cloudbuild \ --num-nodes 1 --location us-central1אם עדיין לא השתמשתם ב-Git ב-Cloud Shell, תצטרכו להגדיר את Git עם השם וכתובת האימייל שלכם. הפרטים האלה ישמשו את Git לזיהוי כשאתם יוצרים התחייבויות ב-Cloud Shell.
git config --global user.email "YOUR_EMAIL_ADDRESS" git config --global user.name "YOUR_NAME"
כדי להימנע מחיובים נוספים אחרי שסיימתם את המדריך, תוכלו למחוק את המשאבים שיצרתם. פרטים נוספים מופיעים במאמר בנושא הסרת המשאבים.
יצירת מאגרי Git ב-Cloud Source Repositories
בקטע הזה יוצרים את שני מאגרי ה-Git (app ו-env) שבהם נעשה שימוש במדריך הזה, ומפעילים את מאגר app עם קוד לדוגמה.
יוצרים את שני מאגרי ה-Git ב-Cloud Shell.
gcloud source repos create hello-cloudbuild-app gcloud source repos create hello-cloudbuild-env
משכפלים את הקוד לדוגמה מ-GitHub.
cd ~ git clone https://github.com/GoogleCloudPlatform/kubernetes-engine-samples cd ~/kubernetes-engine-samples/management/gitops-style-delivery/
הגדרת Cloud Source Repositories כמיקום מרוחק.
PROJECT_ID=$(gcloud config get-value project) git remote add google \ "https://source.developers.google.com/p/${PROJECT_ID}/r/hello-cloudbuild-app"
הקוד ששיבטתם מכיל אפליקציית Hello World.
יצירת קובץ אימג' של קונטיינר באמצעות Cloud Build
הקוד ששיבטתם מכיל את קובץ ה-Dockerfile הבא.
בעזרת קובץ Dockerfile הזה, אפשר ליצור קובץ אימג' של קונטיינר באמצעות Cloud Build ולאחסן אותו ב-Artifact Registry.
ב-Cloud Shell, יוצרים גרסת build של Cloud Build על סמך הקומיט האחרון באמצעות הפקודה הבאה.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ COMMIT_ID="$(git rev-parse --short=7 HEAD)" gcloud builds submit --tag="us-central1-docker.pkg.dev/${PROJECT_ID}/my-repository/hello-cloudbuild:${COMMIT_ID}" .כשמריצים את הפקודה הזו, Cloud Build מעביר בסטרימינג את היומנים שנוצרו במהלך יצירת קובץ האימג' של הקונטיינר למסוף.
אחרי שגרסת ה-build מסתיימת, מוודאים שקובץ אימג' של קונטיינר חדש זמין ב-Artifact Registry.

יצירת צינור עיבוד נתונים של אינטגרציה רציפה
בקטע הזה מגדירים את Cloud Build כך שיריץ באופן אוטומטי בדיקת יחידה קטנה, ייצור את קובץ האימג' של הקונטיינר ואז יעביר אותו בדחיפה ל-Artifact Registry. העברת קומיט חדש אל Cloud Source Repositories מפעילה את צינור העברת הנתונים הזה באופן אוטומטי. קובץ cloudbuild.yaml שכלול בקוד הוא ההגדרה של צינור עיבוד הנתונים.
פותחים את הדף Triggers (טריגרים) של Cloud Build.
לוחצים על Create trigger (יצירת ביטוי להפעלה).
ממלאים את האפשרויות הבאות:
- בשדה שם, מקלידים
hello-cloudbuild. - בקטע Event, בוחרים באפשרות Push to a branch.
- בקטע Source, בוחרים באפשרות
hello-cloudbuild-appבתור Repository ובאפשרות^master$בתור Branch. - בקטע תצורת build, בוחרים באפשרות Cloud Build configuration file.
- בשדה Cloud Build configuration file location, מקלידים
cloudbuild.yamlאחרי/.
- בשדה שם, מקלידים
לוחצים על יצירה כדי לשמור את טריגר לפיתוח גרסת Build.
טיפ: אם אתם צריכים ליצור טריגרים של Build עבור הרבה פרויקטים, אתם יכולים להשתמש ב-Build Triggers API.
ב-Cloud Shell, מעבירים בדחיפה את קוד האפליקציה אל Cloud Source Repositories כדי להפעיל את צינור ה-CI ב-Cloud Build.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git push google master
פותחים את מסוף Cloud Build.
יופיעו הגרסאות האחרונות שהרצתם וסיימתם. אפשר ללחוץ על build כדי לעקוב אחרי ההרצה שלו ולבדוק את היומנים שלו.
יצירת צינור עיבוד הנתונים לפיתוח רציף
משתמשים ב-Cloud Build גם לצינור העיבוד של פיתוח רציף (CD). הצינור מופעל בכל פעם ששולחים commit לענף candidate במאגר hello-cloudbuild-env. תהליך הצינור מחיל את הגרסה החדשה של המניפסט על אשכול Kubernetes, ואם הפעולה מצליחה, מעתיק את המניפסט אל הענף production. לתהליך הזה יש את המאפיינים הבאים:
- הסתעפות candidate היא היסטוריה של ניסיונות הפריסה.
- הסתעפות הייצור היא היסטוריה של הפריסות שבוצעו בהצלחה.
- אתם יכולים לראות את הפריסות שבוצעו בהצלחה ואת הפריסות שנכשלו ב-Cloud Build.
- אפשר לחזור לכל פריסה קודמת על ידי הפעלה מחדש של ה-build המתאים ב-Cloud Build. בנוסף, ביצוע Rollback מעדכן את הענף production כדי לשקף באופן מדויק את היסטוריית הפריסות.
תשנו את צינור עיבוד הנתונים של האינטגרציה הרציפה כדי לעדכן את ענף המועמד של מאגר hello-cloudbuild-env, וכך תפעילו את צינור עיבוד הנתונים של הפיתוח הרציף.
מתן גישה ל-Cloud Build ל-GKE
כדי לפרוס את האפליקציה באשכול Kubernetes, ל-Cloud Build צריך להיות תפקיד ניהול זהויות והרשאות גישה של מפתח Kubernetes Engine.
מעטפת
ב-Cloud Shell, מריצים את הפקודה הבאה:
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} --format='get(projectNumber)')"
gcloud projects add-iam-policy-binding ${PROJECT_NUMBER} \
--member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \
--role=roles/container.developer
המסוף
-
במסוף Google Cloud , עוברים לדף settings GKE Permissions:
מגדירים את הסטטוס של התפקיד Kubernetes Engine Developer לEnable (הפעלה).
אתחול המאגר hello-cloudbuild-env
צריך לאתחל את מאגר hello-cloudbuild-env עם שני ענפים (production ו-candidate) וקובץ הגדרות של Cloud Build שמתאר את תהליך הפריסה.
ב-Cloud Shell, משכפלים את המאגר hello-cloudbuild-env ויוצרים את הענף production.
cd ~ gcloud source repos clone hello-cloudbuild-env cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git checkout -b production
מעתיקים את הקובץ
cloudbuild-delivery.yamlשזמין במאגר hello-cloudbuild-app ושומרים את השינוי.cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ cp ~/hello-cloudbuild-app/cloudbuild-delivery.yaml ~/kubernetes-engine-samples/management/gitops-style-delivery/cloudbuild.yaml git add . git commit -m "Create cloudbuild.yaml for deployment"
בקובץ
cloudbuild-delivery.yamlמתואר תהליך הפריסה שיופעל ב-Cloud Build. התהליך כולל שני שלבים:Cloud Build מחיל את המניפסט על אשכול GKE.
אם הפעולה תצליח, Cloud Build יעתיק את המניפסט אל ההסתעפות production.
יוצרים ענף מועמד ומעבירים בדחיפה את שני הענפים כדי שהם יהיו זמינים ב-Cloud Source Repositories.
git checkout -b candidate git push origin production git push origin candidate
מקצים לחשבון השירות של Cloud Build את התפקיד Source Repository Writer (כתיבה במאגר קוד) ב-IAM עבור מאגר הקוד hello-cloudbuild-env.
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" cat >/tmp/hello-cloudbuild-env-policy.yaml <<EOF bindings: - members: - serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com role: roles/source.writer EOF gcloud source repos set-iam-policy \ hello-cloudbuild-env /tmp/hello-cloudbuild-env-policy.yaml
יצירת הטריגר לצינור העברת נתונים רציפה
בקטע הזה, מגדירים את Cloud Build כך שיופעל על ידי פעולת push להסתעפות candidate במאגר hello-cloudbuild-env.
פותחים את הדף Triggers של Cloud Build.
לוחצים על Create trigger (יצירת ביטוי להפעלה).
ממלאים את האפשרויות הבאות:
- בשדה שם, מקלידים
hello-cloudbuild-deploy. - בקטע Event, בוחרים באפשרות Push to a branch.
- בקטע Source, בוחרים באפשרות
hello-cloudbuild-envבתור Repository ובאפשרות^candidate$בתור Branch. - בקטע Configuration, בוחרים באפשרות Cloud Build configuration file (yaml or json).
- בשדה Cloud Build configuration file location, מקלידים
cloudbuild.yamlאחרי/.
- בשדה שם, מקלידים
לוחצים על יצירה.
שינוי צינור עיבוד הנתונים של האינטגרציה הרציפה כדי להפעיל את צינור עיבוד הנתונים של הפיתוח הרציף
בסעיף הזה מוסיפים כמה שלבים לפייפליין של אינטגרציה רציפה שיוצר גרסה חדשה של מניפסט Kubernetes ומעלה אותה למאגר hello-cloudbuild-env כדי להפעיל את פייפליין הפיתוח הרציף.
מחליפים את הקובץ
cloudbuild.yamlבדוגמה המורחבת בקובץcloudbuild-trigger-cd.yaml.cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ cp cloudbuild-trigger-cd.yaml cloudbuild.yaml
קובץ
cloudbuild-trigger-cd.yamlהוא גרסה מורחבת של קובץcloudbuild.yaml. הוא מוסיף שלבים ליצירת מניפסט Kubernetes חדש ולהפעלת צינור העברת הנתונים הרציפה.שומרים את השינויים ושולחים אותם אל Cloud Source Repositories.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ git add cloudbuild.yaml git commit -m "Trigger CD pipeline" git push google master
הפעולה הזו מפעילה את צינור עיבוד הנתונים של האינטגרציה הרציפה ב-Cloud Build.
בודקים את ה-build של האינטגרציה הרציפה.
מופיעים ה-builds שהרצתם לאחרונה והסתיימו במאגר hello-cloudbuild-app. אפשר ללחוץ על build כדי לעקוב אחרי ההרצה שלו ולבדוק את היומנים שלו. בשלב האחרון של צינור העיבוד הזה, המניפסט החדש נדחף למאגר hello-cloudbuild-env, וזה מפעיל את צינור העיבוד של הפיתוח הרציף.
בודקים את ה-build של הפיתוח הרציף.
מופיעים ה-builds שהרצתם לאחרונה והסתיימו במאגר hello-cloudbuild-env. אפשר ללחוץ על build כדי לעקוב אחרי ההרצה שלו ולבדוק את היומנים שלו.
בדיקת צינור עיבוד הנתונים המלא
צינור עיבוד הנתונים המלא של CI/CD מוגדר עכשיו. בקטע הזה, תבדקו את התהליך מקצה לקצה.
עוברים לדף GKE Services.
מעבר אל Google Kubernetes Engine Services
הרשימה מכילה שירות יחיד בשם hello-cloudbuild שנוצר על ידי build של פיתוח רציף שהושלם לאחרונה.
לוחצים על נקודת הקצה של השירות hello-cloudbuild. מופיע הטקסט Hello World!. אם אין נקודת קצה או שמופיעה שגיאה במאזן העומסים, יכול להיות שתצטרכו להמתין כמה דקות עד שמאזן העומסים יאותחל באופן מלא. אם צריך, לוחצים על רענון כדי לעדכן את הדף.
ב-Cloud Shell, מחליפים את Hello World ב-Hello Cloud Build, גם באפליקציה וגם בבדיקת היחידה.
cd ~/kubernetes-engine-samples/management/gitops-style-delivery/ sed -i 's/Hello World/Hello Cloud Build/g' app.py sed -i 's/Hello World/Hello Cloud Build/g' test_app.py
שומרים ודוחפים את השינוי ל-Cloud Source Repositories.
git add app.py test_app.py git commit -m "Hello Cloud Build" git push google master
הפעולה הזו מפעילה את צינור עיבוד הנתונים המלא של CI/CD.
אחרי כמה דקות, טוענים מחדש את האפליקציה בדפדפן. מופיע הכיתוב Hello Cloud Build!.
בדיקת החזרה למצב הקודם
בקטע הזה, מבצעים חזרה לגרסה של האפליקציה שבה מופיע הכיתוב Hello World!.
פותחים את מסוף Cloud Build למאגר hello-cloudbuild-env.
לוחצים על ה-build השני הכי עדכני שזמין.
לוחצים על Rebuild.
בסיום ה-build, טוענים מחדש את האפליקציה בדפדפן. הטקסט 'Hello World!' מופיע שוב.
הסרת המשאבים
כדי להימנע מחיובים בחשבון Google Cloud בגלל השימוש במשאבים שנעשה במסגרת המדריך הזה, אפשר למחוק את הפרויקט שמכיל את המשאבים, או להשאיר את הפרויקט ולמחוק את המשאבים בנפרד.
- במסוף Google Cloud , נכנסים לדף Manage resources.
- ברשימת הפרויקטים, בוחרים את הפרויקט שרוצים למחוק ולוחצים על Delete.
- כדי למחוק את הפרויקט, כותבים את מזהה הפרויקט בתיבת הדו-שיח ולוחצים על Shut down.
מחיקת המשאבים
אם רוצים לשמור את Google Cloud הפרויקט שבו השתמשתם במדריך הזה, צריך למחוק את המשאבים הבודדים:
מחיקת מאגרי Git מקומיים.
cd ~ rm -rf ~/hello-cloudbuild-app rm -rf ~/hello-cloudbuild-env
מוחקים את מאגרי ה-Git ב-Cloud Source Repositories.
gcloud source repos delete hello-cloudbuild-app --quiet gcloud source repos delete hello-cloudbuild-env --quiet
מוחקים את הטריגרים של Cloud Build.
פותחים את הדף Triggers של Cloud Build.
לכל טריגר, לוחצים על סמל האפשרויות הנוספות more_vert ואז על מחיקה.
מחיקת מאגר Docker ב-Artifact Registry.
gcloud artifacts repositories delete my-repository \ --location=us-central1מסירים את ההרשאה שניתנה ל-Cloud Build להתחבר ל-GKE.
PROJECT_NUMBER="$(gcloud projects describe ${PROJECT_ID} \ --format='get(projectNumber)')" gcloud projects remove-iam-policy-binding ${PROJECT_NUMBER} \ --member=serviceAccount:${PROJECT_NUMBER}@cloudbuild.gserviceaccount.com \ --role=roles/container.developerמוחקים את אשכול GKE.
gcloud container clusters delete hello-cloudbuild \ --location us-central1
המאמרים הבאים
- כדאי לבדוק את התכונות המתקדמות יותר ב-Cloud Build: הגדרת סדר השלבים של ה-build, יצירה, בדיקה ופריסה של ארטיפקטים, וגם יצירת שלבים מותאמים אישית של build.
- איך משכפלים מאגר GitHub או Bitbucket ל-Cloud Source Repositories
- חיבור Cloud Build ישירות למאגר שלכם ב-GitHub