Intro
Cette version française explique Redis CI/CD automation with practical examples avec le même objectif pratique que l article source : aider le lecteur à comprendre le contexte, les décisions à prendre et les points à vérifier avant de passer à l action.
Redis se trouve souvent sur le chemin critique de la latence et de la disponibilité. Mettre en place une automatisation Redis CI/CD bien conçue réduit l27erreur humaine, raccourcit les boucles de feedback et rend les opérations risquées répétables. Dans ce guide pratique, vous allez :
- Dresser l27inventaire des versions Redis, de la topologie et des environnements afin que chaque changement soit ciblé et testable.
- Construire un pilote étroit et inspectable qui valide la configuration, exécute des smoke tests et démontre un déploiement et un rollback sûrs.
- Ajouter des vérifications et diagnostics pour rendre chaque changement observable et réversible.
- Comprendre les modes de panne courants et des étapes de récupération concrètes.
L27objectif n27est pas d27automatiser tout d27un coup. Démarrez par une tranche étroite que vous pouvez inspecter en local et en staging, puis étendez une fois que le chemin vous inspire confiance. Utilisez les termes clés là of9 ils ont du sens : Redis CI/CD, Redis automation, Redis deployment, Redis pipeline et Redis rollback.
Inventaire des versions et des environnements
Avant d27écrire la moindre ligne de pipeline, capturez ce que vous exécutez et of9. Cet inventaire pilote les contrôles de compatibilité et la forme du déploiement.
- Version Redis : 6.x, 7.x ou variante managée.
- Topologie : instance unique, HA gérée par Sentinel, ou Cluster.
- Persistance : snapshots RDB, AOF, ou les deux.
- Auth : utilisateurs/mots de passe ACL, TLS, politiques réseau.
- Endpoints : noms dôtes/ports par environnement.
- Bibliothèques clientes et versions : Node.js, Java, Go, etc.
- Risques de données : keyspaces écrits intensivement, politiques d27éviction, maxmemory.
Conservez cet inventaire sous contrôle de version près de votre infrastructure-as-code ou de votre documentation d27exploitation. Exemple de tableau minimal et pratique :
| Champ | Exemple |
|---|---|
| redis_version | 7.2.x |
| topology | single primary with 1 replica |
| persistence | RDB désactivé en dev, AOF en prod |
| auth | ACL user "app" with allcommands -dangerous |
| endpoints | dev: localhost:6380, stage: redis-stage:6379, prod: redis-prod:6379 |
| client_libs | Node.js [email protected] |
| maxmemory_policy | allkeys-lru |
Chemin de configuration sûr
L27automatisation réussit quand le périmètre est petit, mesurable et facile à observer.
Chemin recommandé :
- Commencez par une instance dev mono-noeud pour itérer vite.
- Utilisez un Redis jetable pour valider la conf et les smoke tests.
- Coupez la persistance pour la vitesse en dev : --save "" --appendonly no.
- Staging reflète l27auth et la persistance de la prod.
- Reprenez les mêmes ACL et mode de persistance que la prod.
- Exécutez des smoke tests réalistes et un benchmark léger pour vérifier la marge.
- En production, appliquez un cutover par réplique.
- Ajoutez une réplique du primaire actuel.
- Validez la santé de la réplication et ne promevez que lorsque la réplique est synchro.
- Basculez les connexions applicatives via un enregistrement DNS ou un flag de configuration.
- Gardez la surface de changement étroite.
- Un seul paramètre par déploiement : ajustement de conf, version Redis, ou mise à jour du client, mais pas tout à la fois.
- Garde-fous explicites entre les étapes.
Vue minimale étapes/gardes :
| Étape | Garde-fou (doit être vrai) | Commande/contrôle d27exemple |
|---|---|---|
| Parse conf | Redis démarre avec la conf cible | redis-server /path/redis.conf --daemonize no |
| Auth | L27utilisateur app peut s27auth et exécuter | redis-cli -a "$REDIS_PASS" PING |
| Fonctionnel | Set/Get conformes aux attentes | redis-cli SET ci: key val; redis-cli GET ci: key |
| Persistance | AOF ou RDB opère comme prévu | redis-cli BGREWRITEAOF; vérif aof > 0 |
| Réplication | Réplique synchro, lag < seuil | redis-cli INFO replication |
Exemples CI/CD pratiques
Les exemples ci-dessous sont copiables et adaptables. Ils évitent Docker par défaut et supposent que redis-server et redis-cli sont disponibles sur le runner ou l27hôte.
Prérequis
- Installer les outils Redis sur le runner/agent.
- Debian/Ubuntu : sudo apt-get update && sudo apt-get install -y redis-tools redis-server
- macOS : brew install redis
- Stocker les secrets (mots de passe) dans le coffre de votre CI.
- Fournir les variables d27environnement pour endpoints et identifiants :
- REDIS_HOST, REDIS_PORT, REDIS_PASS
Exemple 1 : parse de conf locale et smoke test
Ce script démarre un Redis éphémère, valide des commandes basiques, puis nettoie.
#!/usr/bin/env bash
set -euo pipefail
PORT="6380"
TMP_DIR="$(mktemp -d)"
CONF="$TMP_DIR/redis.conf"
cat > "$CONF" <<'EOF'
port 6380
save ""
appendonly no
protected-mode no
EOF
# Démarrer Redis en arrière-plan pour échouer vite
redis-server "$CONF" --daemonize yes
# Attendre l27ouverture du port
for i in {1..20}; do
if redis-cli -p "$PORT" PING >/dev/null 2>&1; then break; fi
sleep 0.2
done
# Smoke test fonctionnel
redis-cli -p "$PORT" SET ci: hello world >/dev/null
VAL=$(redis-cli -p "$PORT" GET ci: hello)
if [[ "$VAL" != "world" ]]; then
echo "Unexpected value: $VAL" >&2
exit 1
fi
# Sanity latence
redis-cli -p "$PORT" --latency-history -i 0.1 -n 1 -c 5 >/dev/null || true
# Nettoyage
redis-cli -p "$PORT" SHUTDOWN NOSAVE || true
rm -rf "$TMP_DIR"
echo "OK: local config parse and smoke test passed"
Résultat attendu
- Le script sort avec le code 0 et affiche OK.
- Aucun processus Redis résiduel.
Exemple 2 : smoke test applicatif avec Node.js
Utilisez votre bibliothèque cliente pour tester l27auth et quelques commandes. Cela détecte plus tôt les erreurs ACL/protocole que des tests d27intégration complets.
// fichier: smoke-redis.js
const { createClient } = require('redis');
(async () => {
const client = createClient({
socket: { host: process.env.REDIS_HOST, port: Number(process.env.REDIS_PORT || 6379) },
password: process.env.REDIS_PASS
});
client.on('error', (err) => {
console.error('Client error', err);
process.exit(2);
});
await client.connect();
const who = await client.sendCommand(['ACL', 'WHOAMI']);
if (!who) throw new Error('ACL WHOAMI empty');
await client.set('ci: app: probe', '42', { EX: 30 });
const v = await client.get('ci: app: probe');
if (v !== '42') throw new Error('Unexpected value: ' + v);
await client.quit();
console.log('OK app smoke');
})().catch((e) => {
console.error(e);
process.exit(1);
});
Exécution :
export REDIS_HOST=redis-stage.example
export REDIS_PORT=6379
export REDIS_PASS='******'
node smoke-redis.js
Résultat attendu
- Affiche : OK app smoke
- Code de sortie 0
Exemple 3 : CI minimal avec gardes (GitHub Actions)
Ce pipeline valide la conf locale, lance un smoke test app contre le staging, puis effectue un contrôle de réplique en production avant tout cutover manuel.
name: redis-ci
on:
push:
branches: [ main ]
workflow_dispatch:
jobs:
config-parse:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Redis
run: sudo apt-get update && sudo apt-get install -y redis-tools redis-server
- name: Local config parse and smoke
run: |
bash ./scripts/redis-local-smoke.sh
stage-smoke:
needs: config-parse
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v4
- name: Install Node.js
uses: actions/setup-node@v4
with:
node-version: '20'
- name: Install Redis CLI
run: sudo apt-get update && sudo apt-get install -y redis-tools
- name: Install deps
run: npm ci
- name: Stage smoke
env:
REDIS_HOST: ${{ secrets.STAGE_REDIS_HOST }}
REDIS_PORT: ${{ secrets.STAGE_REDIS_PORT }}
REDIS_PASS: ${{ secrets.STAGE_REDIS_PASS }}
run: node smoke-redis.js
prod-replica-verify:
needs: stage-smoke
runs-on: ubuntu-latest
steps:
- name: Install Redis CLI
run: sudo apt-get update && sudo apt-get install -y redis-tools
- name: Check replication health
env:
REDIS_HOST: ${{ secrets.PROD_REPLICA_HOST }}
REDIS_PORT: ${{ secrets.PROD_REPLICA_PORT }}
REDIS_PASS: ${{ secrets.PROD_REDIS_PASS }}
run: |
role=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -a "$REDIS_PASS" INFO replication | awk -F: '/role:/{print $2}')
echo "role=$role"
[[ "$role" == slave || "$role" == replica || "$role" == replica\r ]] || { echo "Not a replica"; exit 1; }
lag=$(redis-cli -h "$REDIS_HOST" -p "$REDIS_PORT" -a "$REDIS_PASS" INFO replication | awk -F: '/master_link_status:/{print $2}')
echo "master_link_status=$lag"
[[ "$lag" =~ up ]] || { echo "Replication link down"; exit 1; }
Résultat attendu
- Le job échoue si la réplique n27est pas saine, bloquant toute poursuite.
- Le cutover final est réalisé séparément avec un changement contrôlé (voir ci-dessous).
Exemple 4 : cutover production sûr avec une réplique
Prérequis
- Vous avez un primaire courant P et une réplique R synchro.
- Les applications se connectent via un enregistrement DNS (ex. redis-prod.example) ou un flag de conf central modifiable atomiquement.
Étapes
- Geler brièvement les écritures à risque (optionnel selon la tolérance au risque).
- Valider que la réplique est synchro.
redis-cli -h R -a "$REDIS_PASS" INFO replication | egrep 'role|master_sync_in_progress|master_link_status|slave|replica'
Attendu : role: slave/replica, master_link_status: up, master_sync_in_progress:0.
- Promouvoir la réplique.
- Services managés : utilisez la commande fournisseur.
- Auto-géré avec Sentinel : déclenchez un failover Sentinel.
- Promotion manuelle sans Sentinel : arrêtez les écritures sur P, puis :
# Sur la réplique R
a) redis-cli -h R -a "$REDIS_PASS" SLAVEOF NO ONE
# ou sur versions récentes
a) redis-cli -h R -a "$REDIS_PASS" REPLICAOF NO ONE
- Basculer le trafic applicatif vers R.
- Mettez à jour le DNS ou la conf pour pointer vers R.
- Videz les pools de connexions clients afin de forcer la reconnexion.
- Conserver P en réplique du nouveau primaire pour un rollback rapide.
redis-cli -h P -a "$REDIS_PASS" REPLICAOF R <port>
- Observer erreurs, latence et réplication sur au moins un cycle métier complet.
Rollback
- En cas de problèmes, revenez au DNS/config précédent pointant vers P.
- Restaurez les rôles après analyse.
Vérifications et diagnostics
Avant et après chaque changement, vérifiez la santé avec des contrôles rapides et ciblés.
Connectivité et identité
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS PING
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS ACL WHOAMI
Attendu : PONG et l27utilisateur ACL prévu.
Lecture/écriture fonctionnelle
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS SET ci: probe 1 EX 60
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS GET ci: probe
Attendu : 1
État de réplication
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO replication | egrep 'role|slave|replica|master_link_status|master_sync_in_progress|slave_repl_offset|master_repl_offset'
Attendu : role: master sur le primaire, role: replica sur la réplique, lien up, in_progress:0, offsets proches.
Latence et opérations lentes
# Sonde de latence rapide
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS --latency -i 0.1 -n 1 -c 5
# Snapshot du slowlog
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS SLOWLOG LEN
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS SLOWLOG GET 10
Mémoire et posture d27éviction
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS INFO memory | egrep 'used_memory_human|maxmemory_human|maxmemory_policy'
Persistance (si activée)
# Vérifier AOF : forcer un rewrite et vérifier le fichier
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS BGREWRITEAOF
sleep 2
ls -lh $(redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS CONFIG GET appendfilename | tail -n1) || true
Vérification côté application
- Exercez un parcours représentatif impliquant le cache.
- Contrôlez le taux de hit du cache dans les logs/métriques si disponible.
Modes de panne et récupération
Conçoyez votre pipeline Redis CI/CD pour s27arrêter net en cas d27anomalie et proposer un rollback déterministe.
| Mode de panne | Signal de détection | Étape de récupération |
|---|---|---|
| Mauvaise conf | Redis refuse de démarrer; stderr directive inconnue | Échec tôt au parse local; corriger ou revert; stopper la suite |
| Auth/ACL incohérentes | PING échoue ou ERR unknown command via ACL | Ajuster ACL/droits; relancer le smoke avant déploiement |
| Lag ou lien cassé | master_link_status: down ou grand écart offsets | Mettre en pause; diagnostiquer réseau/charge; attendre la synchro |
| Pression mémoire/évictions | used_memory proche max; pics d27évictions | Augmenter mémoire, réduire dataset, ajuster policy/TTL; rollback si besoin |
| AOF/RDB mal configuré | BGREWRITEAOF échoue ou fichier absent | Restaurer la conf; valider en staging; réessayer |
| Régression de latence | --latency en hausse; timeouts app | Revenir au primaire précédent (DNS/config); analyser slowlog/clients |
| Commande risquée | SLOWLOG montre KEYS/SCAN abusifs | Revert; remplacer par patrons sûrs (index, SCAN limité) |
Playbooks de rollback et récupération
Un changement a atterri mais les signaux sont mauvais ? Faites d27abord un rollback, puis investiguez hors ligne. Conservez ces playbooks comme scripts dans votre dépôt.
Rollback 1 : bascule d27endpoint
# Rétablir le DNS ou la conf vers l27ancien endpoint
# Purger les connexions des pools pour forcer la reconnexion
Rollback 2 : restauration des rôles après promotion ratée
# Rendre l27ancien primaire P de nouveau primaire si R a été promu
redis-cli -h P -a "$REDIS_PASS" REPLICAOF NO ONE
# Repointer les apps vers P
# Refaire de R une réplique de P
redis-cli -h R -a "$REDIS_PASS" REPLICAOF P <port>
Rollback 3 : mauvaise conf poussée en prod
# Remplacer la conf par la dernière version saine
# Tenter une fenêtre de redémarrage sûr
redis-cli -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS CONFIG REWRITE || true
# Si redémarrage requis, coordonner un failover bref ou une fenêtre de maintenance
Validation du rollback
- Après tout rollback, relancez les vérifications et diagnostics.
- Confirmez le retour à la ligne de base des erreurs et de la latence.
Élargir le pilote pour gagner en confiance
Quand le pilote est vert sur plusieurs releases, élargissez par petites étapes :
- Ajoutez des smoke tests par motif de keyspace pour les préfixes critiques.
- Validez la restauration de sauvegarde en restaurant un petit dump dans une instance jetable puis des checks en lecture seule.
- Cadrez les directives risquées derrière des preuves en staging (par ex. politique d27éviction, client-output-buffer-limits).
- Intégrez une garde de performance légère avec redis-benchmark en staging, à faible volume, pour éviter les régressions :
redis-benchmark -h $REDIS_HOST -p $REDIS_PORT -a $REDIS_PASS -n 5000 -t get, set -q
- Ajoutez des alertes qui reflètent vos vérifications afin d27aligner CI et monitoring en production.
Checklist d27exploitation
Utilisez cette liste comme runbook répétable pour chaque changement Redis deployment.
Planification
- Identifier la variable unique du changement (conf, version ou client lib).
- Mettre à jour l27inventaire si un élément spécifique à l27environnement change.
- Écrire/mettre à jour les smoke tests pour couvrir le changement.
Pré-gardes de déploiement
- Parse conf local : Redis jetable démarre et répond à PING.
- Staging smoke : auth, SET/GET et sonde applicative passent.
- Persistance : AOF/RDB se comporte comme attendu en staging.
- Santé réplique : réplique prod lien up et lag quasi nul.
Cutover (le cas échéant)
- Geler les écritures à risque si nécessaire.
- Promouvoir la réplique via commande managée ou REPLICAOF NO ONE.
- Basculer DNS ou conf vers le nouveau primaire.
Post-déploiement
- Connectivité : PONG et ACL WHOAMI corrects.
- Fonctionnel : clés de sonde posées et lues.
- Réplication : répliques restantes saines et en phase.
- Latence et erreurs à la ligne de base (ou mieux) pendant un cycle clé.
Prêt pour rollback
- Ancien primaire disponible et apte à reprendre le trafic.
- Changement DNS/config réversible en quelques minutes.
- Scripts de bascule et vérification présents et testés.
Revue
- Documenter ce qui a changé et les signaux observés.
- Planifier la prochaine petite amélioration d27automatisation du Redis pipeline.
Conclusion
Automatiser Redis avec CI/CD paie quand vous gardez un périmètre étroit, des gardes explicites et des étapes observables et réversibles. Démarrez par un pilote que chacun peut exécuter en local et en staging. Validez la configuration en démarrant vraiment Redis, exercez les commandes critiques avec redis-cli et votre client app, et déployez en production via un cutover sûr par réplique avec une voie de Redis rollback rapide. Avec le temps, étendez l27automatisation par des contrôles ciblés et des gardes de performance, en conservant une seule variable par déploiement. Cette approche donne des changements Redis prévisibles sans ralentir la livraison.