CI/CD para proyectos Go con GitHub Actions: guía completa
La automatización de los procesos de compilación, prueba e implementación es una parte esencial del desarrollo moderno en Go (Golang). GitHub Actions proporciona un conjunto de herramientas potente y flexible para construir pipelines de CI/CD directamente en tu repositorio. En este artículo, analizaremos cómo configurar un ciclo completo de integración y entrega continua para un proyecto Go, desde pruebas simples hasta la implementación automática.
¿Qué es CI/CD y por qué es importante para Go?
CI (Continuous Integration) es la práctica de fusionar código con frecuencia en la rama principal con compilación y pruebas automáticas. CD (Continuous Delivery/Deployment) es la implementación automática de la aplicación lista.
Para proyectos Go, CI/CD es especialmente útil porque:
- Go se compila en un binario estático, lo que simplifica la implementación
- Pruebas rápidas gracias a la velocidad nativa de Go
- Verificación automática con linters y formato (
gofmt,golangci-lint) - Posibilidad de compilación multiplataforma (Linux, macOS, Windows)
Fundamentos de GitHub Actions para Go
GitHub Actions utiliza archivos YAML en el directorio .github/workflows. Cada archivo describe uno o varios workflows (pipelines).
Consideremos un workflow básico para un proyecto Go:
name: Go CI
on: push: branches: [ main, develop ] pull_request: branches: [ main ]
jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Cache Go modules uses: actions/cache@v4 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: Run tests run: go test -v -race -coverprofile=coverage.out ./... - name: Upload coverage uses: actions/upload-artifact@v4 with: name: coverage path: coverage.outEste workflow se ejecuta al hacer push a main/develop y en pull requests. Configura Go, almacena en caché las dependencias, ejecuta pruebas con las banderas -race (detector de carreras) y -coverprofile (cobertura de código).
Configuraciones avanzadas: linters y compilación multiplataforma
Para mantener la calidad del código, agreguemos una verificación con linter. golangci-lint es el estándar de facto para Go.
lint: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: golangci-lint uses: golangci/golangci-lint-action@v6 with: version: latest args: --timeout=5m ./...La compilación multiplataforma es útil si tu aplicación debe funcionar en diferentes SO:
build: needs: [test, lint] strategy: matrix: os: [ubuntu-latest, macos-latest, windows-latest] goarch: [amd64, arm64] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Set up Go uses: actions/setup-go@v5 with: go-version: '1.22' - name: Build run: | GOARCH=${{ matrix.goarch }} go build -v -o myapp-${{ matrix.os }}-${{ matrix.goarch }} ./cmd/appTen en cuenta: para Windows será necesario ajustar el nombre del archivo de salida (agregar .exe). Usa if runner.os == 'Windows' o define el nombre mediante variables.
Implementación automática de una aplicación Go
Para la implementación, consideremos dos escenarios populares: publicación de una imagen Docker y carga del binario en un servidor.
Blogs
Book Recommendations
Leer también
Caché en Rust: Redis, Memcached y soluciones integradas
Salarios de desarrolladores Kotlin en Rusia: panorama del mercado para nivel avanzado
Java desde cero hasta PRO: TOP canales y cursos de YouTube 2024
Pruebas en Go: unit, integration, e2e — guía completa
JSON en JavaScript: guía completa de análisis y serialización
Blogs
Book Recommendations
Leer también
Caché en Rust: Redis, Memcached y soluciones integradas