CI/CD لمشاريع Rust: GitHub Actions مستوى متقدم

مدرب بايثون أونلاين للمبتدئين

تعلم Python بسهولة دون إرهاق نظري. حل مهام عملية مع التحقق التلقائي واكتب الكود مباشرة في المتصفح.

ابدأ الدورة

مقدمة: لماذا يعتبر CI/CD المتقدم مهماً لمشاريع Rust



خط أنابيب CI/CD الأساسي لـ Rust جيد، ولكن في المشاريع الحقيقية، خاصة مع منصات متعددة، وتبعيات، والحاجة إلى ردود فعل سريعة، فإن مجرد cargo test لا يكفي. الإعداد المتقدم لـ GitHub Actions يسمح بتقليل وقت البناء بمقدار 2-3 مرات، والتحقق تلقائياً من الكود على بنى مختلفة، ونشر الكريتات، وإجراء الفحص اللغوي.



في هذه المقالة، سنشرح التقنيات المتقدمة: التخزين المؤقت للتبعيات، مصفوفة البناء لأنظمة Windows/macOS/Linux، التشغيل المتوازي للاختبارات، النشر على crates.io، والتكامل مع Clippy.



1. تحسين وقت البناء: التخزين المؤقت والتجميع المتزايد



العملية الأكثر تكلفة في CI لـ Rust هي تجميع التبعيات. بدون تخزين مؤقت، سيتم تنزيل وجمع جميع الكريتات من جديد في كل تشغيل. الحل هو استخدام ذاكرة التخزين المؤقت المدمجة في GitHub Actions.



التخزين المؤقت الأساسي لدليل target



jobs:  build:    runs-on: ubuntu-latest    steps:      - uses: actions/checkout@v4      - uses: actions-rust-lang/setup-rust-toolchain@v1      - name: Cache Rust dependencies        uses: actions/cache@v3        with:          path: |            ~/.cargo/registry            ~/.cargo/git            target          key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}      - run: cargo build --release


نقطة أساسية: مفتاح التخزين المؤقت يتضمن تجزئة Cargo.lock. إذا لم تتغير التبعيات، يتم استعادة التخزين المؤقت فوراً.



تقسيم متقدم للتخزين المؤقت للاختبارات والبناء



للمشاريع الكبيرة، من المنطقي فصل التخزين المؤقت لـ cargo build و cargo test، لتجنب إعادة بناء الملفات الثنائية للاختبار عند بناء الإصدار:



- name: Cache cargo build  uses: actions/cache@v3  with:    path: |      ~/.cargo/registry      ~/.cargo/git      target/debug/.fingerprint      target/debug/build    key: ${{ runner.os }}-build-${{ hashFiles('**/Cargo.lock') }}


2. مصفوفة البناء: الاختبار على جميع المنصات



يتم تجميع Rust لمنصات متعددة. لضمان العمل الصحيح على Windows و macOS و Linux، نستخدم استراتيجية المصفوفة (matrix strategy).



مثال على مصفوفة لثلاثة أنظمة تشغيل



jobs:  test:    strategy:      matrix:        os: [ubuntu-latest, windows-latest, macos-latest]        toolchain: [stable, beta]        features:          - default          - all    runs-on: ${{ matrix.os }}    steps:      - uses: actions/checkout@v4      - uses: actions-rust-lang/setup-rust-toolchain@v1        with:          toolchain: ${{ matrix.toolchain }}      - name: Run tests        run: cargo test --features ${{ matrix.features }}


هذا النهج ينشئ تلقائياً 6 وظائف متوازية (3 أنظمة تشغيل × 2 أدوات). يمكنك إضافة فحص لـ nightly، أو بنى arm64، أو التجميع المتقاطع لـ WASM.



استبعاد التركيبات غير الضرورية



strategy:  matrix:    os: [ubuntu-latest, windows-latest, macos-latest]    toolchain: [stable, nightly]    exclude:      - os: macos-latest        toolchain: nightly  # لا نختبر nightly على macOS


3. الفحص اللغوي، التنسيق، والأمان



بالإضافة إلى الاختبارات، يتضمن CI المتقدم التحليل الثابت. سنضيف فحوصات clippy و rustfmt و cargo-audit للثغرات الأمنية.



وظيفة منفصلة للفحص اللغوي



lint:  runs-on: ubuntu-latest  steps:    - uses: actions/checkout@v4    - uses: actions-rust-lang/setup-rust-toolchain@v1      with:        components: clippy, rustfmt    - name: Check formatting      run: cargo fmt --check    - name: Clippy with warnings as errors      run: cargo clippy -- -D warnings


فحص الأمان

المدونات

توصيات الكتب