first commit
هذا الالتزام موجود في:
80
q3-cicd/readme.md
Normal file
80
q3-cicd/readme.md
Normal file
@@ -0,0 +1,80 @@
|
||||
# بناء CI/CD Pipeline على غيمة
|
||||
|
||||
## 1. GitHub Actions Workflow
|
||||
|
||||
تم إنشاء GitHub Actions Workflow لأتمتة عملية بناء واختبار ونشر التطبيق على منصة Ghaymah Cloud.
|
||||
|
||||
يتم تشغيل الـ Workflow عند عمل `push` على فرعي `main` أو `develop`.
|
||||
|
||||
الخطوات الأساسية هي:
|
||||
|
||||
1. تحميل الكود من GitHub.
|
||||
2. بناء Docker Image باستخدام `Dockerfile`.
|
||||
3. تشغيل Container بشكل مؤقت واختبار `/health` للتأكد من أن التطبيق يعمل.
|
||||
4. نشر التطبيق على بيئة Staging عند استخدام فرع `develop`.
|
||||
5. نشر التطبيق على Production عند استخدام فرع `main` بعد الحصول على موافقة يدوية.
|
||||
|
||||
يتم تخزين بيانات تسجيل الدخول الخاصة بـ Ghaymah داخل GitHub Secrets باستخدام:
|
||||
|
||||
* `GHAYMAH_EMAIL`
|
||||
* `GHAYMAH_PW`
|
||||
|
||||
---
|
||||
|
||||
## 2. Manual Approval قبل Production
|
||||
|
||||
تم استخدام GitHub Environment باسم `production` لإضافة مرحلة موافقة يدوية قبل النشر.
|
||||
|
||||
عند وصول الكود إلى فرع `main`، يتم تنفيذ عملية البناء والاختبار أولاً، ثم يتوقف الـ Workflow وينتظر موافقة الشخص المسؤول.
|
||||
|
||||
بعد الموافقة فقط يتم تنفيذ عملية النشر على Production باستخدام Ghaymah CLI.
|
||||
|
||||
هذا يمنع نشر أي إصدار جديد على Production بشكل تلقائي دون مراجعة.
|
||||
|
||||
---
|
||||
|
||||
## 3. الفرق بين Staging و Production
|
||||
|
||||
### Staging
|
||||
|
||||
بيئة تستخدم لاختبار التطبيق قبل نشره للمستخدمين الحقيقيين.
|
||||
|
||||
يتم نشر التغييرات عليها بشكل تلقائي من فرع `develop`، ويمكن استخدامها للتأكد من أن التطبيق يعمل بشكل صحيح.
|
||||
|
||||
### Production
|
||||
|
||||
هي البيئة التي يستخدمها المستخدمون الحقيقيون.
|
||||
|
||||
يتم النشر إليها من فرع `main`، ويتم وضع Manual Approval قبل عملية النشر لتقليل احتمالية نشر إصدار يحتوي على أخطاء.
|
||||
|
||||
الـ Workflow يكون كالتالي:
|
||||
|
||||
`develop → Build & Test → Staging`
|
||||
|
||||
`main → Build & Test → Manual Approval → Production`
|
||||
|
||||
---
|
||||
|
||||
## 4. الربط مع Ghaymah CLI
|
||||
|
||||
يتم تثبيت Ghaymah CLI داخل GitHub Actions Runner باستخدام الأمر:
|
||||
|
||||
`curl -sSL https://cli.ghaymah.systems/install.sh | bash`
|
||||
|
||||
بعد ذلك يتم تسجيل الدخول باستخدام بيانات Ghaymah المخزنة في GitHub Secrets:
|
||||
|
||||
`gy auth login`
|
||||
|
||||
ثم يتم تنفيذ عملية النشر باستخدام:
|
||||
|
||||
`gy resource app launch`
|
||||
|
||||
يستخدم Ghaymah CLI ملف `.ghaymah.json` الموجود في جذر المشروع لمعرفة إعدادات التطبيق، مثل:
|
||||
|
||||
* اسم التطبيق.
|
||||
* Project ID.
|
||||
* الـ Port المستخدم.
|
||||
* اسم Dockerfile.
|
||||
* إعدادات الوصول العام.
|
||||
|
||||
وبذلك يصبح GitHub Actions مسؤولاً عن أتمتة عملية CI/CD، بينما يقوم Ghaymah CLI بتنفيذ عملية النشر على منصة Ghaymah Cloud.
|
||||
87
q3-cicd/workflow.yml
Normal file
87
q3-cicd/workflow.yml
Normal file
@@ -0,0 +1,87 @@
|
||||
name: CI/CD Pipeline
|
||||
|
||||
on:
|
||||
push:
|
||||
branches:
|
||||
- main
|
||||
- develop
|
||||
|
||||
jobs:
|
||||
build:
|
||||
name: Build Docker Image
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5.0.0
|
||||
|
||||
- name: Build Docker image
|
||||
run: |
|
||||
docker build -t go-app:${{ github.sha }} .
|
||||
|
||||
- name: Test Docker image
|
||||
run: |
|
||||
docker run -d \
|
||||
--name go-app-test \
|
||||
-p 8080:8080 \
|
||||
go-app:${{ github.sha }}
|
||||
|
||||
sleep 3
|
||||
|
||||
curl --fail http://localhost:8080/health
|
||||
|
||||
docker stop go-app-test
|
||||
docker rm go-app-test
|
||||
|
||||
|
||||
deploy-staging:
|
||||
name: Deploy to Staging
|
||||
needs: build
|
||||
if: github.ref == 'refs/heads/develop'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5.0.0
|
||||
|
||||
- name: Install Ghaymah CLI
|
||||
run: |
|
||||
curl -sSL https://cli.ghaymah.systems/install.sh | bash
|
||||
|
||||
- name: Login to Ghaymah
|
||||
run: |
|
||||
$HOME/ghaymah/bin/gy auth login \
|
||||
--email "${{ secrets.GHAYMAH_EMAIL }}" \
|
||||
--password "${{ secrets.GHAYMAH_PW }}"
|
||||
|
||||
- name: Deploy to Staging
|
||||
run: |
|
||||
$HOME/ghaymah/bin/gy resource app launch
|
||||
|
||||
|
||||
deploy-production:
|
||||
name: Deploy to Production
|
||||
needs: build
|
||||
if: github.ref == 'refs/heads/main'
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
environment:
|
||||
name: production
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v5.0.0
|
||||
|
||||
- name: Install Ghaymah CLI
|
||||
run: |
|
||||
curl -sSL https://cli.ghaymah.systems/install.sh | bash
|
||||
|
||||
- name: Login to Ghaymah
|
||||
run: |
|
||||
$HOME/ghaymah/bin/gy auth login \
|
||||
--email "${{ secrets.GHAYMAH_EMAIL }}" \
|
||||
--password "${{ secrets.GHAYMAH_PW }}"
|
||||
|
||||
- name: Deploy to Production
|
||||
run: |
|
||||
$HOME/ghaymah/bin/gy resource app launch
|
||||
المرجع في مشكلة جديدة
حظر مستخدم