Introduction au CI/CD pour les projets Go
Le développement moderne en Go (Golang) nécessite non seulement un code de qualité, mais aussi une automatisation fiable des processus de build, de test et de déploiement. CI/CD (Continuous Integration / Continuous Deployment) est une approche qui permet de vérifier automatiquement chaque modification du code, d'exécuter les tests et de livrer l'application prête aux utilisateurs. Dans cet article, nous allons détailler comment configurer un pipeline CI/CD pour les projets Go avec GitHub Actions.
GitHub Actions est un système CI/CD intégré qui permet de créer des workflows directement dans le dépôt GitHub. Pour les développeurs Go, c'est particulièrement pratique car cela ne nécessite pas de configuration de services externes et s'intègre facilement à l'infrastructure existante.
Pourquoi GitHub Actions pour Go ?
- Gratuit pour les dépôts publics — jusqu'à 2000 minutes de builds par mois gratuitement
- Support Go intégré — actions officielles pour configurer l'environnement
- Flexibilité — possibilité d'exécuter sur Ubuntu, Windows, macOS
- Mise en cache — accélération des builds grâce au cache des Go modules
- Tests matriciels — exécution parallèle sur différentes versions de Go
Création d'un pipeline CI/CD de base
Commençons par créer un workflow simple qui s'exécutera à chaque push dans le dépôt. Pour cela, il faut créer un fichier .github/workflows/go.yml à la racine de votre projet.
Exemple de workflow de base
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: unittestsCe workflow effectue les actions suivantes :
- Se déclenche lors d'un push sur main/develop ou lors de la création d'une pull request
- Teste sur deux versions de Go (1.21 et 1.22)
- Met en cache les modules pour accélérer les builds suivants
- Build le projet et exécute les tests avec les flags
-race(détecteur de race conditions) et-cover(couverture de code) - Télécharge le rapport de couverture vers Codecov
Paramètres avancés : linting et sécurité
Pour un projet Go professionnel, il ne suffit pas de builder et de tester le code. Ajoutons l'analyse statique et la vérification de la sécurité.
Ajout du linting avec 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 combine des dizaines de linters (govet, staticcheck, errcheck et autres) et produit un rapport unifié. Cela aide à détecter les erreurs potentielles, le code inutilisé et les problèmes de style.
Vérification de la sécurité avec govulncheck
- name: Check vulnerabilities run: | go install golang.org/x/vuln/cmd/govulncheck@latest govulncheck ./...L'utilitaire govulncheck analyse les dépendances du projet pour détecter les vulnérabilités connues issues de la base de données Go Vulnerability Database. C'est une étape critique