Einführung: Warum CI/CD für Rust-Projekte wichtig ist
Die Entwicklung mit Rust dreht sich nicht nur um Speichersicherheit und hohe Leistung. In der modernen Welt erfordert jedes ernsthafte Projekt die Automatisierung von Build-, Test- und Bereitstellungsprozessen. CI/CD (Continuous Integration / Continuous Deployment) ermöglicht es Teams, Updates schneller zu veröffentlichen, das Risiko menschlicher Fehler zu reduzieren und die Stabilität der Codebasis zu gewährleisten.
GitHub Actions ist ein integriertes GitHub-Tool zur Automatisierung von Arbeitsabläufen. Es ist ideal für Rust-Projekte, da es vorgefertigte Actions zum Installieren des Compilers, zum Caching von Abhängigkeiten und zum Veröffentlichen von Crates auf crates.io bietet. In diesem Artikel werden wir besprechen, wie man eine vollständige CI/CD-Pipeline für eine Rust-Anwendung von Grund auf einrichtet.
1. Grundlagen von GitHub Actions für Rust
Bevor wir in den Code eintauchen, lassen Sie uns die grundlegende Struktur von GitHub Actions verstehen. Jeder Workflow wird durch eine YAML-Datei definiert, die im Verzeichnis .github/workflows/ liegt. Ein Workflow besteht aus einem oder mehreren Jobs (Aufgaben), die sequenziell oder parallel auf virtuellen Maschinen (Runnern) ausgeführt werden.
Für Rust-Projekte umfasst ein minimaler Workflow die folgenden Schritte:
- Checkout — Abrufen der neuesten Version des Codes aus dem Repository.
- Rust installieren — über die Action
actions-rs/toolchainoder die offizielledtolnay/rust-toolchain. - Abhängigkeiten cachen — Beschleunigung des Builds durch Speichern von
target/und~/.cargo/. - Build und Tests — Ausführen von
cargo buildundcargo test.
Beispiel für einen Basis-Workflow (Datei .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 --checkDieser Workflow wird bei jedem Push in den Branch main und bei der Erstellung eines Pull Requests ausgelöst. Er überprüft, ob der Code kompiliert, die Tests bestanden werden, keine Linter-Fehler vorliegen und der Formatierungsstil eingehalten wird.
2. Fortgeschrittene Strategien: Matrix-Build und Caching
Rust ist eine plattformübergreifende Sprache, und oft ist es erforderlich, den Build auf mehreren Betriebssystemen oder Architekturen zu überprüfen. Dafür wird der Matrix-Build verwendet.
Fügen wir unserem Workflow Unterstützung für Windows und macOS hinzu:
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 --