مقدمة: لماذا يعتبر CI/CD أمرًا بالغ الأهمية لمشاريع Rust
Rust هي لغة برمجة أنظمة تشتهر بأدائها العالي وأمان الذاكرة. ومع ذلك، حتى الكود الأكثر موثوقية يتطلب فحصًا مستمرًا. الاختبار والبناء اليدوي يستهلكان الوقت ويكونان عرضة للأخطاء. يعمل CI/CD (التكامل المستمر/النشر المستمر) على أتمتة هذه العمليات، مما يضمن أن كل تغيير في الكود يمر بفحص المترجم والاختبارات وأدوات التحليل البرمجي قبل أن يصل إلى الفرع الرئيسي.
GitHub Actions هي منصة مدمجة لأتمتة سير العمل في GitHub. وهي مثالية لمشاريع Rust بفضل مرونتها، والحد المجاني للدقائق للمستودعات العامة، والنظام البيئي الضخم من الإجراءات الجاهزة. في هذه المقالة، سنشرح دورة الإعداد الكاملة لـ CI/CD لـ Rust: من البناء الأساسي إلى التحسين باستخدام التخزين المؤقت والنشر.
1. الأساسيات: أول سير عمل للبناء والاختبار
لنبدأ بإنشاء سير عمل بسيط. في جذر المستودع الخاص بك، أنشئ مجلد .github/workflows وملف ci.yml.
الملف الأساسي ci.yml
name: Rust CI
on: push: branches: [ "main" ] pull_request: branches: [ "main" ]
env: CARGO_TERM_COLOR: always
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Build run: cargo build --verbose - name: Run tests run: cargo test --verboseتحليل العناصر الرئيسية:
- on: المشغلات - التشغيل عند الدفع إلى main وعند إنشاء Pull Request.
- env: المتغير
CARGO_TERM_COLORيقوم بتفعيل إخراج السجلات بالألوان. - actions/checkout: الإجراء القياسي لاستنساخ المستودع.
- dtolnay/rust-toolchain: الإجراء الأكثر شيوعًا لتثبيت Rust. استخدم
stableأوnightlyأو إصدارًا محددًا.
سير العمل هذا مفيد بالفعل: فهو يضمن أن الكود يتم تجميعه وأن جميع الاختبارات تمر. لكن بالنسبة لمشروع حقيقي، هذا غير كافٍ.
2. التحسين: التخزين المؤقت للتبعيات والبناء عبر المنصات المتعددة
كل تشغيل لـ CI يقوم بتنزيل جميع التبعيات من جديد. بالنسبة لمشاريع Rust التي تحتوي على عدد كبير من الكريتات، قد يستغرق هذا دقائق. الحل هو التخزين المؤقت لمجلد ~/.cargo و target.
إضافة التخزين المؤقت
jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/bin/ ~/.cargo/registry/index/ ~/.cargo/registry/cache/ target/ key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }} - name: Build run: cargo build --verbose - name: Run tests run: cargo test --verboseالنقاط الرئيسية:
- hashFiles('**/Cargo.lock'): يتم إبطال التخزين المؤقت فقط عند تغيير
Cargo.lock. - path: نقوم بتخزين الملفات الثنائية وفهرس السجل ومجلد
targetمؤقتًا. - الاستعادة: عند تطابق المفتاح، يتم استعادة التخزين المؤقت، ويتخطى cargo عملية التنزيل.
البناء عبر المنصات المتعددة
Rust تدعم العديد من المنصات. للتأكد من أن كودك يعمل في كل مكان، استخدم مصفوفة البناء:
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Install Rust uses: dtolnay/rust-toolchain@stable