انتشار با Cloud Deploy

۱. اهداف

در این آموزش، شما سه کلاستر GKE با نام‌های preview، canary و prod ایجاد خواهید کرد. سپس، یک هدف Cloud Deploy مربوط به هر کلاستر و یک خط لوله Cloud Deploy ایجاد کنید که توالی مراحل انجام استقرار در آن اهداف را تعریف می‌کند.

جریان استقرار توسط یک خط لوله cloudbuild آغاز می‌شود که نسخه Cloud Deploy را ایجاد کرده و استقرار را در خوشه پیش‌نمایش انجام می‌دهد. پس از اینکه تأیید کردید که استقرار در پیش‌نمایش موفقیت‌آمیز بوده و مطابق انتظار کار می‌کند، به صورت دستی انتشار را در خوشه Canary ارتقا می‌دهید. ارتقا انتشار در خوشه prod نیاز به تأیید دارد، شما خط لوله prod را در رابط کاربری Cloud Deploy تأیید کرده و در نهایت آن را ارتقا می‌دهید.

اهداف این آموزش را می‌توان به مراحل زیر تقسیم کرد:

  • فضای کاری خود را آماده کنید
  • اهداف استقرار ابری را تعریف کنید
  • تعریف خط لوله استقرار ابری
  • ایجاد یک نسخه
  • یک استقرار را تبلیغ کنید
  • تأیید نسخه تولیدی

تنظیم محیط خودتنظیم

  1. وارد کنسول گوگل کلود شوید و یک پروژه جدید ایجاد کنید یا از یک پروژه موجود دوباره استفاده کنید. اگر از قبل حساب جیمیل یا گوگل ورک اسپیس ندارید، باید یکی ایجاد کنید .

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • نام پروژه ، نام نمایشی برای شرکت‌کنندگان این پروژه است. این یک رشته کاراکتری است که توسط APIهای گوگل استفاده نمی‌شود و می‌توانید آن را در هر زمانی به‌روزرسانی کنید.
  • شناسه پروژه باید در تمام پروژه‌های گوگل کلود منحصر به فرد باشد و تغییرناپذیر است (پس از تنظیم، قابل تغییر نیست). کنسول کلود به طور خودکار یک رشته منحصر به فرد تولید می‌کند؛ معمولاً برای شما مهم نیست که چیست. در اکثر آزمایشگاه‌های کد، باید به شناسه پروژه ارجاع دهید (و معمولاً با نام PROJECT_ID شناخته می‌شود)، بنابراین اگر آن را دوست ندارید، یک شناسه تصادفی دیگر ایجاد کنید، یا می‌توانید شناسه خودتان را امتحان کنید و ببینید آیا در دسترس است یا خیر. سپس پس از ایجاد پروژه، آن "منجمد" می‌شود.
  • یک مقدار سوم هم وجود دارد، شماره پروژه که برخی از APIها از آن استفاده می‌کنند. برای اطلاعات بیشتر در مورد هر سه این مقادیر به مستندات مراجعه کنید.
  1. در مرحله بعد، برای استفاده از منابع/APIهای ابری، باید پرداخت صورتحساب را در کنسول ابری فعال کنید . اجرای این آزمایشگاه کد، اگر اصلاً هزینه‌ای نداشته باشد، هزینه زیادی نخواهد داشت. برای خاموش کردن منابع به طوری که پس از این آموزش متحمل پرداخت صورتحساب نشوید، دستورالعمل‌های «پاکسازی» موجود در انتهای آزمایشگاه کد را دنبال کنید. کاربران جدید Google Cloud واجد شرایط برنامه آزمایشی رایگان ۳۰۰ دلاری هستند.

۲. راه‌اندازی پلتفرم

آماده سازی فضای کاری شما

ما در اینجا محیط مورد نیاز برای اجرای این آموزش را راه‌اندازی خواهیم کرد. پس از اتمام این مرحله، یک کلاستر GKE ایجاد خواهیم کرد که می‌توانیم پیاده‌سازی‌ها را در آن اجرا کنیم.

  1. تنظیمات پیش‌فرض پیکربندی gcloud را تنظیم کنید

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. کلون مخزن

