Introduction : pourquoi CI/CD est important pour les projets Rust ?
Développer en Rust ne consiste pas seulement à écrire du code sûr et rapide, mais aussi à assurer sa stabilité à long terme. CI/CD (Continuous Integration / Continuous Deployment) est une pratique qui automatise la compilation, les tests et le déploiement de votre projet. Pour Rust, avec son compilateur strict et son système de types, CI/CD est particulièrement utile : il permet de détecter les erreurs à un stade précoce, de vérifier la compatibilité des dépendances et de publier automatiquement de nouvelles versions.
GitHub Actions est un outil CI/CD intégré à la plateforme GitHub. Il fournit des modèles prêts à l'emploi pour Rust, de puissantes matrices de test et la possibilité d'intégration avec n'importe quel service cloud. Dans cet article, nous allons voir comment configurer un pipeline complet pour un projet Rust : de la vérification de base à la publication sur crates.io.
1. Les bases : création du premier workflow pour Rust
Un workflow dans GitHub Actions est un fichier YAML qui décrit une séquence d'étapes. Pour un projet Rust, un workflow minimal doit inclure : l'installation de Rust, le téléchargement des dépendances, la compilation et l'exécution des tests.
Créez le fichier .github/workflows/ci.yml à la racine de votre dépôt :
name: Rust CI
on: push: branches: [ main ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest
steps: - uses: actions/checkout@v4 - name: Setup Rust uses: actions-rs/toolchain@v1 with: toolchain: stable override: true components: clippy, rustfmt - name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/registry ~/.cargo/git 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 --checkCe workflow s'exécute à chaque push dans la branche principale ou lors de la création d'une pull request. La mise en cache des dépendances (actions/cache) accélère considérablement les exécutions suivantes. Notez le flag -- -D warnings dans clippy — il transforme les avertissements en erreurs, ce qui améliore la qualité du code.
1.1. Test matriciel : vérification sur plusieurs versions de Rust
Rust dispose de trois canaux de publication principaux : stable, beta et nightly. Pour vous assurer que votre code fonctionne sur toutes les versions, utilisez une matrice de stratégies :
jobs: test: runs-on: ubuntu-latest strategy: matrix: rust: [stable, beta, nightly] steps: - uses: actions/checkout@v4 - name: Setup Rust ${{ matrix.rust }} uses: actions-rs/toolchain@v1 with: toolchain: ${{ matrix.rust }} override: true - name: Build and test run: | cargo build cargo testAjoutez également une vérification sur la version minimale de Rust supportée (MSRV). Ceci est particulièrement important pour les bibliothèques. Par exemple, si votre Cargo.toml spécifie rust-version = "1.60", ajoutez rust: [1.60.0, stable] à la matrice.
2. Techniques avancées : optimisation et sécurité
2.1. Mise en cache avec prise en compte des profils
Par défaut, cargo build utilise le profil debug. Pour les compilations release, le cache sera différent. Séparez le cache pour les différents profils :
- name: Cache dependencies uses: actions/cache@v3 with: path: | ~/.cargo/registry ~/.cargo/git target key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}-${{ matrix.rust }}-${{ matrix.profile }} env: CARGO_TERM_COLOR: alwaysAjoutez profile: [debug, release] à la matrice.