Introducción: Por qué CI/CD es crítico para proyectos Rust
Rust es un lenguaje de programación de sistemas conocido por su rendimiento y seguridad de memoria. Sin embargo, incluso el código más confiable requiere verificación constante. Las pruebas y compilaciones manuales consumen tiempo y son propensas a errores. CI/CD (Integración Continua/Despliegue Continuo) automatiza estos procesos, garantizando que cada cambio en el código pase por la verificación del compilador, pruebas y linters antes de llegar a la rama principal.
GitHub Actions es una plataforma integrada para automatizar flujos de trabajo en GitHub. Es ideal para proyectos Rust gracias a su flexibilidad, límite gratuito de minutos para repositorios públicos y un enorme ecosistema de acciones listas para usar. En este artículo, analizaremos el ciclo completo de configuración de CI/CD para Rust: desde la compilación básica hasta la optimización mediante almacenamiento en caché y despliegue.
1. Fundamentos: Primer workflow para compilación y pruebas
Comencemos creando un flujo de trabajo mínimo. En la raíz de tu repositorio, crea la carpeta .github/workflows y el archivo ci.yml.
Archivo ci.yml básico
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 --verboseDesglose de elementos clave:
- on: Disparadores: se ejecuta al hacer push a main y al crear un Pull Request.
- env: La variable
CARGO_TERM_COLORhabilita la salida de logs en color. - actions/checkout: Acción estándar para clonar el repositorio.
- dtolnay/rust-toolchain: La acción más popular para instalar Rust. Usa
stable,nightlyo una versión específica.
Este workflow ya es útil: garantiza que el código compile y que todas las pruebas pasen. Pero para un proyecto real, esto no es suficiente.
2. Optimización: Caché de dependencias y compilación multiplataforma
Cada ejecución de CI descarga todas las dependencias de nuevo. Para proyectos Rust con muchos crates, esto puede llevar minutos. La solución es almacenar en caché las carpetas ~/.cargo y target.
Añadiendo caché
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 --verbosePuntos clave:
- hashFiles('**/Cargo.lock'): La caché se invalida solo cuando cambia
Cargo.lock. - path: Almacenamos en caché los binarios, el índice del registro y la carpeta
target. - Restauración: Si la clave coincide, la caché se restaura y cargo omite la descarga.
Compilación multiplataforma
Rust soporta múltiples plataformas. Para asegurarte de que tu código funciona en todas partes, usa una matriz de compilación:
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```