Einleitung: Warum CI/CD für Rust-Projekte entscheidend ist
Rust ist eine Systemprogrammiersprache, die für ihre Leistung und Speichersicherheit bekannt ist. Selbst der zuverlässigste Code erfordert jedoch ständige Überprüfung. Manuelles Testen und Bauen kostet Zeit und ist fehleranfällig. CI/CD (Continuous Integration/Continuous Deployment) automatisiert diese Prozesse und stellt sicher, dass jede Codeänderung vor dem Zusammenführen in den Hauptzweig vom Compiler, Tests und Linter geprüft wird.
GitHub Actions ist eine integrierte Plattform zur Automatisierung von Arbeitsabläufen in GitHub. Sie ist ideal für Rust-Projekte aufgrund ihrer Flexibilität, des kostenlosen Minutenlimits für öffentliche Repositories und des riesigen Ökosystems vorgefertigter Aktionen. In diesem Artikel werden wir den gesamten Zyklus der CI/CD-Einrichtung für Rust durchgehen: vom grundlegenden Build bis zur Optimierung durch Caching und Deployment.
1. Grundlagen: Erster Workflow für Build und Tests
Beginnen wir mit der Erstellung eines minimalen Arbeitsablaufs. Erstellen Sie im Stammverzeichnis Ihres Repositorys den Ordner .github/workflows und die Datei ci.yml.
Basisdatei 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 --verboseErklärung der Schlüsselelemente:
- on: Auslöser — Start bei Push in main und bei Erstellung eines Pull Request.
- env: Die Variable
CARGO_TERM_COLORaktiviert die farbige Log-Ausgabe. - actions/checkout: Standardaktion zum Klonen des Repositorys.
- dtolnay/rust-toolchain: Die beliebteste Aktion zur Installation von Rust. Verwenden Sie
stable,nightlyoder eine bestimmte Version.
Dieser Workflow ist bereits nützlich: Er stellt sicher, dass der Code kompiliert und alle Tests bestanden werden. Für ein reales Projekt reicht dies jedoch nicht aus.
2. Optimierung: Caching von Abhängigkeiten und plattformübergreifender Build
Jeder CI-Start lädt alle Abhängigkeiten erneut herunter. Bei Rust-Projekten mit vielen Crates kann dies Minuten dauern. Die Lösung ist das Caching der Ordner ~/.cargo und target.
Caching hinzufügen
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 --verboseWichtige Punkte:
- hashFiles('**/Cargo.lock'): Der Cache wird nur ungültig, wenn sich
Cargo.lockändert. - path: Wir cachen Binärdateien, das Registry-Index und den
target-Ordner. - Wiederherstellung: Bei Schlüsselübereinstimmung wird der Cache wiederhergestellt und cargo überspringt das Herunterladen.
Plattformübergreifender Build
Rust unterstützt viele Plattformen. Um sicherzustellen, dass Ihr Code überall funktioniert, verwenden Sie eine Build-Matrix:
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