CI/CD pour projets Go : GitHub Actions de A à Z

Formateur Python en ligne pour débutants

Apprenez Python facilement sans surcharge théorique. Résolvez des tâches pratiques avec vérification automatique et écrivez du code directement dans le navigateur.

Start Course

CI/CD pour projets Go avec GitHub Actions : guide complet



L'automatisation des processus de compilation, de test et de déploiement est une partie essentielle du développement moderne en Go (Golang). GitHub Actions fournit une boîte à outils puissante et flexible pour construire des pipelines CI/CD directement dans votre dépôt. Dans cet article, nous allons voir comment configurer un cycle complet d'intégration et de livraison continues pour un projet Go, des tests simples au déploiement automatique.



Qu'est-ce que CI/CD et pourquoi est-ce important pour Go ?



CI (Continuous Integration) est la pratique de fusionner fréquemment le code dans la branche principale avec compilation et tests automatiques. CD (Continuous Delivery/Deployment) est le déploiement automatique de l'application prête.

Pour les projets Go, CI/CD est particulièrement utile car :

  • Go compile en un binaire statique, ce qui simplifie le déploiement
  • Tests rapides grâce à la vitesse native de Go
  • Vérification automatique par des linters et du formatage (gofmt, golangci-lint)
  • Possibilité de compilation multiplateforme (Linux, macOS, Windows)


Bases de GitHub Actions pour Go



GitHub Actions utilise des fichiers YAML dans le répertoire .github/workflows. Chaque fichier décrit un ou plusieurs workflows (pipelines).



Examinons un workflow de base pour un projet 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.out


Ce workflow s'exécute lors d'un push sur main/develop et sur une pull request. Il installe Go, met en cache les dépendances, lance les tests avec les flags -race (détecteur de concurrence) et -coverprofile (couverture de code).



Configurations avancées : linters et compilation multiplateforme



Pour maintenir la qualité du code, ajoutons une vérification par linter. golangci-lint est la norme de facto pour 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 compilation multiplateforme est utile si votre application doit fonctionner sur différents OS :



  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/app


Note : pour Windows, il faudra ajuster le nom du fichier de sortie (ajouter .exe). Utilisez if runner.os == 'Windows' ou définissez le nom via des variables.



Déploiement automatique d'une application Go



Pour le déploiement, examinons deux scénarios populaires : publication d'une image Docker et téléchargement du binaire sur un serveur.



Blogs

Book Recommendations