CI/CD avancé pour projets Go avec GitHub Actions
L'automatisation de la compilation, des tests et du déploiement est la base du développement Go moderne. Les pipelines de base sont bons pour démarrer, mais lorsque le projet grandit, des techniques avancées sont nécessaires : mise en cache des dépendances, jobs parallèles, builds matriciels pour différents OS et architectures, publication d'artefacts sur Docker Hub et déploiement intelligent. Dans cet article, nous verrons comment configurer GitHub Actions pour un projet Go à un niveau professionnel.
1. Mise en cache des modules Go et des binaires
Chaque exécution de pipeline peut télécharger des dizaines de mégaoctets de dépendances. Pour accélérer le processus, utilisons la mise en cache intégrée de GitHub Actions pour go mod et le cache de compilation.
name: Go CI (avancé)on: [push, pull_request]
jobs: build-and-test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Installation de Go uses: actions/setup-go@v5 with: go-version: '1.22'
- name: Mise en cache des modules Go uses: actions/cache@v4 with: path: | ~/go/pkg/mod ~/.cache/go-build key: ${{ runner.os }}-go-${{ hashFiles('**/go.sum') }} restore-keys: | ${{ runner.os }}-go-
- name: Téléchargement des dépendances run: go mod download
- name: Linter (golangci-lint) uses: golangci/golangci-lint-action@v6 with: version: latest
- name: Tests avec couverture run: go test -v -race -coverprofile=coverage.out ./...
- name: Compilation du binaire run: go build -o myapp ./cmd/appLa clé hashFiles('**/go.sum') invalide le cache uniquement en cas de modification des dépendances. Le cache de compilation (~/.cache/go-build) conserve les objets compilés, accélérant la recompilation.
2. Builds matriciels : tests sous différentes versions de Go et OS
Les projets Go doivent souvent fonctionner sur Linux, macOS et Windows, et prendre en charge plusieurs versions du langage. La matrice (matrix strategy) permet d'exécuter des jobs parallèles pour chaque combinaison.
jobs: matrix-test: strategy: matrix: go-version: ['1.21', '1.22', '1.23'] os: [ubuntu-latest, macos-latest, windows-latest] runs-on: ${{ matrix.os }} steps: - uses: actions/checkout@v4 - name: Installation de Go ${{ matrix.go-version }} uses: actions/setup-go@v5 with: go-version: ${{ matrix.go-version }} - name: Tests run: go test ./...Cette approche révèle les problèmes de compatibilité sur différentes plateformes. Pour Windows, une configuration supplémentaire des chemins et des sauts de ligne peut être nécessaire. Ajoutez fail-fast: false pour que les autres jobs continuent même si l'un d'eux échoue.
3. Publication d'une image Docker et d'une GitHub Release
Après des tests réussis, il est logique de publier les artefacts : une image Docker sur Docker Hub (ou GitHub Container Registry) et un binaire dans GitHub Release. Examinons les deux scénarios.
Publication d'une image Docker
Créons un job qui s'exécute uniquement après les tests et uniquement lors d'un push sur main ou de la création d'un tag.
jobs: docker: needs: [build-and-test] if: github.ref == 'refs/heads/main' || startsWith(github.ref, 'refs/tags/v') runs-on: ubuntu-latest steps: - uses: actions/checkout@v4
- name: Connexion à Docker Hub uses: docker/login-action@v3 with: username: ${{ secrets.DOCKER_USERNAME }} password: ${{ secrets.DOCKER_PASSWORD }}
- name: Compilation et push de l'image uses: docker/build-push-action@v5 with: context: . push: true tags: | ${{ secrets.DOCKER_USERNAME }}/myapp:latest ${{ secrets.DOCKER_USERNAME }}/myapp:${{ github.sha }}Ne pas