مقدمة: لماذا CI/CD مهم لمشاريع Rust
التطوير بلغة Rust لا يقتصر فقط على أمان الذاكرة والأداء العالي. في العالم الحديث، أي مشروع جاد يتطلب أتمتة عمليات البناء والاختبار والنشر. CI/CD (التكامل المستمر / النشر المستمر) يسمح للفرق بإصدار التحديثات بشكل أسرع، مما يقلل من خطر الأخطاء البشرية ويضمن استقرار قاعدة الكود.
GitHub Actions هي أداة مدمجة في GitHub لأتمتة سير العمل. وهي مثالية لمشاريع Rust لأنها توفر إجراءات جاهزة لتثبيت المترجم، وتخزين التبعيات مؤقتًا، ونشر الحزم في crates.io. في هذه المقالة، سنشرح كيفية إعداد خط أنابيب CI/CD كامل لتطبيق Rust من الصفر.
1. أساسيات GitHub Actions لـ Rust
قبل الغوص في الكود، دعنا نفهم البنية الأساسية لـ GitHub Actions. يتم تعريف كل سير عمل في ملف YAML موجود في الدليل .github/workflows/. يتكون سير العمل من job واحدة أو أكثر (مهام)، يتم تنفيذها بشكل تسلسلي أو متوازي على أجهزة افتراضية (runners).
بالنسبة لمشاريع Rust، يتضمن سير العمل الأدنى الخطوات التالية:
- Checkout — الحصول على أحدث إصدار من الكود من المستودع.
- تثبيت Rust — عبر إجراء
actions-rs/toolchainأو الإجراء الرسميdtolnay/rust-toolchain. - تخزين التبعيات مؤقتًا — تسريع البناء عن طريق حفظ
target/و~/.cargo/. - البناء والاختبار — تنفيذ
cargo buildوcargo test.
مثال على سير عمل أساسي (ملف .github/workflows/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@v3 - name: Install Rust uses: dtolnay/rust-toolchain@stable with: components: clippy, rustfmt - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/ 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يتم تشغيل سير العمل هذا عند كل push إلى الفرع main وعند إنشاء pull request. يتحقق من أن الكود يتم تجميعه، واجتياز الاختبارات، وعدم وجود أخطاء في أداة التحليل، ومطابقته لأسلوب التنسيق.
2. استراتيجيات متقدمة: البناء المصفوفي والتخزين المؤقت
Rust هي لغة متعددة المنصات، وغالبًا ما يكون من الضروري التحقق من البناء على أنظمة تشغيل أو معماريات متعددة. لهذا، يتم استخدام البناء المصفوفي (matrix build).
دعنا نضيف دعمًا لـ Windows و macOS إلى سير العمل الخاص بنا:
jobs: build: strategy: matrix: os: [ubuntu-latest, windows-latest, macos-latest] rust: [stable, beta] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v3 - name: Install Rust uses: dtolnay/rust-toolchain@master with: toolchain: ${{ matrix.rust }} components: clippy - name: Cache uses: actions/cache@v3 with: path: | ~/.cargo/registry/ ~/.cargo/git/ target/ key: ${{ matrix.os }}-cargo-${{ matrix.rust }}-${{ hashFiles('**/Cargo.lock') }} - name: Build run: cargo build --