مقدمة: لماذا CI/CD مهم لمشاريع Rust؟
تطوير Rust لا يقتصر فقط على كتابة كود آمن وسريع، بل يشمل أيضًا ضمان استقراره على المدى الطويل. CI/CD (التكامل المستمر / النشر المستمر) هي ممارسة تعمل على أتمتة بناء واختبار ونشر مشروعك. بالنسبة لـ Rust، مع مترجمها الصارم ونظام الأنواع، فإن CI/CD مفيد بشكل خاص: فهو يسمح باكتشاف الأخطاء في المراحل المبكرة، والتحقق من توافق التبعيات، ونشر الإصدارات الجديدة تلقائيًا.
GitHub Actions هي أداة CI/CD مدمجة في منصة GitHub. توفر قوالب جاهزة لـ Rust، ومصفوفات اختبار قوية، وإمكانية التكامل مع أي خدمات سحابية. في هذه المقالة، سنشرح كيفية إعداد خط أنابيب كامل لمشروع Rust: من الفحص الأساسي إلى النشر على crates.io.
1. الأساسيات: إنشاء أول workflow لـ Rust
Workflow في GitHub Actions هو ملف YAML يصف تسلسل الخطوات. بالنسبة لمشروع Rust، يجب أن يتضمن الحد الأدنى من workflow: تثبيت Rust، تحميل التبعيات، البناء، وتشغيل الاختبارات.
أنشئ ملف .github/workflows/ci.yml في جذر مستودعك:
name: Rust CI
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4 - name: Setup Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true components: clippy, rustfmt - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Build run: cargo build --verbose - name: Run tests run: cargo test --verbose - name: Lint with Clippy run: cargo clippy -- -D warnings - name: Check formatting run: cargo fmt --checkيتم تشغيل هذا workflow مع كل push إلى الفرع الرئيسي أو عند إنشاء pull request. يعمل التخزين المؤقت للتبعيات (actions/cache) على تسريع عمليات التشغيل اللاحقة بشكل كبير. لاحظ العلامة -- -D warnings في clippy - فهي تحول التحذيرات إلى أخطاء، مما يحسن جودة الكود.
1.1. اختبار المصفوفة: التحقق على إصدارات متعددة من Rust
لدى Rust ثلاث قنوات إصدار رئيسية: stable و beta و nightly. للتأكد من أن كودك يعمل على جميع الإصدارات، استخدم مصفوفة الاستراتيجيات:
jobs: test: runs-on: ubuntu-latest strategy: matrix: rust: [stable, beta, nightly] steps: - uses: actions/checkout@v4 - name: Setup Rust ${{ matrix.rust }} uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true - name: Build and test run: | cargo build cargo testأضف أيضًا التحقق من الحد الأدنى من إصدار Rust المدعوم (MSRV). هذا مهم بشكل خاص للمكتبات. على سبيل المثال، إذا كان ملف Cargo.toml الخاص بك يحدد rust-version = "1.60"، أضف إلى المصفوفة rust: [1.60.0, stable].
2. تقنيات متقدمة: التحسين والأمان
2.1. التخزين المؤقت مع مراعاة الملفات الشخصية
افتراضيًا، يستخدم cargo build ملف التعريف debug. بالنسبة لبناءات release، سيكون التخزين المؤقت مختلفًا. قم بتقسيم التخزين المؤقت لملفات التعريف المختلفة:
- name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ matrix.rust }}-${{ matrix.profile }} env: CARGO_TERM_COLOR: alwaysأضف إلى المصفوفة profile: [debug, release].