Aller au contenu

Architecture CI/CD Multi-Environnements

Vue d'ensemble

ProbatioVault utilise une architecture Option C : Un runner par environnement pour garantir l'isolation complète entre les environnements DEV, TEST et PROD.

┌─────────────────────────────────────────────────────────────────────────────┐
│                              GitLab CI/CD                                    │
│                                                                              │
│  Branche DEV              Branche TEST              Branche MAIN            │
│  ┌──────────────┐         ┌──────────────┐         ┌──────────────┐         │
│  │ terraform:   │         │ terraform:   │         │ terraform:   │         │
│  │  plan:dev    │         │  plan:test   │         │  plan:prod   │         │
│  │  apply:dev   │         │  apply:test  │         │  apply:prod  │         │
│  │ ansible:     │         │ ansible:     │         │ ansible:     │         │
│  │  check:dev   │         │  check:test  │         │  check:prod  │         │
│  │  deploy:dev  │         │  deploy:test │         │  deploy:prod │         │
│  │  keycloak:dev│         │  keycloak:   │         │  keycloak:   │         │
│  └──────┬───────┘         │   test       │         │   prod       │         │
│         │                 └──────┬───────┘         └──────┬───────┘         │
└─────────│───────────────────────│───────────────────────│───────────────────┘
          │                       │                       │
          │ ovh-shell-dev         │ ovh-shell-test        │ ovh-shell-prod
          ▼                       ▼                       ▼
┌─────────────────┐     ┌─────────────────┐     ┌─────────────────┐
│   VPS DEV       │     │   VPS TEST      │     │   VPS PROD      │
│                 │     │                 │     │                 │
│ GitLab Runner   │     │ GitLab Runner   │     │ GitLab Runner   │
│ HashiCorp Vault │     │ HashiCorp Vault │     │ HashiCorp Vault │
│ Application     │     │ Application     │     │ Application     │
└─────────────────┘     └─────────────────┘     └─────────────────┘

Environnements

Environnement Branche Git Runner Tag Vault URL VPS
DEV dev ovh-shell-dev vault.dev.probatiovault.com 51.68.126.160
TEST test ovh-shell-test vault.test.probatiovault.com (à créer)
PROD main ovh-shell-prod vault.probatiovault.com (à créer)

Jobs CI/CD par environnement

Stage Terraform

Job Environnement Déclenchement Action
terraform:plan:dev DEV Auto (branche dev) Plan infrastructure
terraform:apply:dev DEV Manuel Applique les changements
terraform:plan:test TEST Auto (branche test) Plan infrastructure
terraform:apply:test TEST Manuel Applique les changements
terraform:plan:prod PROD Auto (branche main) Plan infrastructure
terraform:apply:prod PROD Manuel Applique les changements

Stage Ansible

Job Environnement Déclenchement Action
ansible:check:dev DEV Auto Dry-run (--check)
ansible:deploy:dev DEV Manuel Déploiement complet
ansible:keycloak:dev DEV Manuel Déploiement Keycloak uniquement
ansible:check:test TEST Auto Dry-run (--check)
ansible:deploy:test TEST Manuel Déploiement complet
ansible:keycloak:test TEST Manuel Déploiement Keycloak uniquement
ansible:check:prod PROD Auto Dry-run (--check)
ansible:deploy:prod PROD Manuel Déploiement complet
ansible:keycloak:prod PROD Manuel Déploiement Keycloak uniquement

Gestion des secrets

Architecture

Chaque environnement dispose de son propre HashiCorp Vault. Les runners GitLab accèdent à leur Vault local via le token stocké dans /root/.vault-token.

┌─────────────────────────────────────────────────────────────┐
│                    VPS (par environnement)                  │
│                                                             │
│  ┌─────────────────┐    ┌─────────────────────────────┐    │
│  │  GitLab Runner  │    │    HashiCorp Vault Server   │    │
│  │                 │───▶│                             │    │
│  │  Exécute jobs   │    │  Secrets:                   │    │
│  │  Terraform/     │    │  - kv/app/aws-storage       │    │
│  │  Ansible        │    │  - kv/ovh/api-credentials   │    │
│  └─────────────────┘    │  - kv/ansible/vault         │    │
│         │               └─────────────────────────────┘    │
│         │                         ▲                         │
│         │    /root/.vault-token   │                         │
│         └─────────────────────────┘                         │
└─────────────────────────────────────────────────────────────┘

Secrets requis dans Vault

Chemin Clés Usage
kv/app/aws-storage access_key_id, secret_access_key, region Terraform AWS (S3/Glacier)
kv/ovh/api-credentials application_key, application_secret, consumer_key, endpoint Terraform OVH (DNS)
kv/ansible/vault password Ansible Vault password

