← Retour aux tutoriels

DevOps : bonnes pratiques, CI/CD et automatisation

devopsci-cdinfrastructure-as-codekubernetesobservabilitedevsecopsautomatisationsre

DevOps : bonnes pratiques, CI/CD et automatisation

1) Introduction : qu’est-ce que le DevOps (et ce que ce n’est pas)

Le DevOps est une approche organisationnelle et technique visant à réduire le temps entre une idée (ou un correctif) et sa mise en production, tout en augmentant la fiabilité. Il s’appuie sur la collaboration entre développement, opérations, sécurité et qualité, et sur l’automatisation (tests, build, déploiement, observabilité).

Ce n’est pas :

C’est plutôt :


2) Principes clés : flux, feedback, amélioration continue

2.1 Flux (Flow)

Objectif : faire circuler le travail sans blocage.

2.2 Feedback rapide

Objectif : détecter tôt.

2.3 Amélioration continue

Objectif : apprendre et corriger le système.


3) Git : stratégie de branches et hygiène de dépôt

3.1 Stratégies de branches (pragmatiques)

Deux approches courantes :

Trunk-based development

GitFlow (plus lourd)

Dans la majorité des équipes modernes, trunk-based + feature flags + CI robuste est souvent plus efficace.

3.2 Conventions de commit

Adopter des messages structurés aide l’automatisation (changelog, versioning sémantique). Exemple (Conventional Commits) :

git commit -m "feat(api): ajout de l'endpoint /health"
git commit -m "fix(auth): correction du rafraîchissement de token"
git commit -m "chore(ci): accélération du cache npm"

3.3 Revue de code : règles simples mais strictes


4) CI (Intégration Continue) : pipeline de base et bonnes pratiques

4.1 Objectifs de la CI

4.2 Exemple concret : projet Node.js

Structure typique :

Commandes locales (à exécuter avant de pousser) :

npm ci
npm run lint
npm test
npm run build

4.3 Caching et reproductibilité

4.4 Qualité : lint, tests, couverture, analyse statique

Exemples d’outils :

Exemples de commandes :

# JavaScript/TypeScript
npx eslint . --max-warnings=0
npm test -- --ci

# Python
python -m pip install -r requirements.txt
pytest -q --disable-warnings --maxfail=1
pip-audit

# Conteneurs (scan d'image)
trivy image myapp:1.2.3

5) Docker : construire, exécuter, optimiser

5.1 Dockerfile : bonnes pratiques

Exemple multi-stage (Node.js) :

# build
FROM node:20-slim AS build
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build

# runtime
FROM node:20-slim
WORKDIR /app
ENV NODE_ENV=production
COPY package*.json ./
RUN npm ci --omit=dev && npm cache clean --force
COPY --from=build /app/dist ./dist

# utilisateur non-root
RUN useradd -m appuser
USER appuser

EXPOSE 3000
CMD ["node", "dist/server.js"]

Construire et lancer :

docker build -t myapp:local .
docker run --rm -p 3000:3000 myapp:local

5.2 Gestion des secrets : ne jamais les mettre dans l’image

Exemple :

docker run --rm -p 3000:3000 \
  -e DATABASE_URL="postgres://user:pass@db:5432/app" \
  myapp:local

6) CD (Déploiement Continu) : stratégies de déploiement et sécurité

6.1 Livraison continue vs déploiement continu

6.2 Stratégies de déploiement

Rolling update

Blue/Green

Canary

6.3 Migrations de base de données

Règles pratiques :

Exemple (PostgreSQL) : exécuter une migration

psql "$DATABASE_URL" -f migrations/2026_04_28_add_index.sql

7) Infrastructure as Code (IaC) : rendre l’infra versionnée et reproductible

7.1 Pourquoi l’IaC

7.2 Terraform : commandes essentielles

Initialiser :

terraform init

Voir les changements :

terraform plan -out plan.tfplan

Appliquer :

terraform apply plan.tfplan

Détruire (attention) :

terraform destroy

Bonnes pratiques Terraform :

Commandes de qualité :

terraform fmt -check -recursive
terraform validate

8) Kubernetes : déployer proprement (sans magie)

8.1 Notions minimales

8.2 Commandes kubectl utiles

Voir les ressources :

kubectl get pods -n myns
kubectl get deploy -n myns
kubectl get svc -n myns

Décrire et diagnostiquer :

kubectl describe pod mypod -n myns
kubectl logs -f deploy/myapp -n myns
kubectl exec -it deploy/myapp -n myns -- sh

Rollback d’un deployment :

kubectl rollout status deploy/myapp -n myns
kubectl rollout history deploy/myapp -n myns
kubectl rollout undo deploy/myapp -n myns

8.3 Health checks : readiness vs liveness