git clone https://github.com/gushob21/software-delivery-workshop

cd software-delivery-workshop/labs/cloud-deploy/

cloudshell workspace .

rm -rf deploy && mkdir deploy

  1. تنظیم متغیرهای محیطی

export PROJECT_ID=$(gcloud config get-value project)

export PROJECT_NUMBER=$(gcloud projects list --filter="$PROJECT_ID" --format="value(PROJECT_NUMBER)")

  1. فعال کردن APIها

gcloud services enable \

cloudresourcemanager.googleapis.com \

    `container.googleapis.com \`

    `cloudbuild.googleapis.com \`

    `containerregistry.googleapis.com \`

    `secretmanager.googleapis.com \`

    `clouddeploy.googleapis.com` 
  1. ایجاد خوشه‌های GKE
     `gcloud container clusters create preview \`
    

--zone=us-central1-a --async

    `gcloud container clusters create canary \`

--zone=us-central1-b --async

    `gcloud container clusters create prod \`

--zone=us-central1-c

تعریف اهداف استقرار ابری

  1. با دستور زیر در cloudshell، فایلی در دایرکتوری deploy با نام preview.yaml ایجاد کنید:

cat <<EOF >deploy/preview.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: preview

annotations: {}

labels: {}

description: Target for preview environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-a/clusters/preview

EOF

    As you noticed, the "kind" tag is "Target". It allows us to add some metadata to the target, a description and finally the GKE cluster where the deployment is supposed to happen for this target.
  1. با دستور زیر در cloudshell، فایلی در دایرکتوری deploy با نام canary.yaml ایجاد کنید:

cat <<EOF >deploy/canary.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: canary

annotations: {}

labels: {}

description: Target for canary environment

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-b/clusters/canary

EOF

  1. با دستور زیر در cloudshell، فایلی در دایرکتوری deploy با نام prod.yaml ایجاد کنید:

cat <<EOF >deploy/prod.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: Target

metadata:

name: prod

annotations: {}

labels: {}

description: Target for prod environment

requireApproval: true

gke:

cluster: projects/$PROJECT_ID/locations/us-central1-c/clusters/prod

EOF

به تگ requireApproval که روی true تنظیم شده است توجه کنید. این کار تا زمانی که تأییدیه صادر نشود، اجازه تبلیغ به هدف تولید را نمی‌دهد. برای تأیید یک نسخه، به نقش roles/clouddeploy.approver نیاز دارید.

  1. ایجاد اهداف استقرار
         `gcloud config set deploy/region us-central1` 
    

gcloud beta deploy apply --file deploy/preview.yaml

gcloud beta deploy apply --file deploy/canary.yaml

gcloud beta deploy apply --file deploy/prod.yaml

۳. ساخت اپلیکیشن

به عنوان بخشی از فرآیند ایجاد یک برنامه جدید، خط لوله CICD معمولاً برای انجام ساخت‌های خودکار، آزمایش ادغام و استقرار راه‌اندازی می‌شود. مراحل زیر بخشی از فرآیند راه‌اندازی یک برنامه جدید در نظر گرفته می‌شوند. هر برنامه جدید دارای یک خط لوله استقرار پیکربندی شده خواهد بود.

تعریف خط لوله استقرار ابری

  1. با دستور زیر در cloudshell، فایلی با نام pipeline.yaml در دایرکتوری deploy ایجاد کنید:

cat <<EOF >>deploy/pipeline.yaml

apiVersion: deploy.cloud.google.com/v1beta1

kind: DeliveryPipeline

metadata:

name: sample-app

labels:

`app: sample-app`

description: delivery pipeline

serialPipeline:

stages:

- targetId: preview

`profiles:`

`- preview`

- targetId: canary

`profiles:`

`- canary`

- targetId: prod

`profiles:`

`- prod`

EOF

    As you noticed, the "kind" tag is "DeliveryPipeline". It lets you define the metadata for the pipeline, a description and an order of deployment into various targets via serialPipeline tag.

تگ serialPipeline شامل تگی به نام stages است که فهرستی از تمام اهدافی است که این delivery pipeline برای استقرار در آنها پیکربندی شده است.

targetId هدف خاصی را که برای این مرحله از فرآیند تحویل استفاده می‌شود، مشخص می‌کند. مقدار آن، ویژگی metadata.name از تعریف هدف است.

profiles فهرستی از صفر یا چند نام پروفایل Skaffold از skaffold.yaml است. Cloud Deploy هنگام ایجاد نسخه، از این پروفایل به همراه رندر skaffold استفاده می‌کند.

  1. خط لوله را اعمال کنید

gcloud beta deploy apply --file deploy/pipeline.yaml

۴. مرحله توسعه

همزمان با توسعه برنامه‌ها، زنجیره ابزارهای خودکار CICD، دارایی‌ها را ساخته و ذخیره می‌کنند. دستورات زیر برای ساخت برنامه با استفاده از skaffold و ذخیره دارایی‌ها برای استقرار با Cloud Deploy اجرا می‌شوند. این مرحله توسط فرآیند CICD شما برای هر ساخت برنامه انجام می‌شود.

  1. ساخت و ذخیره برنامه با skaffold

skaffold build \

--file-output=artifacts.json \

--default-repo gcr.io/$PROJECT_ID \

--push=true

۵. مرحله رهاسازی

در پایان فرآیند CICD، معمولاً زمانی که کد برای تولید برچسب‌گذاری می‌شود، شما فرآیند انتشار را با فراخوانی دستور cloud deploy release آغاز خواهید کرد. بعداً، پس از تأیید و استقرار، با تبلیغ و تأیید اقدام از طریق فرآیندهای خودکار یا تأییدیه‌های دستی، انتشار را در محیط‌های هدف مختلف منتقل خواهید کرد.

ایجاد یک نسخه

ما قبلاً در این آموزش فایل‌های Cloud Deploy را ایجاد کردیم تا درکی از نحوه کار Cloud Deploy داشته باشیم. برای اهداف نمایشی، ما همان فایل‌های Cloud Deploy را ایجاد کرده و آنها را به همراه یک برنامه نمونه go به یک مخزن github منتقل کرده‌ایم و از Cloud Deploy برای انتشار آن برنامه استفاده خواهیم کرد.

export REL_TIMESTAMP=$(date '+%Y%m%d-%H%M%S')

gcloud beta deploy releases create \

sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--description="Release demo" \

--build-artifacts=artifacts.json \

--annotations="release-id=rel-${REL_TIMESTAMP}"

نسخه را مرور کنید

وقتی یک نسخه Cloud Deploy ایجاد می‌شود، به طور خودکار آن را در اولین هدف که پیش‌نمایش است، منتشر می‌کند.

  1. به <Cloud Deploy> در کنسول ابری گوگل بروید
  2. روی «نمونه-برنامه» کلیک کنید

در این صفحه، نمایش گرافیکی از خط لوله خود را مشاهده خواهید کرد.

  1. یک خط سبز در سمت چپ کادر پیش‌نمایش را تأیید کنید، به این معنی که نسخه در آن محیط مستقر شده است.
  2. در صورت تمایل، با کلیک روی نام نسخه در زیر «جزئیات انتشار» در قسمت پایین صفحه، جزئیات بیشتر در مورد نسخه را بررسی کنید.
  3. تأیید کنید که نسخه با موفقیت برنامه را مستقر کرده است، دستور زیر را اجرا کنید: cloushell

gcloud container clusters get-credentials preview --zone us-central1-a && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. روی نماد پیش‌نمایش وب در سمت راست بالای صفحه کلیک کنید.
  2. پیش‌نمایش را روی پورت ۸۰۸۰ انتخاب کنید

این شما را به صفحه جدیدی می‌برد که پیام "سلام دنیا!" را نشان می‌دهد.

  1. برای پایان دادن به پورت فوروارد، در ترمینال ctrl+c استفاده کنید.

تبلیغ یک نسخه

اکنون که نسخه شما به اولین هدف (پیش‌نمایش) در خط لوله ارسال شده است، می‌توانید آن را به هدف بعدی (canary) ارتقا دهید. دستور زیر را برای شروع فرآیند اجرا کنید.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

بررسی تبلیغات انتشار

  1. به خط لوله نمونه برنامه در کنسول Google Cloud بروید
  2. یک خط سبز در سمت چپ کادر Canary را تأیید کنید، به این معنی که نسخه در آن محیط مستقر شده است.
  3. با ایجاد یک تونل به برنامه، از استقرار صحیح آن اطمینان حاصل کنید.

gcloud container clusters get-credentials canary --zone us-central1-b && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. روی نماد پیش‌نمایش وب در سمت راست بالای صفحه کلیک کنید.
  2. پیش‌نمایش را روی پورت ۸۰۸۰ انتخاب کنید

این شما را به صفحه جدیدی می‌برد که پیام "سلام دنیا!" را نشان می‌دهد.

  1. برای پایان دادن به پورت فوروارد، در ترمینال ctrl+c استفاده کنید.

تأیید انتشار نسخه تولیدی

به یاد داشته باشید وقتی که هدف prod را از طریق prod.yaml ایجاد کردیم، تگ requireApproval را روی true تنظیم کردیم. این کار باعث می‌شود که برای ارتقاء در prod، نیاز به تأیید باشد.

  1. با دستور زیر، نسخه آزمایشی Canary را به محیط عملیاتی ارتقا دهید.

gcloud beta deploy releases promote \

--release=sample-app-release-${REL_TIMESTAMP} \

--delivery-pipeline=sample-app \

--quiet

  1. به خط لوله نمونه برنامه در کنسول Google Cloud بروید
  2. به نشانگر زرد رنگ که عبارت «۱ در انتظار» را نشان می‌دهد، توجه کنید.

این پیام نشان می‌دهد که یک نسخه در صف انتشار برای استقرار در محیط عملیاتی وجود دارد، اما نیاز به بررسی و تأیید دارد.

  1. روی دکمه «بررسی» درست زیر اعلان زرد کلیک کنید.
  2. در صفحه بعد، دوباره روی «بررسی» کلیک کنید تا به صفحه تأیید برای تولید دسترسی پیدا کنید.
  3. در صورت تمایل، Manifest Diff را برای بررسی تغییرات بررسی کنید. در این مورد، یک فایل کاملاً جدید.
  4. روی دکمه «تایید» کلیک کنید
  5. به صفحه‌ی «روند تولید برنامه‌ی نمونه» برگردید، جایی که می‌توانید فرآیند انتشار برای تولید را مشاهده کنید.

نسخه تولیدی را بررسی کنید

همانند سایر محیط‌ها، می‌توانید پس از اتمام استقرار، با استفاده از مراحل زیر، آن را بررسی کنید.

  1. دستور زیر را در cloudshell اجرا کنید تا پورت-فوروارد ایجاد شود.

gcloud container clusters get-credentials prod --zone us-central1-c && kubectl port-forward --namespace default $(kubectl get pod --namespace default --selector="app=cloud-deploy-tutorial" --output jsonpath='{.items[0].metadata.name}') 8080:8080

  1. روی نماد پیش‌نمایش وب در سمت راست بالای صفحه کلیک کنید.
  2. پیش‌نمایش را روی پورت ۸۰۸۰ انتخاب کنید

این شما را به صفحه جدیدی می‌برد که پیام "سلام دنیا!" را نشان می‌دهد.

  1. برای پایان دادن به پورت فوروارد، در ترمینال ctrl+c استفاده کنید.