CI/CD: التكامل والنشر المستمر للبرامج الصناعية
ما هو CI/CD ولماذا يهم البرامج الصناعية؟
CI/CD اختصار لـ التكامل المستمر والنشر المستمر. يؤتمت عملية البناء والاختبار والنشر في كل مرة يدفع فيها مطور تغييرات في الكود.
في البرمجيات الصناعية، النشر اليدوي محفوف بالمخاطر. الإنسان قد ينسى خطوة أو ينشر إصداراً خاطئاً أو يتخطى الاختبارات تحت الضغط. CI/CD ينشئ خط أنابيب آلي ينفذ نفس الخطوات في كل مرة بشكل متسق وموثوق. كل دفع يُطلق تجميعاً واختباراً، فقط الكود الناجح يُنشر، وسجل التدقيق يُظهر بالضبط ما تغيّر ومتى وبواسطة من.
GitHub Actions: أول خط أنابيب
GitHub Actions منصة CI/CD مدمجة في GitHub. تُعرَّف خطوط الأنابيب في ملفات YAML داخل .github/workflows/.
# .github/workflows/ci.yml
name: Factory Monitor CI
on:
push:
branches: [main, develop]
pull_request:
branches: [main]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo build --release
كل سير عمل يحتاج مُحفّز (on)، وظيفة واحدة أو أكثر، وخطوات داخل كل وظيفة.
مرحلة البناء: تجميع وإنشاء الصورة
مرحلة البناء تُجمّع تطبيق Rust وتنشئ صورة Docker:
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
~/.cargo/git
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- run: cargo build --release
- run: |
docker build -t factory-monitor:${{ github.sha }} .
docker tag factory-monitor:${{ github.sha }} factory-monitor:latest
- run: |
echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
docker tag factory-monitor:latest ghcr.io/${{ github.repository }}/factory-monitor:latest
docker push ghcr.io/${{ github.repository }}/factory-monitor:latest
خطوة التخزين المؤقت تُسرّع البناء بشكل ملحوظ بإعادة استخدام الاعتمادات المُحمّلة سابقاً.
مرحلة الاختبار: اختبارات تلقائية
خطأ في نظام مراقبة المصنع يعني تنبيهات مفقودة وأضرار بالمعدات. اختبر قبل النشر:
test:
runs-on: ubuntu-latest
needs: build
services:
surrealdb:
image: surrealdb/surrealdb:v2.1.4
ports:
- 8000:8000
options: >-
--health-cmd "curl -f http://localhost:8000/health"
--health-interval 10s
--health-timeout 5s
--health-retries 5
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo test --lib
- run: cargo test --test '*'
env:
DATABASE_URL: ws://localhost:8000
- run: cargo clippy -- -D warnings
- run: cargo fmt --check
كتلة services تُشغّل نسخة SurrealDB حقيقية لاختبارات التكامل.
مرحلة النشر: نشر تلقائي على VPS
بعد نجاح الاختبارات، انشر الإصدار الجديد عبر SSH:
deploy:
runs-on: ubuntu-latest
needs: test
if: github.ref == 'refs/heads/main'
steps:
- uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
script: |
cd /opt/factory-monitor
docker compose pull
docker compose up -d --remove-orphans
sleep 10
curl -f http://localhost:8080/health || exit 1
خزّن الأسرار في GitHub تحت Settings > Secrets and Variables > Actions: VPS_HOST، VPS_USER، VPS_SSH_KEY، وREGISTRY_TOKEN.
مثال عملي: خط أنابيب كامل لتطبيق Rust
إليك سير العمل الكامل الذي يجمع جميع المراحل:
name: Factory Monitor Pipeline
on:
push:
branches: [main]
env:
CARGO_TERM_COLOR: always
jobs:
check:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- run: cargo fmt --check
- run: cargo clippy -- -D warnings
test:
runs-on: ubuntu-latest
needs: check
steps:
- uses: actions/checkout@v4
- uses: dtolnay/rust-toolchain@stable
- uses: actions/cache@v4
with:
path: |
~/.cargo/registry
target
key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}
- run: cargo test --all
deploy:
runs-on: ubuntu-latest
needs: test
steps:
- uses: actions/checkout@v4
- name: Build and push
run: |
docker build -t factory-monitor:latest .
echo "${{ secrets.REGISTRY_TOKEN }}" | docker login ghcr.io -u ${{ github.actor }} --password-stdin
docker push ghcr.io/${{ github.repository }}/factory-monitor:latest
- uses: appleboy/ssh-action@v1
with:
host: ${{ secrets.VPS_HOST }}
username: ${{ secrets.VPS_USER }}
key: ${{ secrets.VPS_SSH_KEY }}
script: |
cd /opt/factory-monitor
docker compose pull && docker compose up -d
الخلاصة
CI/CD يؤتمت المسار من تغيير الكود إلى نشر الإنتاج. GitHub Actions يوفر منصة مجانية ومدمجة لمشاريع Rust. يتكون خط الأنابيب من ثلاث مراحل: البناء (التجميع وإنشاء الصور)، الاختبار (تشغيل الفحوصات الآلية)، والنشر (الدفع إلى خادم الإنتاج). في الدرس القادم، ستتعلم المراقبة باستخدام Prometheus وGrafana لمتابعة تطبيقاتك المنشورة في الوقت الفعلي.