CI/CD para proyectos Go con GitHub Actions: guía completa

Entrenador de Python en Línea para Principiantes

Aprende Python fácilmente sin sobrecargarte de teoría. Resuelve tareas prácticas con verificación automática, recibe pistas y escribe código directamente en el navegador, sin instalar nada.

Start Course

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: unittests


Este 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: true


golangci-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

Blogs

Book Recommendations