Initialisation des secrets

# Sur chaque VPS, après installation de Vault
export VAULT_ADDR="https://vault.{env}.probatiovault.com"
export VAULT_TOKEN="$(cat /root/.vault-token)"

# AWS credentials
vault kv put kv/app/aws-storage \
  access_key_id="AKIA..." \
  secret_access_key="..." \
  region="eu-west-3"

# OVH credentials
vault kv put kv/ovh/api-credentials \
  application_key="..." \
  application_secret="..." \
  consumer_key="..." \
  endpoint="ovh-eu"

# Ansible Vault password
vault kv put kv/ansible/vault \
  password="..."

Configuration des runners

Tags GitLab Runner

Shell Runners (pour Terraform, Ansible) :

Tag VPS Usage
ovh-shell-dev DEV Jobs Terraform/Ansible DEV
ovh-shell-test TEST Jobs Terraform/Ansible TEST
ovh-shell-prod PROD Jobs Terraform/Ansible PROD

Docker Runners (pour builds, SonarQube) :

Tag VPS Usage
ovh-docker-dev DEV Jobs Docker DEV (SonarQube, builds)
ovh-docker-test TEST Jobs Docker TEST
ovh-docker-prod PROD Jobs Docker PROD

Runners spéciaux :

Tag VPS Usage
ovh-internet Dédié Tests réseau externes (hors VPS principal)

Enregistrement d'un nouveau runner

# 1. Installer gitlab-runner sur le VPS
curl -L https://packages.gitlab.com/install/repositories/runner/gitlab-runner/script.deb.sh | sudo bash
sudo apt-get install gitlab-runner

# 2. Enregistrer le runner avec le bon tag
sudo gitlab-runner register \
  --url https://gitlab.com/ \
  --token glrt-... \
  --executor shell \
  --tag-list "ovh-shell-{env}" \
  --description "ProbatioVault {ENV} Runner"

# 3. Configurer les permissions
sudo usermod -aG docker gitlab-runner
sudo usermod -aG sudo gitlab-runner

Flux de déploiement

Déploiement standard

1. Push sur branche dev/test/main
2. terraform:plan:{env} (automatique)
   - Récupère credentials depuis Vault
   - Génère le plan Terraform
3. terraform:apply:{env} (manuel)
   - Applique les changements infrastructure
4. ansible:check:{env} (automatique)
   - Dry-run de la configuration
5. ansible:deploy:{env} (manuel)
   - Applique la configuration Ansible

Déploiement Keycloak uniquement

# Via GitLab UI ou API
# Déclencher manuellement ansible:keycloak:{env}

Fichiers de configuration

Terraform

Fichier Environnement Contenu
terraform/environments/dev.tfvars DEV Configuration VPS dev (tracké)
terraform/environments/test.tfvars TEST Configuration VPS test (tracké)
terraform/environments/prod.tfvars PROD Configuration VPS prod (gitignored)

Ansible

Fichier Environnement Contenu
ansible/inventory/dev/hosts.ini DEV Inventaire hosts dev
ansible/inventory/test/hosts.ini TEST Inventaire hosts test
ansible/inventory/prod/hosts.ini PROD Inventaire hosts prod

Sécurité

Isolation des environnements

  • Réseau : Chaque VPS est isolé sur son propre réseau
  • Secrets : Chaque Vault contient uniquement les secrets de son environnement
  • Runners : Les runners ne peuvent accéder qu'à leur VPS local
  • Branches protégées : main et test sont des branches protégées

Accès aux jobs manuels

Job Qui peut déclencher
terraform:apply:dev Développeurs
terraform:apply:test Développeurs, QA
terraform:apply:prod Ops, Admin
ansible:deploy:prod Ops, Admin

Troubleshooting

Le runner ne trouve pas Vault

# Vérifier le token Vault
sudo cat /root/.vault-token

# Vérifier la connexion Vault
export VAULT_ADDR="https://vault.{env}.probatiovault.com"
export VAULT_TOKEN="$(sudo cat /root/.vault-token)"
vault status

Credentials manquants

# Lister les secrets disponibles
vault kv list kv/

# Vérifier un secret spécifique
vault kv get kv/app/aws-storage
vault kv get kv/ovh/api-credentials

Job bloqué "pending"

# Vérifier que le runner avec le bon tag est actif
# GitLab > Settings > CI/CD > Runners

# Vérifier le statut du runner sur le VPS
sudo gitlab-runner status
sudo gitlab-runner verify

Références