Introducción a CI/CD para proyectos Go
El desarrollo moderno en Go (Golang) requiere no solo código de calidad, sino también una automatización confiable de los procesos de compilación, prueba e implementación. CI/CD (Continuous Integration / Continuous Deployment) es un enfoque que permite verificar automáticamente cada cambio en el código, ejecutar pruebas y entregar la aplicación lista a los usuarios. En este artículo, analizaremos en detalle cómo configurar un pipeline de CI/CD para proyectos Go usando GitHub Actions.
GitHub Actions es un sistema CI/CD integrado que permite crear flujos de trabajo (workflows) directamente en el repositorio de GitHub. Para los desarrolladores de Go, esto es especialmente conveniente, ya que no requiere configurar servicios externos y se integra fácilmente con la infraestructura existente.
¿Por qué GitHub Actions para Go?
- Gratuito para repositorios públicos — hasta 2000 minutos de compilaciones al mes gratis
- Soporte integrado para Go — acciones oficiales para configurar el entorno
- Flexibilidad — se puede ejecutar en Ubuntu, Windows, macOS
- Almacenamiento en caché — aceleración de compilaciones mediante caché de Go modules
- Pruebas matriciales — ejecución paralela en diferentes versiones de Go
Creación de un pipeline CI/CD básico
Empecemos creando un workflow simple que se ejecutará en cada push al repositorio. Para ello, necesitas crear un archivo .github/workflows/go.yml en la raíz de tu proyecto.
Ejemplo de workflow básico
name: Go CI/CD
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: build: runs-on: ubuntu-latest strategy: matrix: go-version: [ '1.21', '1.22' ]
steps: - uses: actions/checkout@v4
- name: Setup Go uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }}
- name: Cache Go modules uses: actions/cache@v3 with: path: ~/go/pkg/mod key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-
- name: Install dependencies run: go mod download
- name: Build run: go build -v ./...
- name: Test run: go test -v -race -coverprofile=coverage.txt ./...
- name: Upload coverage uses: codecov/codecov-action@v3 with: file: ./coverage.txt flags: unittestsEste workflow hace lo siguiente:
- Se ejecuta al hacer push a main/develop o al crear un pull request
- Prueba en dos versiones de Go (1.21 y 1.22)
- Almacena en caché los módulos para acelerar compilaciones posteriores
- Compila el proyecto y ejecuta pruebas con las banderas
-race(detector de carreras) y-cover(cobertura de código) - Sube el informe de cobertura a Codecov
Configuraciones avanzadas: linting y seguridad
Para un proyecto Go profesional, no basta con compilar y probar el código. Añadamos análisis estático y verificación de seguridad.
Añadiendo linting con golangci-lint
- name: Lint uses: golangci/golangci-lint-action@v3 with: version: latest args: --timeout=5m --out-format=colored-line-number skip-pkg-cache: truegolangci-lint combina decenas de linters (govet, staticcheck, errcheck y otros) y genera un informe unificado. Esto ayuda a encontrar errores potenciales, código no utilizado y problemas de estilo.
Verificación de seguridad con govulncheck
- name: Check vulnerabilities run: | go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./...La utilidad govulncheck analiza las dependencias del proyecto en busca de vulnerabilidades conocidas de la base de datos Go Vulnerability Database. Esto es crítico