الإصدار باستخدام Cloud Deploy

1. الأهداف

في هذا البرنامج التعليمي، ستنشئ ثلاث مجموعات GKE باسم preview وcanary وprod. بعد ذلك، ستنشئ هدف Cloud Deploy يتوافق مع كل مجموعة وقناة Cloud Deploy تحدّد تسلسل الخطوات اللازمة لتنفيذ عملية النشر في هذه الأهداف.

سيتم تشغيل مسار نشر من خلال مسار Cloud Build الذي سينشئ إصدار Cloud Deploy وينفّذ عملية النشر في مجموعة المعاينة. بعد التأكّد من أنّ عملية النشر في المعاينة كانت ناجحة وتعمل على النحو المتوقّع، عليك ترقية الإصدار يدويًا في مجموعة اختبار الإصدارات المسبقة. سيتطلّب الترويج للإصدار في مجموعة prod الحصول على موافقة، وستوافق على مسار prod في واجهة مستخدم Cloud Deploy ثمّ تروّج له في النهاية.

يمكن تقسيم أهداف هذا البرنامج التعليمي إلى الخطوات التالية:

  • تجهيز مساحة العمل
  • تحديد أهداف Cloud Deploy
  • تحديد مسار Cloud Deploy
  • إنشاء إصدار
  • الترويج لعملية نشر
  • الموافقة على إصدار علني

إعداد البيئة بوتيرة ذاتية

  1. سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.

b35bf95b8bf3d5d8.png

a99b7ace416376c4.png

