1. مقدمة
في هذا الدرس التطبيقي حول الترميز، ستتعلّم كيفية إنشاء ونشر "مخطّط نظام غذائي" يستند إلى الذكاء الاصطناعي. بالنسبة إلى واجهة المستخدم التي تستخدم Streamlit، ونموذج LLM الذي يستخدم Gemini Pro 2.5، وAgentic AI Engine Orchestrator الذي يستخدم Vertex AI لتطوير Agentic AI، وBigQuery لتخزين البيانات، وCloud Run للنشر.
خلال هذا الدرس العملي، ستتّبع نهجًا خطوة بخطوة على النحو التالي:
- إعداد مشروعك على Google Cloud وتفعيل جميع واجهات برمجة التطبيقات المطلوبة فيه
- إنشاء "مخطّط نظام غذائي" مستند إلى الذكاء الاصطناعي باستخدام Streamlit وVertex AI وBigQuery
- نشر التطبيق على Cloud Run
نظرة عامة على البنية
المتطلبات الأساسية
- مشروع على Google Cloud Platform (GCP) مع تفعيل الفوترة
- معرفة أساسية بلغة Python
ما ستتعرّف عليه
- How to build Agentic AI Diet Planner using streamlit, Vertex AI and store data to BigQuery
- كيفية نشر التطبيق على Cloud Run
المتطلبات
- متصفّح الويب Chrome
- حساب Gmail
- مشروع على السحابة الإلكترونية تم تفعيل الفوترة فيه
2. الإعداد الأساسي والمتطلبات
إعداد البيئة بالوتيرة التي تناسبك
- سجِّل الدخول إلى Google Cloud Console وأنشِئ مشروعًا جديدًا أو أعِد استخدام مشروع حالي. إذا لم يكن لديك حساب على Gmail أو Google Workspace، عليك إنشاء حساب.
- اسم المشروع هو الاسم المعروض للمشاركين في هذا المشروع. وهي سلسلة أحرف لا تستخدمها Google APIs. ويمكنك تعديلها في أي وقت.
- معرّف المشروع فريد في جميع مشاريع Google Cloud ولا يمكن تغييره (لا يمكن تغييره بعد ضبطه). تنشئ Cloud Console تلقائيًا سلسلة فريدة، ولا يهمّك عادةً ما هي. في معظم دروس البرمجة، عليك الرجوع إلى رقم تعريف مشروعك (يُشار إليه عادةً باسم
PROJECT_ID
). إذا لم يعجبك رقم التعريف الذي تم إنشاؤه، يمكنك إنشاء رقم تعريف عشوائي آخر. يمكنك بدلاً من ذلك تجربة اسم مستخدم من اختيارك ومعرفة ما إذا كان متاحًا. لا يمكن تغييرها بعد هذه الخطوة وتبقى سارية طوال مدة المشروع. - للعلم، هناك قيمة ثالثة، وهي رقم المشروع، تستخدمها بعض واجهات برمجة التطبيقات. يمكنك الاطّلاع على مزيد من المعلومات حول هذه القيم الثلاث في المستندات.
- بعد ذلك، عليك تفعيل الفوترة في Cloud Console لاستخدام موارد/واجهات برمجة تطبيقات Cloud. لن تكلفك تجربة هذا الدرس البرمجي الكثير، إن وُجدت أي تكلفة على الإطلاق. لإيقاف الموارد وتجنُّب تحمّل تكاليف تتجاوز هذا البرنامج التعليمي، يمكنك حذف الموارد التي أنشأتها أو حذف المشروع. يمكن لمستخدمي Google Cloud الجدد الاستفادة من برنامج الفترة التجريبية المجانية بقيمة 300 دولار أمريكي.
3- قبل البدء
إعداد مشروع Cloud في "محرّر Cloud Shell"
يفترض هذا الدرس العملي أنّ لديك مشروعًا على Google Cloud تم تفعيل الفوترة فيه. إذا لم تكن هذه الميزة متاحة لك بعد، يمكنك اتّباع التعليمات أدناه للبدء.
- في Google Cloud Console، في صفحة اختيار المشروع، اختَر أو أنشِئ مشروعًا على Google Cloud.
- تأكَّد من تفعيل الفوترة لمشروعك على Cloud. تعرَّف على كيفية التحقّق مما إذا كانت الفوترة مفعَّلة في مشروع .
- ستستخدم Cloud Shell، وهي بيئة سطر أوامر تعمل في Google Cloud ومحمّلة مسبقًا بأداة bq. انقر على "تفعيل Cloud Shell" في أعلى "وحدة تحكّم Google Cloud".
- بعد الاتصال بـ Cloud Shell، يمكنك التأكّد من أنّك قد تم التحقّق من هويتك وأنّه تم ضبط المشروع على معرّف مشروعك باستخدام الأمر التالي:
gcloud auth list
- نفِّذ الأمر التالي في Cloud Shell للتأكّد من أنّ أمر gcloud يعرف مشروعك.
gcloud config list project
- إذا لم يتم ضبط مشروعك، استخدِم الأمر التالي لضبطه:
gcloud config set project <YOUR_PROJECT_ID>
بدلاً من ذلك، يمكنك أيضًا الاطّلاع على معرّف PROJECT_ID
في وحدة التحكّم.
انقر عليه وسيظهر لك كل مشروعك ورقم تعريف المشروع على الجانب الأيسر
- فعِّل واجهات برمجة التطبيقات المطلوبة من خلال الأمر الموضّح أدناه. قد تستغرق هذه العملية بضع دقائق، لذا يُرجى الانتظار.
gcloud services enable aiplatform.googleapis.com \
run.googleapis.com \
cloudbuild.googleapis.com \
cloudresourcemanager.googleapis.com \
bigquery.googleapis.com
عند تنفيذ الأمر بنجاح، من المفترض أن تظهر لك رسالة مشابهة للرسالة الموضّحة أدناه:
Operation "operations/..." finished successfully.
يمكنك بدلاً من استخدام أمر gcloud، البحث عن كل منتج من خلال وحدة التحكّم أو استخدام هذا الرابط.
في حال عدم توفّر أي واجهة برمجة تطبيقات، يمكنك تفعيلها في أي وقت أثناء عملية التنفيذ.
راجِع المستندات لمعرفة أوامر gcloud وطريقة استخدامها.
إعداد دليل عمل التطبيق
- انقر على الزر "فتح المحرِّر" (Open Editor)، وسيؤدي ذلك إلى فتح "محرِّر Cloud Shell" (Cloud Shell Editor)، ويمكننا كتابة الرمز هنا
- تأكَّد من ضبط مشروع Cloud Code في أسفل يمين (شريط الحالة) محرر Cloud Shell، كما هو موضّح في الصورة أدناه، ومن ضبطه على مشروع Google Cloud النشط الذي تم تفعيل الفوترة فيه. امنح الإذن إذا طُلب منك ذلك. قد يستغرق ظهور الزر Cloud Code - Sign In بعض الوقت بعد تهيئة Cloud Shell Editor، لذا يُرجى الانتظار.
بعد ذلك، سنجهّز بيئة Python
إعداد البيئة
إعداد بيئة Python الافتراضية
الخطوة التالية هي إعداد بيئة التطوير. سنستخدم الإصدار 3.12 من لغة Python في هذا الدرس العملي، كما سنستخدم بيئة python virtualenv لتسهيل عملية إنشاء إصدار Python وبيئته الافتراضية وإدارتهما.
- إذا لم تكن قد فتحت الوحدة الطرفية بعد، افتحها بالنقر على الوحدة الطرفية (Terminal) -> وحدة طرفية جديدة (New Terminal)، أو استخدِم Ctrl + Shift + C
- أنشئ مجلدًا جديدًا وغيِّر الموقع الجغرافي إلى هذا المجلد باستخدام الأمر التالي
mkdir agent_diet_planner
cd agent_diet_planner
- إنشاء بيئة افتراضية جديدة باستخدام الأمر التالي
python -m venv .env
- تفعيل virtualenv باستخدام الأمر التالي
source .env/bin/activate
- أنشئ
requirements.txt
. انقر على "ملف" → "ملف نصي جديد" واملأه بالمحتوى أدناه. ثم احفظه بتنسيقrequirements.txt
.
streamlit==1.33.0
google-cloud-aiplatform
google-cloud-bigquery
pandas==2.2.2
db-dtypes==1.2.0
pyarrow==16.1.0
- بعد ذلك، ثبِّت جميع الحِزم التابعة من ملف requirements.txt باستخدام الأمر التالي
pip install -r requirements.txt
- اكتب الأمر التالي أدناه للتحقّق من تثبيت جميع الاعتمادات الخاصة بمكتبات Python
pip list
إعداد ملفات الإعداد
الآن، علينا إعداد ملفات الإعداد لهذا المشروع. تُستخدَم ملفات الإعدادات لتخزين بيانات اعتماد حساب الخدمة والمتغيرات.
- تتمثل الخطوة الأولى في إنشاء حساب خدمة. اكتب "حساب الخدمة" في شريط البحث، ثم انقر على "حساب الخدمة".
- انقر على "إنشاء حساب خدمة" (+). أدخِل اسم حساب الخدمة، ثم انقر على "إنشاء ومتابعة".
- في الإذن، اختَر دور "مستخدم حساب الخدمة". انقر على "إضافة دور آخر" (+) واختَر دور إدارة الهوية وإمكانية الوصول: "مشرف BigQuery" و"مشرف Cloud Run" و"مستدعي Cloud Run" و"وكيل خدمة Vertex AI" و"مستخدم Vertex AI"، ثم انقر على "تم"
- انقر على "البريد الإلكتروني لحساب الخدمة"، ثم على مفتاح التبويب، ثم على "إضافة مفتاح" → "إنشاء مفتاح جديد".
- اختَر json ثم انقر على "إنشاء". احفظ ملف حساب الخدمة هذا على الجهاز لتنفيذ الخطوة التالية
- أنشئ مجلدًا باسم .streamlit بالإعدادات التالية. انقر بزر الماوس الأيمن، ثم انقر على "مجلد جديد" واكتب اسم المجلد
.streamlit
- انقر بزر الماوس الأيمن في المجلد
.streamlit
، ثم انقر على "ملف جديد" واملأه بالقيمة أدناه. ثم احفظه بتنسيقsecrets.toml
.
# secrets.toml (for Streamlit sharing)
# Store in .streamlit/secrets.toml
[gcp]
project_id = "your_gcp_project"
location = "us-central1"
[gcp_service_account]
type = "service_account"
project_id = "your-project-id"
private_key_id = "your-private-key-id"
private_key = '''-----BEGIN PRIVATE KEY-----
YOUR_PRIVATE_KEY_HERE
-----END PRIVATE KEY-----'''
client_email = "your-sa@project-id.iam.gserviceaccount.com"
client_id = "your-client-id"
auth_uri = "https://accounts.google.com/o/oauth2/auth"
token_uri = "https://oauth2.googleapis.com/token"
auth_provider_x509_cert_url = "https://www.googleapis.com/oauth2/v1/certs"
client_x509_cert_url = "https://www.googleapis.com/robot/v1/metadata/x509/your-sa%40project-id.iam.gserviceaccount.com"
- عدِّل قيمة
project_id
وprivate_key_id
وprivate_key
وclient_email
وclient_id , and auth_provider_x509_cert_url
استنادًا إلى حساب الخدمة الذي تم إنشاؤه في الخطوة السابقة.
إعداد مجموعة بيانات BigQuery
الخطوة التالية هي إنشاء مجموعة بيانات BigQuery لحفظ نتائج الإنشاء في BigQuery.
- اكتب BigQuery في شريط البحث، ثم انقر على BigQuery.
- انقر على
، ثم انقر على "إنشاء مجموعة بيانات".
- أدخِل معرّف مجموعة البيانات
diet_planner_data
، ثم انقر على "إنشاء مجموعة بيانات".
4. إنشاء تطبيقات "مخطِّط النظام الغذائي للوكلاء"
سننشئ واجهة ويب بسيطة تتضمّن 4 حقول إدخال تبدو على النحو التالي
غيِّر الوزن والطول والعمر والجنس استنادًا إلى ملفك الشخصي، ثم انقر على "إنشاء". سيتم استدعاء نموذج Gemini Pro 2.5 اللغوي الكبير في مكتبة Vertex AI وتخزين النتائج التي تم إنشاؤها في BigQuery.
سيتم تقسيم الرمز إلى 6 أجزاء لكي لا يكون طويلاً جدًا.
إنشاء الدالة calculate bmi status
- انقر بزر الماوس الأيمن على المجلد
agent_diet_planner
→ ملف جديد .. → أدخِل اسم الملفbmi_calc.py
ثم اضغط على Enter - ملء الرمز بما يلي
# Add this function to calculate BMI and health status
def calculate_bmi_status(weight, height):
"""
Calculate BMI and return status message
"""
height_m = height / 100 # Convert cm to meters
bmi = weight / (height_m ** 2)
if bmi < 18.5:
status = "underweight"
message = "⚠️ Your BMI suggests you're underweight. Consider increasing calorie intake with nutrient-dense foods."
elif 18.5 <= bmi < 25:
status = "normal"
message = "✅ Your BMI is in the healthy range. Let's maintain this balance!"
elif 25 <= bmi < 30:
status = "overweight"
message = "⚠️ Your BMI suggests you're overweight. Focus on gradual weight loss through balanced nutrition."
else:
status = "obese"
message = "❗ Your BMI indicates obesity. Please consult a healthcare provider for personalized guidance."
return {
"value": round(bmi, 1),
"status": status,
"message": message
}
Create agent diet planner main apps
- انقر بزر الماوس الأيمن على المجلد
agent_diet_planner
→ ملف جديد .. → أدخِل اسم الملفapp.py
ثم اضغط على Enter. - ملء الرمز بما يلي
import os
from google.oauth2 import service_account
import streamlit as st
from google.cloud import bigquery
from vertexai.preview.generative_models import GenerativeModel
import vertexai
import datetime
import time
import pandas as pd
from bmi_calc import calculate_bmi_status
# Get configuration from environment
PROJECT_ID = os.environ.get("GCP_PROJECT_ID", "your_gcp_project_id")
LOCATION = os.environ.get("GCP_LOCATION", "us-central1")
#CONSTANTS Dataset and table in BigQuery
DATASET = "diet_planner_data"
TABLE = "user_plans"
# Initialize Vertex AI
vertexai.init(project=PROJECT_ID, location=LOCATION)
# Initialize BigQuery client
try:
# For Cloud Run, use default credentials
bq_client = bigquery.Client()
except:
# For local development, use service account from secrets
if "gcp_service_account" in st.secrets:
service_account_info = dict(st.secrets["gcp_service_account"])
credentials = service_account.Credentials.from_service_account_info(service_account_info)
bq_client = bigquery.Client(credentials=credentials, project=PROJECT_ID)
else:
st.error("BigQuery client initialization failed")
st.stop()
استبدِل القيمة your_gcp_project_id
برقم تعريف مشروعك.
إنشاء التطبيقات الرئيسية لمخطط النظام الغذائي الخاص بالوكيل - setup_bq_tables
في هذا القسم، سننشئ دالة باسم setup_bq_table
مع مَعلمة إدخال واحدة bq_client
. ستحدّد هذه الدالة المخطط في جدول BigQuery وتنشئ جدولاً إذا لم يكن متوفّرًا.
ملء الرمز بما يلي أسفل الرمز السابق في app.py
# Create BigQuery table if not exists
def setup_bq_table(bq_client):
dataset_id = f"{st.secrets['gcp']['project_id']}.{DATASET}"
table_id = f"{dataset_id}.{TABLE}"
schema = [
bigquery.SchemaField("user_id", "STRING", mode="REQUIRED"),
bigquery.SchemaField("timestamp", "TIMESTAMP", mode="REQUIRED"),
bigquery.SchemaField("weight", "FLOAT", mode="REQUIRED"),
bigquery.SchemaField("height", "INTEGER", mode="REQUIRED"),
bigquery.SchemaField("age", "INTEGER", mode="REQUIRED"),
bigquery.SchemaField("gender", "STRING", mode="REQUIRED"),
bigquery.SchemaField("diet_plan", "STRING", mode="REQUIRED")
]
try:
bq_client.get_table(table_id)
except:
table = bigquery.Table(table_id, schema=schema)
bq_client.create_table(table)
st.toast("BigQuery table created successfully")
إنشاء تطبيقات رئيسية لمخطِّط النظام الغذائي الخاص بالوكيل - generate_diet_plan
في هذا القسم، سننشئ دالة باسم generate_diet_plan
تتضمّن مَعلمة إدخال واحدة. ستستدعي هذه الدالة نموذج اللغة الكبير Gemini Pro 2.5 مع طلب التحديد وتنشئ النتائج.
ملء الرمز بما يلي أسفل الرمز السابق في app.py
# Generate diet plan using Gemini Pro
def generate_diet_plan(params):
try:
model = GenerativeModel("gemini-2.5-pro")
prompt = f"""
Create a personalized 7-day diet plan for:
- {params['gender']}, {params['age']} years old
- Weight: {params['weight']} kg
- Height: {params['height']} cm
Include:
1. Daily calorie target
2. Macronutrient breakdown (carbs, protein, fat)
3. Meal timing and frequency
4. Food recommendations
5. Hydration guidance
Make the plan:
- Nutritionally balanced
- Practical for daily use
- Culturally adaptable
- With portion size guidance
"""
response = model.generate_content(prompt)
return response.text
except Exception as e:
st.error(f"AI generation error: {str(e)}")
return None
إنشاء تطبيقات رئيسية خاصة بمخطط النظام الغذائي للوكيل - save_to_bq
في هذا القسم، سننشئ دالة باسم save_to_bq
تتضمّن 3 مَعلمات إدخال : bq_client
وuser_id
وplan
. ستحفظ هذه الدالة نتيجة الإنشاء في جدول BigQuery.
ملء الرمز بما يلي أسفل الرمز السابق في app.py
# Save user data to BigQuery
def save_to_bq(bq_client, user_id, plan):
try:
dataset_id = f"{st.secrets['gcp']['project_id']}.{DATASET}"
table_id = f"{dataset_id}.{TABLE}"
row = {
"user_id": user_id,
"timestamp": datetime.datetime.utcnow().isoformat(),
"weight": st.session_state.user_data["weight"],
"height": st.session_state.user_data["height"],
"age": st.session_state.user_data["age"],
"gender": st.session_state.user_data["gender"],
"diet_plan": plan
}
errors = bq_client.insert_rows_json(table_id, [row])
if errors:
st.error(f"BigQuery error: {errors}")
else:
return True
except Exception as e:
st.error(f"Data saving error: {str(e)}")
return False
Create agent diet planner main apps - main
في هذا القسم، سننشئ دالة باسم main
بدون مَعلمة إدخال. تتعامل هذه الدالة في الغالب مع نص برمجي لواجهة مستخدم Streamlit، وتعرض النتيجة التي تم إنشاؤها، وتعرض النتيجة السابقة التي تم إنشاؤها من جدول BigQuery، وتتيح تنزيل البيانات إلى ملف Markdown.
ملء الرمز بما يلي أسفل الرمز السابق في app.py
# Streamlit UI
def main():
st.set_page_config(page_title="AI Diet Planner", page_icon="🍏", layout="wide")
# Initialize session state
if "user_data" not in st.session_state:
st.session_state.user_data = None
if "diet_plan" not in st.session_state:
st.session_state.diet_plan = None
# Initialize clients
#bq_client = init_clients()
setup_bq_table(bq_client)
st.title("🍏 AI-Powered Diet Planner")
st.markdown("""
<style>
.stProgress > div > div > div > div {
background-color: #4CAF50;
}
[data-testid="stForm"] {
background: #f0f5ff;
padding: 20px;
border-radius: 10px;
border: 1px solid #e6e9ef;
}
</style>
""", unsafe_allow_html=True)
# User input form
with st.form("user_profile", clear_on_submit=False):
st.subheader("Your Profile")
col1, col2 = st.columns(2)
with col1:
weight = st.number_input("Weight (kg)", min_value=30.0, max_value=200.0, value=70.0)
height = st.number_input("Height (cm)", min_value=100, max_value=250, value=170)
with col2:
age = st.number_input("Age", min_value=18, max_value=100, value=30)
gender = st.selectbox("Gender", ["Man", "Woman"])
submitted = st.form_submit_button("Generate Diet Plan")
if submitted:
user_data = {
"weight": weight,
"height": height,
"age": age,
"gender": gender
}
st.session_state.user_data = user_data
# Calculate BMI
bmi_result = calculate_bmi_status(weight, height)
# Display BMI results in a visually distinct box
with st.container():
st.subheader("📊 Your Health Assessment")
col1, col2 = st.columns([1, 3])
with col1:
st.metric("BMI", bmi_result["value"])
with col2:
if bmi_result["status"] != "normal":
st.warning(bmi_result["message"])
else:
st.success(bmi_result["message"])
# Add BMI scale visualization
st.markdown(f"""
<div style="background:#f0f2f6;padding:10px;border-radius:10px;margin-top:10px">
<small>BMI Scale:</small><br>
<div style="display:flex;height:20px;background:linear-gradient(90deg,
#4e79a7 0%,
#4e79a7 18.5%,
#60bd68 18.5%,
#60bd68 25%,
#f28e2b 25%,
#f28e2b 30%,
#e15759 30%,
#e15759 100%);position:relative">
<div style="position:absolute;left:{min(100, max(0, (bmi_result["value"]/40)*100))}%;top:-5px">
▼
</div>
</div>
<div style="display:flex;justify-content:space-between">
<span>Underweight (<18.5)</span>
<span>Healthy (18.5-25)</span>
<span>Overweight (25-30)</span>
<span>Obese (30+)</span>
</div>
</div>
""", unsafe_allow_html=True)
# Store BMI in session state
st.session_state.bmi = bmi_result
# Plan generation and display
if submitted and st.session_state.user_data:
with st.spinner("🧠 Generating your personalized diet plan using Gemini AI..."):
#diet_plan = generate_diet_plan(st.session_state.user_data)
diet_plan = generate_diet_plan({**st.session_state.user_data,"bmi": bmi_result["value"],
"bmi_status": bmi_result["status"]
})
if diet_plan:
st.session_state.diet_plan = diet_plan
# Generate unique user ID
user_id = f"user_{int(time.time())}"
# Save to BigQuery
if save_to_bq(bq_client, user_id, diet_plan):
st.toast("✅ Plan saved to database!")
# Display generated plan
if st.session_state.diet_plan:
st.subheader("Your Personalized Diet Plan")
st.markdown("---")
st.markdown(st.session_state.diet_plan)
# Download button
st.download_button(
label="Download Plan",
data=st.session_state.diet_plan,
file_name="my_diet_plan.md",
mime="text/markdown"
)
# Show history
st.subheader("Your Plan History")
try:
query = f"""
SELECT timestamp, weight, height, age, gender
FROM `{st.secrets['gcp']['project_id']}.{DATASET}.{TABLE}`
WHERE user_id LIKE 'user_%'
ORDER BY timestamp DESC
LIMIT 5
"""
history = bq_client.query(query).to_dataframe()
if not history.empty:
history["timestamp"] = pd.to_datetime(history["timestamp"])
st.dataframe(history.style.format({
"weight": "{:.1f} kg",
"height": "{:.0f} cm"
}))
else:
st.info("No previous plans found")
except Exception as e:
st.error(f"History load error: {str(e)}")
if __name__ == "__main__":
main()
احفظ الرمز بالاسم app.py.
5- نشر التطبيقات باستخدام Cloud Build على Cloud Run
بالطبع، نريد أن نعرض هذا التطبيق الرائع على الآخرين. ولإجراء ذلك، يمكننا تجميع هذا التطبيق ونشره على Cloud Run كخدمة عامة يمكن للآخرين الوصول إليها. لإجراء ذلك، لنراجع البنية
أولاً، نحتاج إلى Dockerfile. انقر على ملف (File) > ملف نصي جديد (New Text File)، ثم انسخ الرمز التالي والصقه، ثم احفظه باسم Dockerfile.
# Use official Python image
FROM python:3.12-slim
# Set environment variables
ENV PYTHONDONTWRITEBYTECODE 1
ENV PYTHONUNBUFFERED 1
ENV PORT 8080
# Install system dependencies
RUN apt-get update && \
apt-get install -y --no-install-recommends \
build-essential \
libpq-dev \
&& rm -rf /var/lib/apt/lists/*
# Set working directory
WORKDIR /app
# Copy requirements
COPY requirements.txt .
# Install Python dependencies
RUN pip install --no-cache-dir -r requirements.txt
# Copy application files
COPY . .
# Expose port
EXPOSE $PORT
# Run the application
CMD ["streamlit", "run", "app.py", "--server.port", "8080", "--server.address", "0.0.0.0"]
بعد ذلك، سننشئ ملف cloudbuild.yaml لإنشاء تطبيقات لتصبح صور Docker، ونحمّلها إلى Artifact Registry وننشرها على Cloud Run.
انقر على ملف (File) -> ملف نصي جديد (New Text File)، وانسخ الرمز التالي والصقه ثم احفظه باسم cloudbuild.yaml.
steps:
# Build Docker image
- name: 'gcr.io/cloud-builders/docker'
args: ['build', '-t', 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID', '--no-cache',
'--progress=plain',
'.']
id: 'Build'
timeout: 1200s
waitFor: ['-']
dir: '.'
# Push to Container Registry
- name: 'gcr.io/cloud-builders/docker'
args: ['push', 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID']
id: 'Push'
waitFor: ['Build']
# Deploy to Cloud Run
- name: 'gcr.io/google.com/cloudsdktool/cloud-sdk'
entrypoint: gcloud
args:
- 'run'
- 'deploy'
- 'diet-planner-service'
- '--image=gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID'
- '--port=8080'
- '--region=us-central1'
- '--platform=managed'
- '--allow-unauthenticated'
- '--set-env-vars=GCP_PROJECT_ID=$PROJECT_ID,GCP_LOCATION=us-central1'
- '--cpu=1'
- '--memory=1Gi'
- '--timeout=300'
waitFor: ['Push']
options:
logging: CLOUD_LOGGING_ONLY
machineType: 'E2_HIGHCPU_8'
diskSizeGb: 100
images:
- 'gcr.io/$PROJECT_ID/diet-planner:$BUILD_ID'
في هذه المرحلة، تتوفّر لدينا جميع الملفات اللازمة لإنشاء تطبيقات لتصبح صور Docker، ويمكننا نقلها إلى مستودع Artifact Registry ونشرها على Cloud Run. انتقِل إلى "وحدة Cloud Shell الطرفية" وتأكَّد من ضبط المشروع الحالي على مشروعك النشط. وإذا لم يكن كذلك، عليك استخدام الأمر gcloud configure لضبط رقم تعريف المشروع:
gcloud config set project [PROJECT_ID]
بعد ذلك، شغِّل الأمر التالي لإنشاء تطبيقات لتصبح صور Docker، ثم أرسِلها إلى Artifact Registry ونشِّرها على Cloud Run.
gcloud builds submit --config cloudbuild.yaml
سيتم إنشاء حاوية Docker استنادًا إلى ملف Dockerfile الذي قدّمناه سابقًا، وسيتم إرسالها إلى Artifact Registry. بعد ذلك، سننشر الصورة التي تم إنشاؤها على Cloud Run. يتم تحديد كل هذه العملية في cloudbuild.yaml
خطوات.
يُرجى العِلم أنّنا نسمح بالوصول غير المصادَق عليه هنا لأنّ هذا التطبيق هو تطبيق تجريبي. ننصحك باستخدام المصادقة المناسبة لتطبيقات المؤسسة والإنتاج.
بعد اكتمال عملية النشر، يمكننا التحقّق منها في صفحة Cloud Run، والبحث عن Cloud Run في شريط البحث العلوي في "وحدة تحكّم Google Cloud" والنقر على منتج Cloud Run.
بعد ذلك، يمكنك فحص الخدمة التي تم نشرها والمدرَجة في صفحة "خدمة Cloud Run"، ثم النقر على الخدمة للحصول على عنوان URL الخاص بها.
سيظهر عنوان URL الخاص بالخدمة على الشريط العلوي
يمكنك الآن استخدام تطبيقك من نافذة التصفّح المتخفي أو جهازك الجوّال. من المفترض أن يكون قد تم نشره.
6. تَنظيم
لتجنُّب تحمّل رسوم في حسابك على Google Cloud مقابل الموارد المستخدَمة في هذا الدرس العملي، اتّبِع الخطوات التالية:
- في Google Cloud Console، انتقِل إلى صفحة إدارة الموارد.
- في قائمة المشاريع، اختَر المشروع الذي تريد حذفه، ثم انقر على حذف.
- في مربّع الحوار، اكتب رقم تعريف المشروع، ثم انقر على إيقاف لحذف المشروع.
- بدلاً من ذلك، يمكنك الانتقال إلى Cloud Run في وحدة التحكّم، واختيار الخدمة التي نشرتها للتو وحذفها.