CI/CD لمشاريع Rust: GitHub Actions من الألف إلى الياء

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

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

ابدأ الدورة

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

\n

التطوير بلغة Rust لا يقتصر فقط على أمان الذاكرة والأداء العالي، بل يتعلق أيضًا بالانضباط الصارم. يلتقط مترجم Rust العديد من الأخطاء في مرحلة البناء، لكن هذا لا يلغي الحاجة إلى الاختبار عالي الجودة والتحقق من الأكواد والتحقق من توافق التبعيات. هنا يأتي دور CI/CD (التكامل المستمر / النشر المستمر).

\n

GitHub Actions هو نظام أتمتة مدمج مثالي لمشاريع Rust. يسمح لك بتشغيل الاختبارات تلقائيًا، وتنسيق الكود، والتحقق من وجود ثغرات أمنية، وحتى نشر الحزم (crates) في سجل crates.io مع كل دفعة إلى المستودع. في هذه المقالة، سنشرح خط الأنابيب الكامل: من cargo build الأساسي إلى النشر في الإنتاج.

\n\n

1. الأساسيات: إعداد سير عمل أساسي لـ Rust

\n

يبدأ أي خط أنابيب CI/CD في GitHub Actions بإنشاء ملف YAML في الدليل .github/workflows/. لنقم بإنشاء ملف ci.yml للتحقق الأساسي من مشروع Rust.

\n\n

1.1. سير العمل الأول: البناء والاختبارات

\n

لنبدأ بالحد الأدنى من المجموعة: استنساخ المستودع، تثبيت Rust، وتشغيل الاختبارات.

\n
name: Rust CI\n\non:\n  push:\n    branches: [ "main", "develop" ]\n  pull_request:\n    branches: [ "main" ]\n\nenv:\n  CARGO_TERM_COLOR: always\n\njobs:\n  build:\n    runs-on: ubuntu-latest\n\n    steps:\n    - uses: actions/checkout@v4\n    - name: Install Rust\n      uses: dtolnay/rust-toolchain@stable\n    - name: Build\n      run: cargo build --verbose\n    - name: Run tests\n      run: cargo test --verbose
\n

ماذا يحدث هنا؟

\n
    \n
  • actions/checkout@v4 — يستنسخ الكود الخاص بك.
  • \n
  • dtolnay/rust-toolchain@stable — الإجراء الرسمي لتثبيت Rust (يدعم nightly و beta و stable).
  • \n
  • cargo build و cargo test — الأوامر الأساسية للتحقق من المشروع.
  • \n
\n

سيتم تشغيل سير العمل هذا مع كل دفعة إلى الفرعين main و develop، وكذلك عند إنشاء طلب سحب (Pull Request).

\n\n

1.2. التخزين المؤقت للتبعيات لتسريع البناء

\n

غالبًا ما تحتوي مشاريع Rust على العديد من التبعيات. لتجنب تنزيلها في كل مرة، استخدم التخزين المؤقت. سيؤدي ذلك إلى تقليل وقت البناء من 5-10 دقائق إلى 30-60 ثانية.

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

أضف هذه الخطوة قبل تشغيل cargo build. يضمن التجزئة (hash) من ملف Cargo.lock تحديث ذاكرة التخزين المؤقت فقط عند تغيير التبعيات.

\n\n

2. التحقق المتقدم من جودة الكود

\n

الاختبارات وحدها لا تكفي للحفاظ على جودة عالية للكود. دعنا نضيف التحقق من الأكواد (linting) والتنسيق والتحقق الأمني.

\n\n

2.1. التنسيق (rustfmt) والتحقق من الأكواد (clippy)

\n

تحتوي Rust على أدوات مدمجة للحفاظ على نمط كود موحد. دعنا نضيفها في وظيفة (job) منفصلة:

\n
  lint:\n    runs-on: ubuntu-latest\n    steps:\n    - uses: actions/checkout@v4\n    - uses: dtolnay/rust-toolchain@stable\n      with:\n        components: clippy, rustfmt\n    - name: Check formatting\n      run: cargo fmt --check\n    - name: Run clippy\n      run: cargo clippy -- -D warnings
\n
    \n
  • cargo fmt --check — يتحقق من أن الكود منسق وفقًا لمعيار rustfmt.
  • \n
  • cargo clippy -- -D warnings — يشغل المدقق (linter) ويحول التحذيرات إلى أخطاء (علامة -D).
  • \n
\n

سيساعد هذا في تجنب الكود "غير النظيف" في المستودع.

\n\n

2.2. التحقق الأمني للتبعيات (car

المدونات

توصيات الكتب