1. نظرة عامة
يوضّح هذا الدرس التطبيقي الميزات والإمكانات المصمَّمة لتبسيط سير عمل التطوير لمهندسي البرامج المكلّفين بتطوير تطبيقات Python في بيئة تستخدم حاويات. يتطلّب تطوير الحاويات المعتاد أن يفهم المستخدم تفاصيل الحاويات وعملية التصميم. بالإضافة إلى ذلك، على المطوّرين عادةً إيقاف عملية التطوير مؤقتًا والانتقال من بيئة التطوير المتكاملة (IDE) لاختبار تطبيقاتهم وتصحيح الأخطاء فيها في بيئات بعيدة. باستخدام الأدوات والتكنولوجيات المذكورة في هذا البرنامج التعليمي، يمكن للمطوّرين العمل بفعالية مع التطبيقات المستندة إلى حاويات بدون مغادرة بيئة التطوير المتكاملة.
ما ستتعلمه
في هذا الدرس التطبيقي، ستتعرّف على طرق التطوير باستخدام الحاويات في Google Cloud Platform، بما في ذلك:
- إنشاء تطبيق Python جديد للمبتدئين
- الخطوات المفصّلة لعملية التطوير
- تطوير خدمة REST بسيطة لإنشاء البيانات وقراءتها وتعديلها وحذفها
- النشر على GKE
- تصحيح حالة الخطأ
- استخدام نقاط الإيقاف / السجلات
- إعادة نشر التغييرات على GKE

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



- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديله في أي وقت.
- رقم تعريف المشروع هو معرّف فريد في جميع مشاريع Google Cloud ولا يمكن تغييره بعد ضبطه. تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف المشروع (يتم تحديده عادةً على أنّه
PROJECT_ID). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغيير هذا الخيار بعد هذه الخطوة وسيظل ساريًا طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع الذي تستخدمه بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات عن كل هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير من المال، إن لم تكلفك شيئًا على الإطلاق. لإيقاف الموارد كي لا يتم تحصيل رسوم منك بعد هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع بأكمله. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
بدء Cloudshell Editor
تم تصميم هذا الدرس التطبيقي واختباره لاستخدامه مع "محرّر Google Cloud Shell". للوصول إلى المحرِّر، اتّبِع الخطوات التالية:
- الوصول إلى مشروعك على Google من خلال https://console.cloud.google.com
- في أعلى يسار الصفحة، انقر على رمز محرر Cloud Shell

- سيتم فتح لوحة جديدة في أسفل النافذة
- انقر على الزر "فتح المحرِّر"

