CI/CD para proyectos Go: GitHub Actions de la A a la Z
\n\nEn el desarrollo de software moderno, la automatización de los procesos de compilación, prueba e implementación (CI/CD) se ha convertido no solo en una conveniencia, sino en una necesidad. Para proyectos en Go (Golang), usar GitHub Actions es una de las formas más simples y efectivas de organizar la integración y entrega continuas. En este artículo, analizaremos el ciclo completo de configuración de un pipeline de CI/CD para aplicaciones Go, desde la configuración básica hasta el despliegue automático.
\n\n¿Qué es GitHub Actions y por qué es importante para Go?
\n\nGitHub Actions es una plataforma integrada para automatizar flujos de trabajo (workflows) en repositorios de GitHub. Permite crear pipelines que se activan con eventos específicos: push a una rama, creación de un pull request, publicación de un lanzamiento, etc.
\n\nPara proyectos Go, GitHub Actions ofrece varias ventajas clave:
\n- \n
- Compilación rápida — Go compila muy rápido, lo que reduce el tiempo de ejecución del pipeline. \n
- Enlace estático — Los binarios de Go no requieren dependencias externas, lo que simplifica el despliegue. \n
- Pruebas integradas — La utilidad
go testse integra perfectamente con los sistemas de CI. \n - Multiplataforma — Es fácil compilar binarios para diferentes sistemas operativos y arquitecturas. \n
Configuración de un pipeline CI básico
\n\nComencemos creando un workflow simple que ejecutará pruebas y verificará que el código cumpla con los estándares de Go. Para ello, en la raíz de tu repositorio, crea el directorio .github/workflows y el archivo ci.yml.
Ejemplo de configuración básica:
\n\nname: CI Pipeline for Go\n\non:\n push:\n branches: [ main, develop ]\n pull_request:\n branches: [ main ]\n\njobs:\n build-and-test:\n runs-on: ubuntu-latest\n \n steps:\n - name: Checkout code\n uses: actions/checkout@v4\n\n - name: Setup Go\n uses: actions/setup-go@v5\n with:\n go-version: '1.22'\n\n - name: Cache Go modules\n uses: actions/cache@v4\n with:\n path: ~/go/pkg/mod\n key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }}\n restore-keys: |\n ${{ runner.os }}-go-\n\n - name: Download dependencies\n run: go mod download\n\n - name: Run vet\n run: go vet ./...\n\n - name: Run tests\n run: go test -v -race -count=1 ./...\n\n - name: Build\n run: go build -o myapp ./cmd/app\n\nEste workflow realiza los siguientes pasos:
\n- \n
- Clona el repositorio. \n
- Instala Go versión 1.22. \n
- Almacena en caché los módulos para acelerar ejecuciones posteriores. \n
- Descarga las dependencias mediante
go mod download. \n - Ejecuta
go vetpara el análisis estático. \n - Realiza las pruebas con la bandera
-racepara detectar condiciones de carrera. \n - Compila el archivo binario. \n
Configuración avanzada: compilación multiplataforma y linters
\n\nGo permite compilar fácilmente aplicaciones para diferentes plataformas. Agreguemos al pipeline una matriz de compilación (build matrix) y la ejecución del linter golangci-lint.
Archivo ci.yml actualizado:
name: Advanced Go CI/CD\n\non:\n push:\n branches: [ main ]\n pull_request:\n branches: [ main ]\n\njobs:\n lint:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-go@v5\n with:\n go-version: '1.22'\n - name: golangci-lint\n uses: golangci/golangci-lint-action@v4\n with:\n version: latest\n args: --timeout=5m\n\n test:\n runs-on: ubuntu-latest\n steps:\n - uses: actions/checkout@v4\n - uses: actions/setup-go@v5\n with:\n go-version: '1.22'\n - run: go test -v -race -coverprofile=covera