Aller au contenu

Pipeline GitLab CI/CD

Vue d'ensemble

Le pipeline GitLab automatise le déploiement de tous les services du serveur IA via Ansible.

Workflow : Code local → GitLab → CI/CD → Serveur IA (192.168.1.82)

Architecture du pipeline

Stages

┌──────────────┐
│  1. Validate │  → Syntaxe Terraform/Ansible
├──────────────┤
│  2. Plan     │  → Terraform plan
├──────────────┤
│  3. Apply    │  → Déploiement services (manuel)
├──────────────┤
│  4. Test     │  → Tests post-déploiement
└──────────────┘

Jobs disponibles (Stage Apply)

Job Description Déclenchement URL
ansible:install-ollama Déploie Ollama + modèles LLM Manuel http://192.168.1.82:11434
ansible:install-plex Déploie Plex + montage NAS Manuel http://192.168.1.82:32400/web
ansible:install-homer Déploie Homer Dashboard Manuel http://192.168.1.82:8080
ansible:install-mkdocs Déploie MkDocs docs Manuel http://192.168.1.82:8000

Tous les jobs sont manuels pour éviter les déploiements accidentels.

Configuration requise

1. GitLab Runner

Le runner doit être enregistré sur le serveur IA avec les tags : - ia-server - shell

Vérification :

ssh ProbatioVault-IA-Server
sudo gitlab-runner list

2. Variables CI/CD

Variable requise pour Plex :

  • Nom : ANSIBLE_VAULT_PASSWORD
  • Valeur : YsepMjCo/T1y2M79RsZYW52CWNDW+k3PL98WFu+7Jb4=
  • Type : Masked
  • Protected : ✅ (seulement sur branche main)

Configuration :

  1. GitLab → Settings → CI/CD → Variables
  2. Add variable :
  3. Key: ANSIBLE_VAULT_PASSWORD
  4. Value: (copier le mot de passe vault)
  5. Type: Variable
  6. Flags: ☑️ Mask variable, ☑️ Protect variable

3. Fichier vault.yml sur le serveur

Le fichier ansible/vault.yml doit être présent sur le serveur (protégé par .gitignore).

Copie initiale :

# Depuis votre machine locale
scp /Users/loic/Developpement/ProbatioVault/ProbatioVault-IA-Server/ansible/vault.yml \
  ProbatioVault-IA-Server:/opt/probatiovault-ia-server/ansible/vault.yml

Vérification :

ssh ProbatioVault-IA-Server
ls -la /opt/probatiovault-ia-server/ansible/vault.yml

Utilisation du pipeline

Workflow standard

  1. Modifier un playbook en local :
vim ansible/playbooks/install-homer.yml
  1. Commit et push :
git add ansible/playbooks/install-homer.yml
git commit -m "feat(homer): add new service to dashboard"
git push origin main
  1. Accéder au pipeline GitLab :

Aller sur : https://gitlab.com/probatiovault/probatiovault-ia-server/-/pipelines

  1. Approuver le job manuel :

  2. Cliquer sur le pipeline créé

  3. Onglet "Jobs"
  4. Cliquer sur le bouton ▶️ du job souhaité (ex: ansible:install-homer)
  5. Confirmer le déploiement

  6. Suivre les logs :

Les logs s'affichent en temps réel dans l'interface GitLab.

  1. Vérifier le déploiement :

Accéder à l'URL du service (ex: http://192.168.1.82:8080)

Déploiement initial (tous les services)

Pour déployer tous les services d'un coup :

Via jobs manuels (recommandé pour contrôle fin) :

  1. Lancer ansible:install-ollama → Attendre fin
  2. Lancer ansible:install-plex → Attendre fin
  3. Lancer ansible:install-homer → Attendre fin
  4. Lancer ansible:install-mkdocs → Attendre fin

Via SSH (pour tests locaux) :

ssh ProbatioVault-IA-Server
cd /opt/probatiovault-ia-server

# Déployer tous les services
for playbook in ansible/playbooks/install-*.yml; do
  echo "Deploying $playbook..."
  ansible-playbook -i ansible/inventory/hosts "$playbook"
done

Environnements GitLab

Chaque job déploie dans un environnement GitLab :

  • production/ollama → http://192.168.1.82:11434
  • production/plex → http://192.168.1.82:32400/web
  • production/homer → http://192.168.1.82:8080
  • production/mkdocs → http://192.168.1.82:8000

