مقدمة: لماذا يعتبر CI/CD أمرًا بالغ الأهمية لمشاريع Rust؟
\nالتطوير بلغة Rust لا يقتصر فقط على أمان الذاكرة والأداء العالي، بل يتعلق أيضًا بالانضباط الصارم. يلتقط مترجم Rust العديد من الأخطاء في مرحلة البناء، لكن هذا لا يلغي الحاجة إلى الاختبار عالي الجودة والتحقق من الأكواد والتحقق من توافق التبعيات. هنا يأتي دور CI/CD (التكامل المستمر / النشر المستمر).
\nGitHub Actions هو نظام أتمتة مدمج مثالي لمشاريع Rust. يسمح لك بتشغيل الاختبارات تلقائيًا، وتنسيق الكود، والتحقق من وجود ثغرات أمنية، وحتى نشر الحزم (crates) في سجل crates.io مع كل دفعة إلى المستودع. في هذه المقالة، سنشرح خط الأنابيب الكامل: من cargo build الأساسي إلى النشر في الإنتاج.
1. الأساسيات: إعداد سير عمل أساسي لـ Rust
\nيبدأ أي خط أنابيب CI/CD في GitHub Actions بإنشاء ملف YAML في الدليل .github/workflows/. لنقم بإنشاء ملف ci.yml للتحقق الأساسي من مشروع Rust.
1.1. سير العمل الأول: البناء والاختبارات
\nلنبدأ بالحد الأدنى من المجموعة: استنساخ المستودع، تثبيت Rust، وتشغيل الاختبارات.
\nname: 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
سيتم تشغيل سير العمل هذا مع كل دفعة إلى الفرعين main و develop، وكذلك عند إنشاء طلب سحب (Pull Request).
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 تحديث ذاكرة التخزين المؤقت فقط عند تغيير التبعيات.
2. التحقق المتقدم من جودة الكود
\nالاختبارات وحدها لا تكفي للحفاظ على جودة عالية للكود. دعنا نضيف التحقق من الأكواد (linting) والتنسيق والتحقق الأمني.
\n\n2.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