bd84a6d3004737c5.png

  • اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة من الأحرف لا تستخدمها Google APIs، ويمكنك تعديلها في أي وقت.
  • يجب أن يكون رقم تعريف المشروع فريدًا في جميع مشاريع Google Cloud، كما أنّه غير قابل للتغيير (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس الترميز، عليك الرجوع إلى رقم تعريف المشروع (ويتم تحديده عادةً على أنّه PROJECT_ID)، لذا إذا لم يعجبك، يمكنك إنشاء رقم آخر عشوائي، أو يمكنك تجربة رقمك الخاص ومعرفة ما إذا كان متاحًا. ثم يتم "تجميده" بعد إنشاء المشروع.
  • هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
  1. بعد ذلك، عليك تفعيل الفوترة في Cloud Console من أجل استخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا الدرس التطبيقي حول الترميز، اتّبِع أي تعليمات "تنظيف" واردة في نهاية الدرس. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.

2. إعداد المنصة

إعداد مساحة العمل

سنقوم هنا بإعداد البيئة المطلوبة لتنفيذ هذا البرنامج التعليمي. عند اكتمال هذه الخطوة، سيتم إنشاء مجموعة GKE حيث يمكننا تنفيذ عمليات النشر.

  1. ضبط الإعدادات التلقائية في gcloud

gcloud config set project <your project>

gcloud config set deploy/region us-central1

  1. Clone Repo

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. تفعيل واجهات برمجة التطبيقات

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

تحديد أهداف Cloud Deploy

  1. أنشئ ملفًا في دليل النشر باسم preview.yaml باستخدام الأمر التالي في Cloud Shell:

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. أنشئ ملفًا في دليل النشر باسم canary.yaml باستخدام الأمر التالي في Cloud Shell:

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. أنشئ ملفًا في دليل النشر باسم prod.yaml باستخدام الأمر التالي في Cloud Shell:

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 تم ضبطها على "صحيح". ولن يسمح ذلك بالترقية إلى إصدار الإنتاج المستهدف إلى أن تتم الموافقة. يجب أن يكون لديك دور 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

3- إنشاء التطبيق

كجزء من إنشاء تطبيق جديد، يتم عادةً إعداد مسار CICD لتنفيذ عمليات الإنشاء والاختبارات وعمليات النشر التلقائية. تُعدّ الخطوات التالية جزءًا من عملية إعداد تطبيق جديد، وسيتم إعداد مسار نشر لكل تطبيق جديد.

تحديد مسار Cloud Deploy

  1. أنشئ ملفًا في دليل النشر باسم pipeline.yaml باستخدام الأمر التالي في Cloud Shell:

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 على علامة باسم مراحل وهي قائمة بجميع الأهداف التي تم ضبط خط أنابيب التسليم هذا على تفعيلها.

تحدّد targetId الهدف المحدّد الذي سيتم استخدامه في هذه المرحلة من مسار التسليم. القيمة هي السمة metadata.name من تعريف الاستهداف.

profiles هي قائمة تتضمّن صفرًا أو أكثر من أسماء ملفات Skaffold الشخصية، من skaffold.yaml. تستخدم Cloud Deploy الملف الشخصي مع skaffold render عند إنشاء الإصدار.

  1. تطبيق مسار التعلّم

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

4. مرحلة التطوير

أثناء تطوير التطبيقات، ستنشئ سلاسل أدوات CICD المبرمَجة مواد العرض وتخزِّنها. يتم تنفيذ الأوامر التالية لإنشاء التطبيق باستخدام Skaffold وتخزين مواد العرض لنشرها باستخدام Cloud Deploy. يجب أن تنفّذ عملية التكامل المستمر والتسليم المستمر هذه الخطوة لكل إصدار من التطبيق.

  1. إنشاء التطبيق وتخزينه باستخدام skaffold

skaffold build \

--file-output=artifacts.json \

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

--push=true

5- مرحلة الإصدار

في نهاية عملية التكامل المستمر والتسليم المستمر، وعندما يتم وضع علامة على الرمز للإنتاج عادةً، ستبدأ عملية الإصدار من خلال استدعاء الأمر cloud deploy release. بعد التحقّق من صحة عملية النشر والموافقة عليها، يمكنك نقل الإصدار إلى بيئات الاستهداف المختلفة من خلال الترويج للإجراء والموافقة عليه من خلال عمليات مبرمَجة أو موافقات يدوية.

إنشاء إصدار

أنشأنا ملفات Cloud Deploy في هذا البرنامج التعليمي سابقًا للتعرّف على طريقة عمل Cloud Deploy. لأغراض العرض التوضيحي، أنشأنا ملفات Cloud Deploy نفسها ونقلناها إلى مستودع github مع نموذج لتطبيق go، وسنستخدم 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> في وحدة تحكّم Google Cloud
  2. انقر على "sample-app"

ستظهر على هذه الشاشة تمثيل رسومي لخط الإنتاج.

  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. اختَر "المعاينة على المنفذ 8080".

سيتم توجيهك إلى صفحة جديدة تعرض الرسالة "Hello World!‎"

  1. استخدِم ctrl+c في الوحدة الطرفية لإنهاء إعادة توجيه المنفذ.

الترويج لإصدار

بعد نشر إصدارك في الهدف الأول (المعاينة) في مسار الإصدار، يمكنك ترقيته إلى الهدف التالي (الإصدار التجريبي). نفِّذ الأمر التالي لبدء العملية.

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

مراجعة العرض الترويجي للإصدار

  1. انتقِل إلى نموذج تطبيق خط الأنابيب في Google Cloud Console.
  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. اختَر "المعاينة على المنفذ 8080".

سيتم توجيهك إلى صفحة جديدة تعرض الرسالة "Hello World!‎"

  1. استخدِم ctrl+c في الوحدة الطرفية لإنهاء إعادة توجيه المنفذ.

الموافقة على إصدار علني

تذكَّر عندما أنشأنا هدفًا للإنتاج من خلال prod.yaml، حدّدنا العلامة requireApproval على أنّها true. سيؤدي ذلك إلى فرض شرط الحصول على موافقة قبل نشر العرض الترويجي في بيئة الإنتاج.

  1. ترقية إصدار Canary إلى الإصدار العلني باستخدام الأمر التالي

gcloud beta deploy releases promote \

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

--delivery-pipeline=sample-app \

--quiet

  1. انتقِل إلى نموذج تطبيق خط الأنابيب في Google Cloud Console.
  2. لاحِظ المؤشر الأصفر الذي يشير إلى "طلب واحد في انتظار المراجعة".

تشير هذه الرسالة إلى أنّ هناك إصدارًا في قائمة الانتظار ليتم نشره في مرحلة الإنتاج، ولكنّه يتطلّب المراجعة والموافقة.

  1. انقر على الزر "مراجعة" أسفل الإشعار الأصفر مباشرةً.
  2. في الشاشة التالية، انقر على "مراجعة" مرة أخرى للوصول إلى شاشة الموافقة على الإصدار العلني
  3. يمكنك مراجعة Manifest Diff للاطّلاع على التغييرات. في هذه الحالة، ملف جديد تمامًا.
  4. انقر على الزر "موافقة".
  5. ارجع إلى صفحة مسار التطبيق النموذجي حيث سترى أنّ عملية طرح الإصدار في مرحلة الإنتاج قيد التقدّم.

مراجعة الإصدار العلني

كما هو الحال مع البيئات الأخرى، يمكنك مراجعة عملية النشر عند اكتمالها باتّباع الخطوات أدناه.

  1. نفِّذ الأمر التالي في Cloud Shell لإنشاء عملية إعادة توجيه المنفذ

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. اختَر "المعاينة على المنفذ 8080".

سيتم توجيهك إلى صفحة جديدة تعرض الرسالة "Hello World!‎"

  1. استخدِم ctrl+c في الوحدة الطرفية لإنهاء إعادة توجيه المنفذ.