معلومات Azure:
- Subscription ID:
dde8416c-6077-4b2b-b722-05bf8b782c44 - Tenant ID:
a1cc28df-8965-4e03-96cb-5d6172ff55a5 - Resource Group:
rg-cometx-prod(eastus2)
معلومات GitHub:
- المنظمة:
gratech-sa - المستودع:
gratech-cometx - السجل:
ghcr.io/gratech-sa/gratech-cometx
النطاقات:
- إنتاج:
api.gratech.sa - تجريبي:
staging.gratech.sa
Container Apps:
- Prod:
ca-cometx-apiفي بيئةcae-cometx-prod - Staging:
ca-cometx-api-stagingفي بيئةcae-cometx-staging
شغّل السكربت لإنشاء App Registration و Federated Credentials:
.\create-azure-oidc.ps1النتيجة: سيعطيك ثلاث قيم لإضافتها في GitHub Secrets:
AZURE_CLIENT_ID = 9036905f-24d2-4f5e-99e7-98b8638b5abe
AZURE_TENANT_ID = a1cc28df-8965-4e03-96cb-5d6172ff55a5
AZURE_SUBSCRIPTION_ID = dde8416c-6077-4b2b-b722-05bf8b782c44
- افتح:
https://github.com/gratech-sa/gratech-cometx/settings/secrets/actions - اضغط New repository secret
- أضف الثلاث قيم أعلاه
.\setup-cometx-containerapps.ps1chmod +x setup-cometx-containerapps.sh
./setup-cometx-containerapps.shماذا يفعل السكربت؟
- ✅ إنشاء بيئتين: prod و staging
- ✅ إنشاء تطبيقين مع external ingress على منفذ
5173(Vite) - ✅ إضافة النطاقات المخصصة (
api.gratech.saوstaging.gratech.sa) - ✅ تفعيل Managed Certificates (SSL مجاني من Azure)
- ✅ طباعة FQDN لكل تطبيق
بعد تشغيل السكربت، سيعطيك CNAME لكل بيئة. اذهب لمزود DNS الخاص بـ gratech.sa وأضف:
Type: CNAME
Name: api
Value: ca-cometx-api.victoriousrock-b243cc39.eastus2.azurecontainerapps.io
TTL: 3600
Type: CNAME
Name: staging
Value: [FQDN من نتيجة السكربت]
TTL: 3600
Type: CAA
Name: @
Value: 0 issue "digicert.com"
⚠️ مهم: DNS يحتاج 5-60 دقيقة للتفعيل. تحقق بـ:nslookup api.gratech.sa
بعد إضافة GitHub Secrets و DNS:
git add .
git commit -m "feat: Azure Container Apps CI/CD with OIDC"
git push origin mainالنتيجة:
- ✅ يبني Docker Image
- ✅ يفحص Trivy (يفشل فقط عند CRITICAL)
- ✅ يدفع لـ GHCR (
ghcr.io/gratech-sa/gratech-cometx:latest) - ✅ يسجل دخول Azure عبر OIDC (بدون أسرار!)
- ✅ ينشر على
ca-cometx-api(production)
git checkout -b staging
git push origin stagingسينشر تلقائيًا على ca-cometx-api-staging.
az containerapp show -g rg-cometx-prod -n ca-cometx-apiaz containerapp logs show -g rg-cometx-prod -n ca-cometx-api --followaz containerapp hostname list -g rg-cometx-prod -n ca-cometx-apicurl https://api.gratech.saالسبب: CNAME غير صحيح أو غير مباشر (عبر Cloudflare مثلاً)
الحل:
- تأكد أن CNAME يشير مباشرةً لـ
*.azurecontainerapps.io - إذا كنت تستخدم Cloudflare، عطّل Proxy (🌥️) واتركه DNS only
- أضف CAA record:
0 issue "digicert.com"
الحل:
- تأكد أن GitHub Secrets مضبوطة بشكل صحيح
- تحقق من Federated Credentials في Azure Portal:
issuer: https://token.actions.githubusercontent.com subject: repo:gratech-sa/gratech-cometx:ref:refs/heads/main
الحل:
- راجع تقرير Trivy في GitHub Actions
- إذا كانت ثغرات HIGH فقط، الـ workflow سيكمل (نحن نفشل فقط عند CRITICAL)
- حدّث الـ base image في
Dockerfile
| الملف | الوصف |
|---|---|
.github/workflows/deploy.yml |
CI/CD Pipeline الرئيسي |
setup-cometx-containerapps.ps1 |
سكربت إنشاء البنية التحتية (PowerShell) |
setup-cometx-containerapps.sh |
سكربت إنشاء البنية التحتية (Bash) |
create-azure-oidc.ps1 |
سكربت إنشاء OIDC |
Dockerfile |
بناء الصورة |
docs/COMETX-briefing-for-claude.md |
توثيق للـ AI Assistants |
- تشغيل
create-azure-oidc.ps1وإضافة Secrets في GitHub - تشغيل
setup-cometx-containerapps.ps1أو.sh - إضافة CNAME records في DNS provider
- انتظار DNS propagation (5-60 دقيقة)
- Push إلى
mainلتشغيل أول deployment - التحقق من URL:
https://api.gratech.sa - مراجعة السجلات في Azure Portal أو CLI
🎉 مبروك! تطبيقك جاهز على Azure Container Apps مع CI/CD كامل!