- سيتم فتح المحرِّر مع مستكشف على اليسار ومحرِّر في المنطقة الوسطى
- يجب أن يتوفّر جزء وحدة طرفية أيضًا في أسفل الشاشة
- إذا لم تكن النافذة الطرفية مفتوحة، استخدِم مجموعة المفاتيح `ctrl+`` لفتح نافذة طرفية جديدة.
إعداد البيئة
في Cloud Shell، اضبط رقم تعريف مشروعك ورقم المشروع. احفظها كمتغيرات PROJECT_ID وPROJECT_ID.
export PROJECT_ID=$(gcloud config get-value project)
export PROJECT_NUMBER=$(gcloud projects describe $PROJECT_ID \
--format='value(projectNumber)')
توفير البنية الأساسية المستخدَمة في هذا الدرس التطبيقي
في هذا التمرين العملي، ستنفّذ رمزًا برمجيًا على GKE وتصل إلى البيانات المخزّنة في قاعدة بيانات Spanner. ستستخدم أيضًا محطات عمل Cloud كبيئة تطوير متكاملة. يُعدّ برنامج الإعداد النصي أدناه هذه البنية الأساسية لك.
- نزِّل نص الإعداد البرمجي واجعله قابلاً للتنفيذ.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/setup_with_cw.sh
chmod +x setup_with_cw.sh
- افتح ملف
setup_with_cw.shوعدِّل قيم كلمات المرور التي تم ضبطها حاليًا على CHANGEME - نفِّذ نص الإعداد لإنشاء مجموعة GKE وقاعدة بيانات Spanner التي ستستخدمها في هذا الدرس التطبيقي.
./setup_with_cw.sh &
مجموعة Cloud Workstations
- افتح محطات عمل Cloud في Cloud Console. انتظِر إلى أن تصبح حالة المجموعة
READY.
إنشاء إعدادات "محطات عمل لتعديل المحتوى"
- إذا تم قطع اتصال جلسة Cloud Shell، انقر على "إعادة الاتصال" ثم نفِّذ أمر gcloud cli لضبط رقم تعريف المشروع. استبدِل رقم تعريف المشروع النموذجي أدناه برقم تعريف مشروعك على Qwiklabs قبل تنفيذ الأمر.
gcloud config set project qwiklabs-gcp-project-id
- نزِّل النص البرمجي أدناه وشغِّله في الوحدة الطرفية لإنشاء إعدادات Cloud Workstations.
wget https://raw.githubusercontent.com/GoogleCloudPlatform/container-developer-workshop/main/labs/python/workstation_config_setup.sh
chmod +x workstation_config_setup.sh
./workstation_config_setup.sh
- تحقَّق من النتائج ضمن قسم "الإعدادات". سيستغرق الانتقال إلى الحالة READY دقيقتَين.

- افتح محطات عمل Cloud في "وحدة التحكّم" وأنشئ مثيلاً جديدًا.

- غيِّر الاسم إلى
my-workstationواختَر الإعداد الحالي:codeoss-python.

- تحقَّق من النتائج ضمن قسم "محطات العمل".
تشغيل Workstation
- بدء محطة العمل وإطلاقها سيستغرق بدء تشغيل Workstation بضع دقائق.

- السماح بملفات تعريف الارتباط التابعة لجهات خارجية من خلال النقر على الرمز في شريط العناوين


- انقر على "هل تواجهك مشكلة في الموقع الإلكتروني؟".

- انقر على "السماح بملفات تعريف الارتباط".

- بعد تشغيل محطة العمل، سيظهر لك بيئة التطوير المتكاملة Code OSS. انقر على "وضع علامة اكتمال" في صفحة "البدء" في بيئة التطوير المتكاملة لمحطة العمل

3- إنشاء تطبيق Python أوّلي جديد
في هذا القسم، ستنشئ تطبيق Python جديدًا.
- افتح نافذة Terminal جديدة.

- إنشاء دليل جديد وفتحه كمساحة عمل
mkdir music-service && cd music-service
code-oss-cloud-workstations -r --folder-uri="$PWD"
انقر على زر "السماح" إذا ظهرت لك هذه الرسالة، لتتمكّن من نسخ المحتوى ولصقه في محطة العمل.

- أنشئ ملفًا باسم
requirements.txtوانسخ المحتوى التالي فيه

Flask
gunicorn
google-cloud-spanner
ptvsd==4.3.2
- أنشئ ملفًا باسم
app.pyوالصِق الرمز التالي فيه
import os
from flask import Flask, request, jsonify
from google.cloud import spanner
app = Flask(__name__)
@app.route("/")
def hello_world():
message="Hello, World!"
return message
if __name__ == '__main__':
server_port = os.environ.get('PORT', '8080')
app.run(debug=False, port=server_port, host='0.0.0.0')
- أنشئ ملفًا باسم
Dockerfileوالصِق فيه ما يلي
FROM python:3.8
ARG FLASK_DEBUG=0
ENV FLASK_DEBUG=$FLASK_DEBUG
ENV FLASK_APP=app.py
WORKDIR /app
COPY requirements.txt .
RUN pip install --trusted-host pypi.python.org -r requirements.txt
COPY . .
ENTRYPOINT ["python3", "-m", "flask", "run", "--port=8080", "--host=0.0.0.0"]
ملاحظة: يتيح لك FLASK_DEBUG=1 إعادة تحميل تغييرات الرمز تلقائيًا إلى تطبيق Python flask. يتيح لك Dockerfile تمرير هذه القيمة كمعلَمة إنشاء.
إنشاء بيانات
في الوحدة الطرفية، نفِّذ الأمر التالي لإنشاء ملف skaffold.yaml وdeployment.yaml تلقائيين.
- ابدأ Skaffold باستخدام الأمر التالي
skaffold init --generate-manifests
عندما يُطلب منك ذلك، استخدِم الأسهم لتحريك المؤشر ومفتاح المسافة لاختيار الخيارات.
اختيار:
8080للمنفذyلحفظ الإعدادات
تعديل إعدادات Skaffold
- تغيير اسم التطبيق التلقائي
- فتح "
skaffold.yaml" - اختَر اسم الصورة المضبوطة حاليًا على
dockerfile-image - انقر بزر الماوس الأيمن واختَر "تغيير كل التكرارات"
- اكتب الاسم الجديد باللغة
python-app - عدِّل قسم الإنشاء أكثر من ذلك ليصبح
- إضافة
docker.buildArgsإلى بطاقةFLASK_DEBUG=1 - مزامنة الإعدادات لتحميل أي تغييرات على ملفات
*.pyمن بيئة التطوير المتكاملة إلى الحاوية قيد التشغيل
بعد التعديلات، سيكون قسم الإنشاء في ملف skaffold.yaml على النحو التالي:
build:
artifacts:
- image: python-app
docker:
buildArgs:
FLASK_DEBUG: "1"
dockerfile: Dockerfile
sync:
infer:
- '**/*.py'
تعديل ملف إعداد Kubernetes
- تغيير الاسم التلقائي
- فتح ملف
deployment.yaml - اختَر اسم الصورة المضبوطة حاليًا على
dockerfile-image - انقر بزر الماوس الأيمن واختَر "تغيير كل التكرارات"
- اكتب الاسم الجديد باللغة
python-app
4. التعرّف على عملية التطوير
بعد إضافة منطق النشاط التجاري، يمكنك الآن نشر تطبيقك واختباره. سيعرض القسم التالي كيفية استخدام المكوّن الإضافي Cloud Code. يتكامل هذا المكوّن الإضافي مع Skaffold، من بين أمور أخرى، لتبسيط عملية التطوير. عند النشر إلى GKE في الخطوات التالية، ستنشئ Cloud Code وSkaffold تلقائيًا صورة الحاوية، وتدفعها إلى Container Registry، ثم تنشر تطبيق your إلى GKE. يحدث ذلك وراء الكواليس، حيث يتم تجريد التفاصيل بعيدًا عن مسار المطوّر.
تسجيل الدخول إلى Google Cloud
- انقر على رمز Cloud Code واختَر "تسجيل الدخول إلى Google Cloud":

- انقر على "متابعة لتسجيل الدخول".

- تحقَّق من الناتج في "نافذة الأوامر" وافتح الرابط:

- سجِّل الدخول باستخدام بيانات اعتماد الطلاب في Qwiklabs.

- اختَر "السماح":

- انسخ رمز التحقّق وارجع إلى علامة التبويب "محطة العمل".

- ألصِق رمز التحقّق واضغط على Enter.

إضافة مجموعة Kubernetes
- إضافة مجموعة

- اختَر Google Kubernetes Engine:

- اختَر مشروعًا.

- اختَر "python-cluster" الذي تم إنشاؤه في عملية الإعداد الأولية.

- يظهر الآن العنقد في قائمة "عناقيد Kubernetes" ضمن Cloud Code. يمكنك التنقّل في المجموعة واستكشافها من هنا.

ضبط رقم تعريف المشروع الحالي باستخدام gcloud cli
- انسخ رقم تعريف المشروع لهذا الدرس التطبيقي من صفحة Qwiklabs.

- من الوحدة الطرفية، شغِّل أمر gcloud cli لضبط رقم تعريف المشروع. استبدِل رقم تعريف المشروع النموذجي قبل تنفيذ الأمر. استبدِل رقم تعريف المشروع قبل تنفيذ الأمر أدناه.
gcloud config set project qwiklabs-gcp-project-id
النشر على Kubernetes
- في اللوحة أسفل "محرّر Cloud Shell"، انقر على Cloud Code 

- في اللوحة التي تظهر في أعلى الصفحة، اختَر التشغيل على Kubernetes. إذا طُلب منك ذلك، اختَر "نعم" لاستخدام سياق Kubernetes الحالي.

يبدأ هذا الأمر إنشاء الرمز المصدر ثم ينفّذ الاختبارات. سيستغرق إنشاء التطبيق وإجراء الاختبارات بضع دقائق. تشمل هذه الاختبارات اختبارات الوحدات وخطوة التحقّق التي تتحقّق من القواعد التي تم ضبطها لبيئة النشر. تمّت إعداد خطوة التحقّق هذه مسبقًا، وهي تضمن تلقّي تحذير بشأن مشاكل النشر حتى أثناء العمل في بيئة التطوير.
- في المرة الأولى التي تنفّذ فيها الأمر، سيظهر طلب في أعلى الشاشة يسألك عمّا إذا كنت تريد سياق Kubernetes الحالي، اختَر "نعم" للقبول واستخدام السياق الحالي.
- بعد ذلك، ستظهر رسالة تطلب منك تحديد سجلّ الحاويات الذي تريد استخدامه. اضغط على مفتاح Enter لقبول القيمة التلقائية المقدَّمة
- اختَر علامة التبويب "الإخراج" في اللوحة السفلية للاطّلاع على مستوى التقدّم والإشعارات. استخدِم القائمة المنسدلة لاختيار "Kubernetes: تشغيل/تصحيح الأخطاء"

- اختَر "Kubernetes: Run/Debug - Detailed" (Kubernetes: تشغيل/تصحيح الأخطاء - تفصيلي) في القائمة المنسدلة للقناة على اليسار لعرض تفاصيل إضافية وسجلات يتم بثها مباشرةً من الحاويات.

عند اكتمال عملية الإنشاء والاختبارات، ستتضمّن سجلّات علامة التبويب "الإخراج" عنوان URL http://localhost:8080 المُدرَج في العرض "Kubernetes: تشغيل/تصحيح الأخطاء".
- في نافذة Cloud Code الطرفية، مرِّر مؤشر الماوس فوق عنوان URL الأول في الناتج (http://localhost:8080)، ثم انقر على Open Web Preview (فتح معاينة الويب) في تلميح الأداة الذي يظهر.
- سيتم فتح علامة تبويب جديدة في المتصفّح وعرض الرسالة
Hello, World!
إعادة التحميل السريع
- افتح ملف
app.py - تغيير رسالة الترحيب إلى
Hello from Python
لاحظ على الفور أنّه في نافذة Output، في طريقة العرض Kubernetes: Run/Debug، يزامن برنامج المراقبة الملفات المعدَّلة مع الحاوية في Kubernetes.
Update initiated Build started for artifact python-app Build completed for artifact python-app Deploy started Deploy completed Status check started Resource pod/python-app-6f646ffcbb-tn7qd status updated to In Progress Resource deployment/python-app status updated to In Progress Resource deployment/python-app status completed successfully Status check succeeded ...
- إذا انتقلت إلى طريقة العرض
Kubernetes: Run/Debug - Detailed، ستلاحظ أنّها تتعرّف على تغييرات الملفات ثم تنشئ التطبيق وتعيد نشره.
files modified: [app.py]
Syncing 1 files for gcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Copying files:map[app.py:[/app/app.py]]togcr.io/veer-pylab-01/python-app:3c04f58-dirty@sha256:a42ca7250851c2f2570ff05209f108c5491d13d2b453bb9608c7b4af511109bd
Watching for changes...
[python-app] * Detected change in '/app/app.py', reloading
[python-app] * Restarting with stat
[python-app] * Debugger is active!
[python-app] * Debugger PIN: 744-729-662
- أعِد تحميل علامة تبويب المتصفح التي ظهرت فيها النتائج السابقة للاطّلاع على النتائج المعدَّلة.
تصحيح الأخطاء
- انتقِل إلى "عرض تصحيح الأخطاء" وأوقِف سلسلة المحادثات الحالية
. إذا طُلب منك ذلك، يمكنك اختيار التنظيف بعد كل عملية تشغيل. 
- انقر على
Cloud Codeفي القائمة السفلية، ثم اختَرDebug on Kubernetesلتشغيل التطبيق في وضعdebug.
- في طريقة العرض
Kubernetes Run/Debug - DetailedلنافذةOutput، لاحظ أنّ Skaffold سينشر هذا التطبيق في وضع تصحيح الأخطاء.
- عند اكتمال العملية ستلاحظ ربط أداة تصحيح الأخطاء وعلامة التبويب "الإخراج" التي تعرض:
Attached debugger to container "python-app-8476f4bbc-h6dsl" successfully.، وسيتم إدراج عنوان URL http://localhost:8080.
Port forwarding pod/python-app-8bd64cf8b-cskfl in namespace default, remote port 5678 -> http://127.0.0.1:5678
- يتغيّر لون شريط الحالة السفلي من الأزرق إلى البرتقالي للإشارة إلى أنّه في "وضع تصحيح الأخطاء".
- في العرض
Kubernetes Run/Debug، لاحظ أنّه تم بدء تشغيل حاوية قابلة للتصحيح
**************URLs***************** Forwarded URL from service python-app: http://localhost:8080 Debuggable container started pod/python-app-8bd64cf8b-cskfl:python-app (default) Update succeeded ***********************************
استخدام نقاط الإيقاف
- افتح ملف
app.py - ابحث عن العبارة التي تقول
return message - أضِف نقطة توقّف إلى هذا السطر من خلال النقر على المساحة الفارغة على يمين رقم السطر. سيظهر مؤشر أحمر للإشارة إلى أنّه تم ضبط نقطة الإيقاف.
- في المرة الأولى التي يتم فيها تشغيل هذا الإجراء، سيظهر طلب يسأل عن مكان المصدر داخل الحاوية. ترتبط هذه القيمة بالأدلة في Dockerfile.
اضغط على Enter لقبول القيمة التلقائية

سيستغرق إنشاء التطبيق ونشره بضع دقائق.
- أعِد تحميل المتصفّح ولاحظ أنّ أداة تصحيح الأخطاء توقف العملية عند نقطة التوقف وتتيح لك التحقّق من المتغيرات وحالة التطبيق الذي يتم تشغيله عن بُعد في GKE.
- انقر على قسم "المتغيّرات"
- انقر على "المتغيرات المحلية"، وستجد المتغير
"message". - انقر مرّتين على اسم المتغيّر "message" (الرسالة)، وفي النافذة المنبثقة، غيِّر القيمة إلى قيمة مختلفة مثل
"Greetings from Python" - انقر على الزر "متابعة" في لوحة التحكّم في تصحيح الأخطاء

- راجِع الردّ في المتصفّح الذي يعرض الآن القيمة المعدَّلة التي أدخلتها للتو.
- أوقِف وضع "تصحيح الأخطاء" من خلال الضغط على زر الإيقاف
وأزِل نقطة التوقف من خلال النقر عليها مرة أخرى.
5- تطوير خدمة REST بسيطة لإنشاء البيانات وقراءتها وتعديلها وحذفها
في هذه المرحلة، يكون تطبيقك قد تم إعداده بالكامل للتطوير ضِمن حاوية، ويكون قد تم إرشادك خلال سير عمل التطوير الأساسي باستخدام Cloud Code. في الأقسام التالية، ستتدرب على ما تعلّمته من خلال إضافة نقاط نهاية لخدمة REST تتصل بقاعدة بيانات مُدارة في Google Cloud.
كتابة رمز خدمة REST
ينشئ الرمز البرمجي أدناه خدمة بسيطة للوصول إلى البيانات من خلال REST تستخدم Spanner كقاعدة بيانات تدعم التطبيق. أنشئ التطبيق عن طريق نسخ الرمز التالي ولصقه في تطبيقك.
- أنشئ التطبيق الرئيسي عن طريق استبدال
app.pyبالمحتويات التالية
import os
from flask import Flask, request, jsonify
from google.cloud import spanner
app = Flask(__name__)
instance_id = "music-catalog"
database_id = "musicians"
spanner_client = spanner.Client()
instance = spanner_client.instance(instance_id)
database = instance.database(database_id)
@app.route("/")
def hello_world():
return "<p>Hello, World!</p>"
@app.route('/singer', methods=['POST'])
def create():
try:
request_json = request.get_json()
singer_id = request_json['singer_id']
first_name = request_json['first_name']
last_name = request_json['last_name']
def insert_singers(transaction):
row_ct = transaction.execute_update(
f"INSERT Singers (SingerId, FirstName, LastName) VALUES" \
f"({singer_id}, '{first_name}', '{last_name}')"
)
print("{} record(s) inserted.".format(row_ct))
database.run_in_transaction(insert_singers)
return {"Success": True}, 200
except Exception as e:
return e
@app.route('/singer', methods=['GET'])
def get_singer():
try:
singer_id = request.args.get('singer_id')
def get_singer():
first_name = ''
last_name = ''
with database.snapshot() as snapshot:
results = snapshot.execute_sql(
f"SELECT SingerId, FirstName, LastName FROM Singers " \
f"where SingerId = {singer_id}",
)
for row in results:
first_name = row[1]
last_name = row[2]
return (first_name,last_name )
first_name, last_name = get_singer()
return {"first_name": first_name, "last_name": last_name }, 200
except Exception as e:
return e
@app.route('/singer', methods=['PUT'])
def update_singer_first_name():
try:
singer_id = request.args.get('singer_id')
request_json = request.get_json()
first_name = request_json['first_name']
def update_singer(transaction):
row_ct = transaction.execute_update(
f"UPDATE Singers SET FirstName = '{first_name}' WHERE SingerId = {singer_id}"
)
print("{} record(s) updated.".format(row_ct))
database.run_in_transaction(update_singer)
return {"Success": True}, 200
except Exception as e:
return e
@app.route('/singer', methods=['DELETE'])
def delete_singer():
try:
singer_id = request.args.get('singer')
def delete_singer(transaction):
row_ct = transaction.execute_update(
f"DELETE FROM Singers WHERE SingerId = {singer_id}"
)
print("{} record(s) deleted.".format(row_ct))
database.run_in_transaction(delete_singer)
return {"Success": True}, 200
except Exception as e:
return e
port = int(os.environ.get('PORT', 8080))
if __name__ == '__main__':
app.run(threaded=True, host='0.0.0.0', port=port)
إضافة إعدادات قاعدة البيانات
للاتصال بـ Spanner بشكل آمن، عليك إعداد التطبيق لاستخدام Workload Identities. يتيح ذلك لتطبيقك العمل كحساب خدمة خاص به والحصول على أذونات فردية عند الوصول إلى قاعدة البيانات.
- تعديل
deployment.yamlأضِف الرمز التالي في نهاية الملف (احرص على الاحتفاظ بمسافات الجدولة في المثال أدناه)
serviceAccountName: python-ksa
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: "true"
بعد إجراء التغييرات، من المفترض أن يبدو قسم المواصفات على النحو التالي
spec:
containers:
- name: python-app
image: python-app
serviceAccountName: python-ksa
nodeSelector:
iam.gke.io/gke-metadata-server-enabled: "true"
نشر التطبيق والتحقّق من صحته
- في اللوحة أسفل "محرّر Cloud Shell"، انقر على
Cloud Codeثم علىDebug on Kubernetesفي أعلى الشاشة. - عند اكتمال عملية الإنشاء والاختبارات، تعرض علامة التبويب "الإخراج"
Resource deployment/python-app status completed successfully، ويتم إدراج عنوان URL: "Forwarded URL from service python-app: http://localhost:8080" - أضِف بضع إدخالات.
من "وحدة Cloudshell الطرفية"، شغِّل الأمر أدناه
curl -X POST http://localhost:8080/singer -H 'Content-Type: application/json' -d '{"first_name":"Cat","last_name":"Meow", "singer_id": 6}'
- اختبِر طلب GET من خلال تنفيذ الأمر أدناه في الوحدة الطرفية
curl -X GET http://localhost:8080/singer?singer_id=6
- اختبار الحذف: جرِّب الآن حذف إدخال من خلال تنفيذ الأمر التالي. غيِّر قيمة item-id إذا لزم الأمر.
curl -X DELETE http://localhost:8080/singer?singer_id=6
This throws an error message
500 Internal Server Error
تحديد المشكلة وحلّها
- استخدِم وضع تصحيح الأخطاء للعثور على المشكلة. إليك بعض النصائح:
- ندرك أنّ هناك مشكلة في الأمر DELETE لأنّه لا يعرض النتيجة المطلوبة. لذلك، عليك ضبط نقطة التوقّف في
app.pyفي الطريقةdelete_singer. - نفِّذ التعليمات البرمجية خطوة بخطوة وراقِب المتغيرات في كل خطوة لملاحظة قيم المتغيرات المحلية في النافذة اليمنى.
- لمراقبة قيم محدّدة مثل
singer_idوrequest.args، أضِف هذه المتغيّرات إلى نافذة "المراقبة".
- لاحظ أنّ القيمة المعيّنة لـ
singer_idهيNone. غيِّر الرمز البرمجي لحلّ المشكلة.
سيبدو مقتطف الرمز الثابت على النحو التالي.
@app.route('/delete-singer', methods=['DELETE', 'GET'])
def delete_singer():
try:
singer_id = request.args.get('singer_id')
- بعد إعادة تشغيل التطبيق، اختبِر مرة أخرى من خلال محاولة الحذف.
- أوقِف جلسة تصحيح الأخطاء من خلال النقر على المربّع الأحمر في شريط أدوات تصحيح الأخطاء

6. تنظيف
تهانينا! في هذا التمرين المعملي، أنشأت تطبيق Python جديدًا من البداية وأعددته للعمل بفعالية مع الحاويات. بعد ذلك، نشرت تطبيقك وأصلحت أخطاءه في مجموعة GKE بعيدة باتّباع مسار المطوّر نفسه المتوفّر في حِزم التطبيقات التقليدية.
لإجراء عملية تنظيف بعد إكمال الدرس التطبيقي، اتّبِع الخطوات التالية:
- حذف الملفات المستخدَمة في المختبر
cd ~ && rm -rf ~/music-service
- احذف المشروع لإزالة جميع البنية الأساسية والموارد ذات الصلة
