Pourquoi CI/CD pour Go avec GitHub Actions ?
La continuité d'intégration et du déploiement (CI/CD) est essentielle dans le développement logiciel moderne, surtout pour les langages de programmation comme Go qui sont connus pour leur efficacité et leur rapidité. Avec GitHub Actions, un outil puissant et facile à utiliser, la mise en œuvre d'un pipeline CI/CD peut être réalisée directement depuis votre dépôt Git sur GitHub.
Un cas concret d'utilisation de la CI/CD avec Go est lorsque vous travaillez sur une application web qui nécessite des tests unitaires, des tests d'intégration et un déploiement continu sur différents environnements (développement, test, production). La CI/CD automatisera ces tâches, assurant que votre code est toujours en état de fonctionner et prêt à être déployé.
Prerequis
Pour suivre ce tutoriel, vous aurez besoin des éléments suivants :
- Un compte GitHub
- Connaissance de base de Go (version 1.16 ou ultérieure recommandée)
- La version
goinstallée sur votre machine (go version) - La ligne de commande
git
Concepts fondamentaux
Pipeline et Workflow
Un pipeline est une séquence d'étapes logicielles qui définissent comment le code source est transformé en un produit final, comme une application déployée. Un workflow est une collection de pipelines.
## .github/workflows/go.yml
name: CI/CD for Go
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: '1.16'
Actions et Steps
Dans un workflow, les étapes (steps) sont des actions spécifiques qui s'exécutent dans l'ordre. Chaque étape peut exécuter une commande shell ou utiliser une action préconçue.
- name: Run tests
run: go test ./...
Variables d'environnement
Les variables d'environnement peuvent être définies pour les actions et les étapes.
- name: Set environment variable
run: echo "MY_ENV_VAR=value" >> $GITHUB_ENV
Mise en pratique : projet fil rouge
Nous allons créer un simple gestionnaire de tâches en Go. Ce projet comprendra des tests unitaires et une étape de déploiement sur GitHub Pages.
Étape 1 : Initialisation du projet
mkdir task-manager
cd task-manager
go mod init task-manager
Créez un fichier main.go :
// main.go
package main
import (
"fmt"
)
type Task struct {
ID int
Name string
}
func (t *Task) Complete() {
fmt.Printf("Task %d: %s completed\n", t.ID, t.Name)
}
func main() {
task := &Task{ID: 1, Name: "Write documentation"}
task.Complete()
}
Étape 2 : Ajout des tests unitaires
Créez un fichier task_test.go :
// task_test.go
package main
import (
"testing"
)
func TestComplete(t *testing.T) {
task := &Task{ID: 1, Name: "Write documentation"}
task.Complete()
if got := fmt.Sprintf("%s", task); got != "Task 1: Write documentation completed" {
t.Errorf("Expected 'Task 1: Write documentation completed', but got '%s'", got)
}
}
Étape 3 : Création du fichier go.yml pour GitHub Actions
## .github/workflows/go.yml
name: CI/CD for Go
on:
push:
branches: [ main ]
pull_request:
branches: [ main ]
jobs:
build-and-test:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
- name: Set up Go
uses: actions/setup-go@v2
with:
go-version: '1.16'
- name: Run tests
run: go test ./...
Étape 4 : Déploiement sur GitHub Pages
Ajoutez une étape de déploiement sur GitHub Pages :
- name: Deploy to GitHub Pages
uses: peaceiris/actions-gh-pages@v3
with:
github_token: $secrets.GITHUB_TOKEN
publish_dir: ./docs
Créez un fichier index.html dans le répertoire docs :
<!-- docs/index.html -->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Task Manager</title>
</head>
<body>
<h1>Welcome to Task Manager</h1>
</body>
</html>
Étape 5 : Commit et push
git add .
git commit -m "Initial commit"
git branch -M main
git remote add origin https://github.com/your-username/task-manager.git
git push -u origin main
Erreurs frequentes et debugging
Erreur :
go test: no packages named 'task_manager' in current directory# ❌ Mauvais go test ./... # ✅ Correct go test ./...Erreur :
actions/checkout@v2: Resource not accessible by token.# ❌ Mauvais uses: actions/checkout@v2 # ✅ Correct uses: actions/checkout@v2Erreur :
actions/setup-go@v2: The Go version '1.16' is not available.# ❌ Mauvais with: go-version: '1.16' # ✅ Correct with: go-version: '1.16'
Pour aller plus loin
1. Utilisation de Go Modules pour la gestion des dépendances
L'utilisation de Go Modules permet de gérer les dépendances de manière transparente.
## .github/workflows/go.yml
- name: Install dependencies
run: go mod tidy
2. Configuration du déploiement sur une infrastructure cloud (AWS, Google Cloud, Azure)
La mise en œuvre du déploiement continu vers une infrastructure cloud peut être réalisée avec des actions spécifiques à chaque fournisseur.
## .github/workflows/deploy-aws.yml
name: Deploy to AWS
on:
push:
branches: [ main ]
jobs:
deploy:
runs-on: ubuntu-latest
steps:
- name: Checkout code
uses: actions/checkout@v2
# Autres étapes pour configurer et déployer sur AWS
3. Utilisation de l'actions cache pour accélérer le build
L'utilisation du cache des actions permet d'accélérer le processus de build en stockant les dépendances et les outils nécessaires.
## .github/workflows/go.yml
- name: Set up Go cache
uses: actions/cache@v2
with:
path: ~/.cache/go-build
key: $runner.os-go-$hashFiles('**/go.mod')
Défi pratique
Développer une API de blog en utilisant les concepts vus dans ce tutoriel, avec des tests unitaires et des étapes de déploiement sur GitHub Pages.