Sans readiness, Kubernetes peut envoyer du trafic trop tôt, causant des erreurs au démarrage.


9) Automatisation : scripts, Makefile, tâches reproductibles

9.1 Makefile comme interface standard

Un Makefile simple unifie les commandes :

.PHONY: install lint test build docker run

install:
	npm ci

lint:
	npm run lint

test:
	npm test

build:
	npm run build

docker:
	docker build -t myapp:local .

run:
	docker run --rm -p 3000:3000 myapp:local

Utilisation :

make install
make lint
make test
make docker
make run

9.2 Pré-commit hooks (qualité avant push)

Installer pre-commit (Python) ou des hooks Git maison.

Exemple hook simple .git/hooks/pre-commit :

#!/usr/bin/env bash
set -euo pipefail

npm run lint
npm test

Activer :

chmod +x .git/hooks/pre-commit

10) CI/CD avec GitHub Actions : exemple complet (sans “magie”)

Ci-dessous, un exemple de pipeline conceptuel (à adapter) : lint + tests + build d’image + scan + push.
Les commandes sont réelles, mais l’intégration exacte dépend de votre registre (GHCR, Docker Hub, ECR…).

10.1 Étapes typiques côté CI

En local, simuler les étapes :

npm ci
npm run lint
npm test
docker build -t ghcr.io/ORG/myapp:sha-$(git rev-parse --short HEAD) .
trivy image ghcr.io/ORG/myapp:sha-$(git rev-parse --short HEAD)

Se connecter à un registre (exemple Docker Hub) :

echo "$DOCKERHUB_TOKEN" | docker login -u "$DOCKERHUB_USER" --password-stdin
docker push myorg/myapp:1.2.3

10.2 Versioning et tags d’images

Bonnes pratiques :


11) Sécurité DevSecOps : intégrer la sécurité au pipeline

11.1 Surfaces à couvrir

11.2 Commandes utiles

Scan de secrets (ex: gitleaks) :

gitleaks detect --source . --no-git

Audit npm :

npm audit --audit-level=high

Scan d’image :

trivy image --severity HIGH,CRITICAL myapp:local

11.3 Politique de “gates”

Définir des seuils :


12) Observabilité : logs, métriques, traces (et surtout actionnables)

12.1 Logs structurés

Préférer JSON (facile à indexer). Exemple (Node) : log minimal structuré :

node -e 'console.log(JSON.stringify({level:"info",msg:"server started",port:3000}))'

Bonnes pratiques :

12.2 Métriques (SLI/SLO)

Définir des SLI (indicateurs) :

Puis des SLO (objectifs) :

12.3 Traces distribuées

Indispensables en microservices. Les traces permettent de voir où part le temps (DB, cache, appels externes). Outils : OpenTelemetry, Jaeger, Tempo.


13) Stratégies de rollback et gestion d’incident

13.1 Rollback applicatif

Exemple (Kubernetes) :

kubectl rollout undo deploy/myapp -n myns

13.2 Rollback base de données

Plus délicat :

Sauvegarde PostgreSQL :

pg_dump "$DATABASE_URL" > backup_$(date +%F).sql

Restauration (attention, destructif) :

psql "$DATABASE_URL" < backup_2026-04-28.sql

13.3 Runbooks

Documenter les actions :


14) Environnements : dev, staging, prod (et la parité)

14.1 Parité des environnements

Objectif : réduire les “ça marche sur ma machine”.

14.2 Staging réaliste


15) Exemple de chaîne complète (de l’idée à la prod)

  1. Développeur crée une branche courte :
git checkout -b feat/healthcheck
  1. Développement + tests locaux :
make install
make lint
make test
  1. Build container local :
make docker
  1. Push + PR/MR, CI exécute :
  1. Déploiement en staging :
  1. Promotion en production :

16) Anti-patterns fréquents (et comment les éviter)


17) Checklist opérationnelle (prête à appliquer)

CI

CD

Sécurité

Observabilité


18) Conclusion : commencer petit, standardiser, puis accélérer

Mettre en place le DevOps efficacement consiste rarement à “tout faire d’un coup”. Le meilleur chemin est itératif :

  1. Standardiser les commandes (Makefile/scripts).
  2. Mettre une CI fiable (lint/tests/build).
  3. Produire des artefacts immuables (images taggées).
  4. Automatiser le déploiement (staging puis prod).
  5. Renforcer sécurité et observabilité.
  6. Mesurer et améliorer (DORA, SLO, post-mortems).

Si vous souhaitez, je peux proposer une architecture de pipeline adaptée à votre stack (Node/Python/Java/Go), votre cible (VM, Kubernetes, serverless) et votre registre (GHCR/ECR/GCR), avec des scripts concrets et une organisation de dépôt recommandée.