مقدمة: لماذا يعتبر 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 على macOS3. الفحص اللغوي، التنسيق، والأمان
بالإضافة إلى الاختبارات، يتضمن 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