Introducción: ¿Por qué CI/CD es críticamente importante para proyectos Rust?
\nDesarrollar en Rust no solo se trata de seguridad de memoria y alto rendimiento, sino también de una disciplina estricta. El compilador de Rust detecta muchos errores en la etapa de compilación, pero esto no elimina la necesidad de pruebas de calidad, linting y verificación de compatibilidad de dependencias. Aquí es donde entra en juego el CI/CD (Integración Continua / Despliegue Continuo).
\nGitHub Actions es un sistema de automatización integrado que es perfecto para proyectos Rust. Permite ejecutar pruebas automáticamente, formatear código, verificar vulnerabilidades e incluso publicar crates en el registro crates.io con cada push al repositorio. En este artículo, analizaremos el pipeline completo: desde cargo build básico hasta el despliegue en producción.
1. Conceptos básicos: Configuración de un workflow básico para Rust
\nCualquier pipeline de CI/CD en GitHub Actions comienza con la creación de un archivo YAML en el directorio .github/workflows/. Vamos a crear un archivo ci.yml para la verificación básica de un proyecto Rust.
1.1. Primer workflow: Compilación y pruebas
\nEmpecemos con un conjunto mínimo: clonar el repositorio, instalar Rust y ejecutar pruebas.
\nname: Rust CI\n\non:\n push:\n branches: [ "main", "develop" ]\n pull_request:\n branches: [ "main" ]\n\nenv:\n CARGO_TERM_COLOR: always\n\njobs:\n build:\n runs-on: ubuntu-latest\n\n steps:\n - uses: actions/checkout@v4\n - name: Install Rust\n uses: dtolnay/rust-toolchain@stable\n - name: Build\n run: cargo build --verbose\n - name: Run tests\n run: cargo test --verbose\n¿Qué sucede aquí?
\n- \n
actions/checkout@v4— clona tu código. \n dtolnay/rust-toolchain@stable— la acción oficial para instalar Rust (admite nightly, beta y stable). \n cargo buildycargo test— los comandos principales para verificar el proyecto. \n
Este workflow se ejecutará con cada push a las ramas main y develop, así como al crear un Pull Request.
1.2. Almacenamiento en caché de dependencias para acelerar la compilación
\nLos proyectos Rust a menudo tienen muchas dependencias. Para no descargarlas cada vez, utiliza el almacenamiento en caché. Esto reducirá el tiempo de compilación de 5-10 minutos a 30-60 segundos.
\n - name: Cache Cargo registry\n uses: actions/cache@v3\n with:\n path: |\n ~/.cargo/registry\n ~/.cargo/git\n target/\n key: ${{ runner.os }}-cargo-${{ hashFiles('**/Cargo.lock') }}\n restore-keys: |\n ${{ runner.os }}-cargo-\nAgrega este paso antes de ejecutar cargo build. El hash del archivo Cargo.lock garantiza que el caché solo se actualice cuando cambien las dependencias.
2. Verificación avanzada de calidad de código
\nLas pruebas por sí solas no son suficientes para mantener una alta calidad de código. Agreguemos linting, formateo y verificación de seguridad.
\n\n2.1. Formateo (rustfmt) y linting (clippy)
\nRust tiene herramientas integradas para mantener un estilo de código uniforme. Agreguémoslas en un job separado:
\n lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: dtolnay/rust-toolchain@stable\n with:\n components: clippy, rustfmt\n - name: Check formatting\n run: cargo fmt --check\n - name: Run clippy\n run: cargo clippy -- -D warnings\n- \n
cargo fmt --check— verifica que el código esté formateado según el estándarrustfmt. \n cargo clippy -- -D warnings— ejecuta el linter y convierte las advertencias en errores (bandera-D). \n
Esto ayudará a evitar código "sucio" en el repositorio.
\n\n