בדף הזה מוסבר איך לחבר מארח של Bitbucket Cloud ל-Cloud Build.
לפני שמתחילים
מפעילים את Cloud Build API, Secret Manager API ו-Compute Engine API, אם הם עדיין לא מופעלים.
תפקידים שנדרשים להפעלת ממשקי API
כדי להפעיל ממשקי API, נדרשת ההרשאה
serviceusage.services.enable. אם יצרתם את הפרויקט, סביר להניח שכבר יש לכם את ההרשאה הזו דרך התפקיד 'בעלים' (roles/owner). אחרת, תוכלו לקבל את ההרשאה הזו דרך התפקיד 'אדמין בממשק Service Usage' (roles/serviceusage.serviceUsageAdmin). איך מקצים תפקידים
- מוודאים שקוד המקור נמצא במאגר Bitbucket Cloud.
- מוודאים שלמאגר קוד המקור ב-Bitbucket Cloud יש
Dockerfileאו קובץ הגדרות של Cloud Build. - כדי להשתמש בפקודות
gcloud, צריך להתקין את Google Cloud CLI.
הרשאות IAM נדרשות
כדי לוודא של- יש את ההרשאות שנדרשות להתחברות, צריך לבקש מהאדמין להקצות ל- את תפקיד ה-IAM 'אדמין של חיבור Cloud Build' (cloudbuild.connectionAdmin) בחשבון המשתמש.
כדי לקרוא הסבר על מתן תפקידים, ראו איך מנהלים את הגישה ברמת הפרויקט, התיקייה והארגון.
יכול להיות שהאדמין גם יוכל לתת את ההרשאות שנדרשות באמצעות תפקידים בהתאמה אישית או תפקידים מוגדרים מראש אחרים.
יצירת טוקנים של גישה ל-Bitbucket Cloud
יוצרים את שני אסימוני הגישה הבאים ב-Bitbucket Cloud:
- טוקן גישה לאדמין – לחיבור ולניתוק של מאגרי מידע.
- אסימון גישה לקריאה – כדי לאפשר ל-Cloud Build לגשת לקוד המקור.
כדי ליצור את האסימונים האלה, פועלים לפי השלבים הבאים:
נכנסים ל-Bitbucket Cloud.
פועלים לפי ההוראות של Bitbucket Cloud כדי ליצור טוקנים לגישה שמקושרים למאגר, לפרויקט או לסביבת עבודה.
נותנים את ההרשאות הבאות:
טוקן גישה לאדמין:
- מאגרים: קריאה ואדמין
- בקשות משיכה: קריאה
- Webhooks: Read ו-Write
טוקן גישה לקריאה:
- Repositories: Read
מעתיקים את הטוקנים לשימוש בהליכים הבאים.
התחברות למארח Bitbucket Cloud
המסוף
כדי לחבר את Cloud Build למארח Bitbucket Cloud, צריך לבצע את השלבים הבאים:
פותחים את הדף Repositories במסוף Google Cloud .
יוצג הדף Repositories (מאגרי מידע).
בוחרים את הפרויקט Google Cloud הרצוי מתוך רשימת הפרויקטים.
בראש הדף, לוחצים על הכרטיסייה דור שני.
לוחצים על יצירת חיבור למארח כדי לחבר מארח חדש ל-Cloud Build.
בחלונית הימנית, בוחרים באפשרות Bitbucket כספק המקור.
בקטע Configure Connection (הגדרת החיבור), מזינים את הפרטים הבאים:
אזור: בוחרים אזור לקישור.
שם: מזינים שם לחיבור.
בקטע פרטי המארח, מזינים את הפרטים הבאים:
בוחרים באפשרות Bitbucket Cloud כסוג המארח.
Workspace (סביבת עבודה): מזינים את מזהה סביבת העבודה של מאגר Bitbucket Cloud.
אופציונלי: אם רוצים לנהל את מפתחות ההצפנה שמשמשים להצפנת טוקני הגישה למאגרי Bitbucket Cloud, עוברים לקטע הצפנה ובוחרים מפתח של Cloud Key Management Service. מידע נוסף זמין במאמר בנושא הפעלת מפתחות הצפנה בניהול הלקוח ב-Secret Manager.
בקטע Access tokens (אסימוני גישה), מזינים את הפרטים הבאים:
אסימון גישת אדמין: מזינים את אסימון גישת האדמין שנוצר קודם.
אסימון גישה לקריאה: מזינים את אסימון הגישה לקריאה שיצרתם קודם.
לוחצים על Connect.
החיבור החדש מופיע בדף מאגרי מידע.
gcloud
כדי לשמור את פרטי הכניסה:
כדי לאחסן את אסימוני הגישה ב-Secret Manager בפרויקטGoogle Cloud , מריצים את הפקודות הבאות:
echo -n ADMIN_TOKEN | gcloud secrets create ADMIN_SECRET_NAME --data-file=- echo -n READ_TOKEN | gcloud secrets create READ_SECRET_NAME --data-file=-כאשר:
- ADMIN_TOKEN הוא טוקן הגישה של האדמין.
- ADMIN_SECRET_NAME הוא השם שרוצים לתת לסוד של טוקן הגישה לאדמין ב-Secret Manager.
- READ_TOKEN הוא טוקן הגישה לקריאה.
- READ_SECRET_NAME הוא השם שרוצים לתת לסוד של טוקן הגישה לקריאה ב-Secret Manager.
יוצרים סוד של webhook ב-Secret Manager על ידי הרצת הפקודה הבאה, כאשר WEBHOOK_SECRET_NAME הוא השם שרוצים לתת לסוד של ה-webhook:
echo -n ${ex.(random-uuid)} | gcloud secrets create WEBHOOK_SECRET_NAME --data-file=-אם הסודות שלכם לא נמצאים באותו פרויקט, מריצים את הפקודה הבאה כדי להעניק גישה לסוכן השירות של Cloud Build:
PN=$(gcloud projects describe PROJECT_ID --format="value(projectNumber)") CLOUD_BUILD_SERVICE_ACCOUNT="service-${PN}@gcp-sa-cloudbuild.iam.gserviceaccount.com" gcloud secrets add-iam-policy-binding ADMIN_SECRET_NAME \ --member="serviceAccount:${CLOUD_BUILD_SERVICE_ACCOUNT}" \ --role="roles/secretmanager.secretAccessor" gcloud secrets add-iam-policy-binding READ_SECRET_NAME \ --member="serviceAccount:${CLOUD_BUILD_SERVICE_ACCOUNT}" \ --role="roles/secretmanager.secretAccessor" gcloud secrets add-iam-policy-binding WEBHOOK_SECRET_NAME \ --member="serviceAccount:${CLOUD_BUILD_SERVICE_ACCOUNT}" \ --role="roles/secretmanager.secretAccessor"כאשר:
- PROJECT_ID הוא Google Cloud מזהה הפרויקט.
- ADMIN_SECRET_NAME הוא השם של סוד טוקן האדמין.
- READ_SECRET_NAME הוא השם של סוד האסימון לקריאה.
- WEBHOOK_SECRET_NAME הוא השם של הסוד של ה-webhook.
כדי לחבר את Cloud Build למארח Bitbucket Cloud, משתמשים בפקודה הבאה:
gcloud builds connections create bitbucket-cloud CONNECTION_NAME \ --workspace=WORKSPACE_ID \ --project=PROJECT_ID \ --region=REGION \ --authorizer-token-secret-version=projects/PROJECT_ID/secrets/ADMIN_SECRET_NAME/versions/latest \ --read-authorizer-token-secret-version=projects/PROJECT_ID/secrets/READ_SECRET_NAME/versions/latest \ --webhook-secret-secret-version=projects/PROJECT_ID/secrets/WEBHOOK_SECRET_NAME/versions/1כאשר:
- CONNECTION_NAME הוא השם שרוצים לתת לחיבור למארח Bitbucket Cloud.
- WORKSPACE_ID הוא מזהה Workspace למאגר Bitbucket Cloud.
- PROJECT_ID הוא Google Cloud מזהה הפרויקט.
- REGION הוא האזור של החיבור למארח.
- ADMIN_SECRET_NAME הוא השם של הסוד של טוקן האדמין.
- READ_SECRET_NAME הוא השם של הסוד של אסימון הגישה לקריאה.
- WEBHOOK_SECRET_NAME הוא השם של סוד ה-webhook.
Terraform
אתם יכולים לחבר את המארח שלכם ב-Bitbucket Cloud ל-Cloud Build באמצעות Terraform.
בדוגמה הבאה, קטע הקוד מבצע את הפעולות הבאות:
- מגדיר את ספק Google של Terraform.
- יוצר סוד ב-Secret Manager לאחסון האסימונים של Bitbucket.
- ההרשאה הזו מעניקה לסוכן השירות של Cloud Build את ההרשאות הנדרשות כדי לגשת לסודות.
יצירת חיבור ל-Bitbucket Cloud.
// Configure the Terraform Google provider terraform { required_providers { google = {} } } provider "google" { project = "PROJECT_ID" region = "REGION" } // Create secrets and grant permissions to the Cloud Build service agent resource "google_secret_manager_secret" "admin-token-secret" { project = "PROJECT_ID" secret_id = "ADMIN_TOKEN_NAME" replication { auto {} } } resource "google_secret_manager_secret_version" "admin-token-secret-version" { secret = google_secret_manager_secret.admin-token-secret.id secret_data = "ADMIN_TOKEN_VALUE" } resource "google_secret_manager_secret" "read-token-secret" { project = "PROJECT_ID" secret_id = "READ_TOKEN_NAME" replication { auto {} } } resource "google_secret_manager_secret_version" "read-token-secret-version" { secret = google_secret_manager_secret.read-token-secret.id secret_data = "READ_TOKEN_VALUE" } resource "google_secret_manager_secret" "webhook-secret-secret" { project = "PROJECT_ID" secret_id = "WEBHOOK_SECRET_NAME" replication { auto {} } } resource "google_secret_manager_secret_version" "webhook-secret-secret-version" { secret = google_secret_manager_secret.webhook-secret-secret.id secret_data = "WEBHOOK_SECRET_VALUE" } data "google_iam_policy" "p4sa-secretAccessor" { binding { role = "roles/secretmanager.secretAccessor" members = ["serviceAccount:service-PROJECT_NUMBER@gcp-sa-cloudbuild.iam.gserviceaccount.com"] } } resource "google_secret_manager_secret_iam_policy" "policy-pak" { project = google_secret_manager_secret.admin-token-secret.project secret_id = google_secret_manager_secret.admin-token-secret.secret_id policy_data = data.google_iam_policy.p4sa-secretAccessor.policy_data } resource "google_secret_manager_secret_iam_policy" "policy-rpak" { project = google_secret_manager_secret.read-token-secret.project secret_id = google_secret_manager_secret.read-token-secret.secret_id policy_data = data.google_iam_policy.p4sa-secretAccessor.policy_data } resource "google_secret_manager_secret_iam_policy" "policy-whs" { project = google_secret_manager_secret.webhook-secret-secret.project secret_id = google_secret_manager_secret.webhook-secret-secret.secret_id policy_data = data.google_iam_policy.p4sa-secretAccessor.policy_data } // Create the connection and add the repository resource resource "google_cloudbuildv2_connection" "my-connection" { project = "PROJECT_ID" location = "REGION" name = "CONNECTION_NAME" bitbucket_cloud_config { workspace = "WORKSPACE_ID" authorizer_credential { user_token_secret_version = google_secret_manager_secret_version.admin-token-secret-version.id } read_authorizer_credential { user_token_secret_version = google_secret_manager_secret_version.read-token-secret-version.id } webhook_secret_secret_version = google_secret_manager_secret_version.webhook-secret-secret-version.id } depends_on = [ google_secret_manager_secret_iam_policy.policy-pak, google_secret_manager_secret_iam_policy.policy-rpak, google_secret_manager_secret_iam_policy.policy-whs ] }
כאשר:
- PROJECT_ID הוא Google Cloud מזהה הפרויקט.
- PROJECT_NUMBER הוא מספר הפרויקט שלכם ב- Google Cloud .
- ADMIN_TOKEN_NAME הוא השם של האסימון עם גישה להיקף ההרשאות
webhook, repository, repository:adminו-pullrequest. - ADMIN_TOKEN_VALUE הוא הערך של ADMIN_TOKEN_NAME.
- READ_TOKEN_NAME הוא השם של האסימון עם ההיקף
repository:read. - READ_TOKEN_VALUE הוא הערך של READ_TOKEN_NAME.
- WEBHOOK_SECRET_NAME הוא השם של הסוד של ה-webhook.
- WEBHOOK_SECRET_VALUE הוא הערך של WEBHOOK_SECRET_NAME.
- REGION הוא האזור של החיבור.
- CONNECTION_NAME הוא שם החיבור.
- WORKSPACE_ID הוא מזהה Workspace למאגר Bitbucket Cloud.
החלפה של טוקנים ישנים או שפג תוקפם ב-Bitbucket Cloud
מסובבים את טוקני הגישה כדי שחיבור המארח של Cloud Build יוכל לשמור על החיבור למאגר Bitbucket Cloud. אם תוקף האסימון שלכם לגישה ל-Bitbucket Cloud יפוג, החיבור של מארח Cloud Build למאגר Bitbucket Cloud ינותק. במקרה כזה, לא תוכלו להשבית את החיבור או לקשר מאגר עד שתחליפו את האסימון שפג תוקפו. בנוסף, השגיאות יופיעו במקרים הבאים:
בדף פרטי החיבורים של החיבור מופיעה הודעת שגיאה שבה מצוין
Connection is disconnected due to an invalid or expired access token.אם תנסו לקשר מאגר לחיבור עם טוקן גישה שתוקפו פג, תופיע ההודעה Invalid access token. כשלוחצים על View connection (הצגת החיבור), מגיעים לדף Connection details (פרטי החיבור) של החיבור עם האסימון שתוקפו פג.
ב-Cloud Build אפשר להחליף את טוקני הגישה על ידי הזנת ערכי טוקנים חדשים ושמירתם ב-Secret Manager בגרסה העדכנית ביותר של הסודות האלה. כדי לבצע רוטציה של טוקנים לגישה:
מבצעים רוטציה לכל טוקן גישה ב-Bitbucket Cloud:
עוברים למאגר Bitbucket Cloud שמקושר לחיבור המארח של Cloud Build.
פועלים לפי ההוראות במסמכי התיעוד של Bitbucket כדי להחליף טוקן גישה. כשמבצעים רוטציה של אסימון, Bitbucket Cloud יוצר אסימון חדש עם פרטי כניסה חדשים ומבטל את התוקף של הגרסה הקודמת של האסימון. לאסימון המעודכן יש את אותן הרשאות ואותו היקף כמו לאסימון המקורי.
מעתיקים את המזהים של הטוקנים שהוחלפו.
מעדכנים את טוקן הגישה ב-Cloud Build:
עוברים לדף פרטי החיבור של החיבור.
בוחרים באפשרות עדכון טוקנים של גישה.
בתפריט Token rotation (רוטציה של טוקנים), מזינים את הטוקנים החדשים בשדות API access token (טוקן גישה ל-API) ו-Read access token (טוקן גישת קריאה).
(אופציונלי): אם רוצים שהחיבור ישתמש תמיד בגרסה העדכנית ביותר של הסוד עבור האסימונים, בוחרים באפשרות עדכון החיבור כך שתמיד תהיה בשימוש הגרסה העדכנית ביותר. יכול להיות שיהיה לכם שימושי להשאיר את האפשרות הזו לא מסומנת אם החיבור שלכם משתמש במספר גרסה סודי ספציפי.
כדי לשמור את השינויים, לוחצים על עדכון.
Cloud Build שומר את אסימוני הגישה החדשים כגרסה האחרונה של הסוד ב-Secret Manager.
המאמרים הבאים
- איך מתחברים למאגר Bitbucket Cloud
- איך רואים את תוצאות הבנייה
- איך מבצעים פריסות blue-green ב-Compute Engine