Avantage : Historique des déploiements dans GitLab → Deployments

Troubleshooting

Job échoue : "vault.yml not found"

Cause : Le fichier ansible/vault.yml n'est pas sur le serveur.

Solution :

scp ansible/vault.yml ProbatioVault-IA-Server:/opt/probatiovault-ia-server/ansible/

Job échoue : "Decryption failed"

Cause : Mauvais mot de passe vault dans ANSIBLE_VAULT_PASSWORD.

Solution :

  1. Vérifier le mot de passe vault localement :
cat ansible/vault.yml  # Doit afficher $ANSIBLE_VAULT;1.1;AES256
echo "YsepMjCo/T1y2M79RsZYW52CWNDW+k3PL98WFu+7Jb4=" > /tmp/vault-pass
ansible-vault view ansible/vault.yml --vault-password-file /tmp/vault-pass
rm /tmp/vault-pass
  1. Mettre à jour la variable CI/CD dans GitLab avec le bon mot de passe.

Runner non disponible

Cause : Le runner GitLab n'est pas démarré sur le serveur.

Solution :

ssh ProbatioVault-IA-Server
sudo gitlab-runner status
sudo gitlab-runner start  # Si arrêté

Job bloqué en "pending"

Cause : Aucun runner avec les tags ia-server + shell.

Solution :

  1. Vérifier les runners disponibles :

GitLab → Settings → CI/CD → Runners

  1. Vérifier que le runner du serveur IA est bien enregistré et actif.

Playbook échoue sur une tâche

Cause : Erreur dans le playbook Ansible.

Solution :

  1. Lire les logs du job dans GitLab pour identifier la tâche en échec.

  2. Tester localement en SSH :

ssh ProbatioVault-IA-Server
cd /opt/probatiovault-ia-server
ansible-playbook -i ansible/inventory/hosts ansible/playbooks/install-xxx.yml -vvv
  1. Corriger le playbook en local, commit, push, relancer le job.

Bonnes pratiques

1. Toujours tester la syntaxe avant de commit

ansible-playbook ansible/playbooks/install-xxx.yml --syntax-check -i ansible/inventory/hosts

2. Utiliser des commits atomiques

Un playbook = un commit = un job isolé

git add ansible/playbooks/install-homer.yml
git commit -m "feat(homer): add monitoring service to dashboard"
git push

3. Surveiller les logs en temps réel

Ne pas fermer l'onglet GitLab pendant le déploiement pour suivre les logs.

4. Rollback en cas d'échec

ssh ProbatioVault-IA-Server
cd /opt/probatiovault-ia-server
git log --oneline  # Trouver le dernier commit stable
git checkout <commit-stable>
ansible-playbook -i ansible/inventory/hosts ansible/playbooks/install-xxx.yml
git checkout main

5. Documenter les changements

Chaque modification de playbook doit être documentée dans le commit message :

git commit -m "feat(plex): add transcoding GPU support

- Enable hardware transcoding on RTX 5090
- Update Plex preferences template
- Tested with 4K HDR content"

Limitations

Jobs manuels uniquement

Tous les jobs de déploiement sont manuels pour éviter :

  • Déploiements accidentels sur push
  • Conflits si plusieurs MR simultanées
  • Déploiements non testés en production

Avantage : Contrôle total sur quand déployer.

Un seul environnement (production)

Pas de staging/dev pour le moment (serveur unique).

Évolution future : Ajouter un environnement de test virtuel (VM locale).

Évolutions futures

1. Tests automatisés post-déploiement

Ajouter des jobs de test après chaque déploiement :

test:plex:
  stage: test
  script:
    - curl -f http://192.168.1.82:32400/web || exit 1
  dependencies:
    - ansible:install-plex

2. Notifications Slack/Email

Alertes en cas d'échec de déploiement.

3. Rollback automatique

Si les tests échouent, rollback automatique vers la version précédente.

4. Environnement de staging

VM de test pour valider avant production.

Résumé

Pipeline configuré : 4 jobs de déploiement (Ollama, Plex, Homer, MkDocs) ✅ Approbation manuelle : Contrôle total sur les déploiements ✅ Environnements GitLab : Historique des déploiements ✅ Secrets sécurisés : Vault password via variable CI/CD masquée ✅ IaC complet : Tout est versionné et reproductible

Point d'entrée : https://gitlab.com/probatiovault/probatiovault-ia-server/-/pipelines